关于devops系统的搭建

发布时间 2023-10-18 15:06:31作者: 生活的样子就该是那样

1.Docker的安装

1.下载Docker依赖组件

yum -y install yum-utils de2023-09-12 13:54:03 星期二vice-mapper-persistent-data lvm2

2.设置下载Docker的镜像源为阿里云

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3.安装Docker服务

yum -y install docker-ce

4.设置docker开机自启

# 启动Docker服务
systemctl start docker
# 设置开机自动启动
systemctl enable docker

5.测试安装成功

docker version

6.docker-compose安装
下载Docker/Compose:https://github.com/docker/compose

将下载好的docker-compose-Linux-x86_64文件移动到Linux操作系统:……

设置docker-compose-Linux-x86_64文件权限,并移动到$PATH目录中

# 设置文件权限
chmod a+x docker-compose-Linux-x86_64
# 移动到/usr/bin目录下,并重命名为docker-compose
mv docker-compose-Linux-x86_64 /usr/bin/docker-compose

2.git以及gitlab安装

1.git 安装 yum install git
2.安装gitlab

# 查看镜像
docker search gitlab

# 拉取镜像
docker pull gitlab/gitlab-ce

3.docker-compose 启动 gitlab
3.1准备docker-compose.yml文件
放到自己指定文件夹下

version: '3.1'
services:
  gitlab:
    image: 'gitlab/gitlab-ce:latest'
    container_name: gitlab
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://192.168.11.11:8929'//写自己的ip
        gitlab_rails['gitlab_shell_ssh_port'] = 2224
    ports:
      - '8929:8929'
      - '2224:2224'
    volumes:
      - './config:/etc/gitlab'
      - './logs:/var/log/gitlab'
      - './data:/var/opt/gitlab'

3.2启动容器
在指定文件夹下:

# 启动容器
docker-compose up -d

访问http://192.168.11.11:8929
效果:
image
4.查看初始的用户的用户名和密码

docker exec -it gitlab cat /etc/gitlab/initial_root_password

5.登录并修改密码
用户名为:root 密码为上一步查询到的密码
image
image

3.Jenkins

3.1安装

1.拉取镜像

docker pull jenkins/jenkins

2.编写对应的docker-compose.yml

version: "3.1"
services:
  jenkins:
    image: jenkins/jenkins
    container_name: jenkins
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - ./data/:/var/jenkins_home/

3.设置数据卷data目录的权限,否则会包没有对应权限

chmod -R a+w data/

4.设置Jenkins的下载地址
重新启动Jenkins容器后,由于Jenkins需要下载大量内容,但是由于默认下载地址下载速度较慢,需要重新设置下载地址为国内镜像站
复制一段即可。

# 修改数据卷中的hudson.model.UpdateCenter.xml文件
<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>https://updates.jenkins.io/update-center.json</url>
  </site>
</sites>
# 将下载地址替换为http://mirror.esuni.jp/jenkins/updates/update-center.json
<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>http://mirror.esuni.jp/jenkins/updates/update-center.json</url>
  </site>
</sites>
# 清华大学的插件源也可以https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json 建议这个

5.再次重启Jenkins容器,访问JenKins
6.查看JenKins登录密码,并登录JenKins然后安装对应插件

docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword

输入管理员密码 - 选择插件来安装 - 选择对应的插件进行安装
推荐安装:
①Git Parameter
②Publish Over SSH
直接搜索即可
然后等待插件安装成功进入首页。(可能会出现下载失败的插件,重新下载即可)
7.创建管理员用户,设置Jenkins URL
image

3.2使用

准备好GitLab仓库中的项目,并且通过Jenkins配置实现当前项目的DevOps流程。(Idea创建之后推送到远程即可)
1.构建Maven工程发布到GitlLab、Gitee、GitHub均可

2.点击Jenkins左侧新建任务(选择自由风格的项目)

3.配置源码拉取地址
image
4.构建项目,点击立即构建,在构建历史中,点击标题,可以查看控制输出来确定是否构建成功。

5.配置Maven构建代码
准备jdk,maven压缩包
jdk:https://www.oracle.com/cn/java/technologies/downloads/#java8-linux
maven:https://maven.apache.org/download.cgi
解压压缩包,在maven的setting.xml中配置

<!-- 阿里云镜像地址 -->
<mirror>  
    <id>alimaven</id>  
    <name>aliyun maven</name>  
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>          
</mirror>
<!-- JDK1.8编译插件 -->
<profile>
    <id>jdk-1.8</id>
    <activation>
        <activeByDefault>true</activeByDefault>
        <jdk>1.8</jdk>
    </activation>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
    </properties>        
</profile>

Jenkins配置JDK&Maven并保存
在之前的docker-compose中更改 docker-compose.yml文件
image
将jdk、maven,通过数据卷映射到Jenkins容器内部
配置完成后需要用 docker-compose up -d 重新加载容器
可进入容器内部验证是否映射进容器中

docker exec -it jenkins bash

在Jenkins中对jdk和maven进行配置
image
6.配置Jenkins任务构建代码
image
image
image
7.配置完后点立即构建,查看控制台输出
可在此处查看构建成功的jar包
image
构建成功:
image
成功后便可以进行发布测试
8.此处需要Publish Over SSH(如果未安装,可在插件管理中进行安装)
配置Publish Over SSH
配置Publish Over SSH连接测试环境、生产环境
image
配置完成后对任务进行配置
image
image
再次进行构建:
image
显示如上信息,在服务器中看到文件,便表示构建成功,如果出现transfer 0 可能由于权限导致,进入服务器更改权限即可chomd r+w -R 目录

7.CI/CD操作
基于Jenkins拉取GitLab的SpringBoot代码进行构建发布到测试环境实现持续集成
基于Jenkins拉取GitLab指定发行版本的SpringBoot进行构建发布到生产环境实现CD(持续部署)

为了让程序代码可以自动推送到测试环境基于Docker服务运行,需要添加Docker配置和脚本文件让程序可以在集成到主干的同时运行起来。

7.1 持续集成
7.1.1 添加Dockerfile文件

FROM adoptopenjdk/openjdk8
COPY helloWorld.jar /usr/local
WORKDIR /usr/local
CMD java -jar helloWorld.jar

7.1.2 添加docker-compose.yml文件

version: '3.1'
services:
  helloworld:
    build: ./
    image: helloWorld:v1.0.0
    container_name: demo
    ports:
      - 8888:8080 #把docker中的8080端口映射到主机的8888端口

为了防止各种奇奇怪怪的问题,一下两个配置尽量打开:
image
image
同时需要给你连接的用户增加docker权限。
7.1.3 追加Jenkins构建后操作脚本命令
image

3.3 持续交付/部署

程序代码在经过多次集成操作到达最终可以交付,持续交付整体流程和持续集成类似,不过需要选取指定的发行版本
1.在Jenkins中下载Git Parameter插件
image
2.在任务中进行配置(Gerneral/参数化构建过程/选择Git参数)
image
3.在gitLab上给项目添加tag版本
image
4.任务构建时,采用Shell方式构建,拉取指定tag版本
image

4.Sonar Qube

4.1 Sonar Qube介绍与按照

Sonar Qube是一个开源的代码分析平台,支持Java、Python、PHP、JavaScript、CSS等25种以上的语言,可以检测出重复代码、代码漏洞、代码规范和安全性漏洞的问题。

Sonar Qube可以与多种软件整合进行代码扫描,比如:Maven、Gradle、Git、Jenkins等,并且会将代码检测结果推送回Sonar Qube,进而在系统提供的UI界面上显示出来

安装过程:Sonar Qube在7.9版本中已经放弃了对MySQL的支持,并且建议在商业环境中采用PostgreSQL,那么安装Sonar Qube时需要依赖PostgreSQL。

1.拉取PostgreSQL 镜像

docker pull postgres
docker pull sonarqube:8.9.3-community

2.编写docker-compose.yml

version: "3.1"
services:
  db:
    image: postgres
    container_name: db
    ports:
      - 5432:5432
    networks:
      - sonarnet
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
  sonarqube:
    image: sonarqube:8.9.3-community
    container_name: sonarqube
    depends_on:
      - db
    ports:
      - "9000:9000"
    networks:
      - sonarnet
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
networks:
  sonarnet:
    driver: bridge

3.设置sysctl.conf文件信息,并启动容器

vi /etc/sysctl.conf

设置vm.max_map_count=262411,至少是这个数

#执行命令进行刷新
sysctl -p
#启动容器
docker-compose up -d

重新启动需要一定时间,可以查看容器日志,如果看到如下内容代表启动成功
image

4.访问Sonar Qube首页
默认用户名和密码为admin
image
修改密码进入页面如图
image
安装中文插件
image
image
安装成功重启即可

4.2sonarQube基本使用(windows maven)

整合Maven实现代码检测:
修改本地Maven的setting.xml文件,配置Sonar Qube信息

<profile>
    <id>sonar</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <sonar.login>admin</sonar.login>
        <sonar.password>123456789</sonar.password>
        <sonar.host.url>http://192.168.11.11:9000</sonar.host.url>
    </properties>
</profile>

在代码所在位置的cmd执行命令mvn sonar:sonar
便可以在页面中看到分析结果
image

4.3sonarQube基本使用(linux)

1.下载对应版本Sonar-scanner: https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/
2.解压

# 安装uzip解压插件
yum -y install unzip
# 解压压缩包
unzip sonar-scanner-cli/

3.配置sonarQube服务端地址,修改conf下的sonar-scanner.properties

#Configure here general information about the environment, such as SonarQube server connection details for example
#No information about specific project should appear here
sonar.login=admin

sonar.password=123456
#----- Default SonarQube server
sonar.host.url=http://localhost:9000

#----- Default source code encoding
sonar.sourceEncoding=UTF-8

4.在代码目录下执行命令检测代码(需要有源代码)

# 在项目所在目录执行以下命令
~/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=demo -Dsonar.projectKey=java -Dsonar.java.binaries=target/

4.4Jenkins集成Sonar Qube

Jenkins集成Sonar Qube实现代码扫描需要下载整合插件
1.安装SonarQube Scanner插件
image
2.在SonarQube中开启Sonar Qube的权限验证
image
在Sonar Qube中生成一个令牌,获取Sonar Qube的令牌
image
复制后在Jenkins中配置Sonar Qube信息
image
点击全局:
image
image
点击create
image
在Jenkins中的全局工具配置中配置SonarQube Scanner
将Sonar-scanner添加到Jenkins数据卷中并全局配置
配置任务的Sonar-canner
image
image

5.Harbor(镜像仓库)

前面我们在部署时,主要流程如下:

Jenkins推送jar包到服务器
通过脚本命令让目标服务器对当前jar进行部署
但是这种方式在项目比较多的时候,每个服务器都需要将jar包制作成自定义镜像,然后再通过docker进行启动,重复操作较多,降低部署效率。

Harbor:私有的Docker镜像仓库。我们可以让Jenkins统一将项目打包并制作成Docker镜像发布到Harbor仓库中。然后我们只需要通知目标服务,让目标服务统一去Harbor仓库上拉取镜像并在本地部署即可。

1.安装(通过原生的方式安装)

1.下载Harbor安装包
https://github.com/goharbor/harbor/releases/download/v2.3.4/harbor-offline-installer-v2.3.4.tgz

2.传送到linux上并解压

# 通过xftp或其他方式将压缩包传送到linux上
# 解压
tar -zxvf harbor-offline-installer-v2.3.4.tgz -C /usr/local/

3.修改Harbor配置文件
设置harbor地址,注释https,查看密码

# 备份原有配置
cp harbor.yml.tmpl harbor.yml

4.启动Harbor并登录Harbor

# 启动Harbor
./install.sh

image

2.基础使用

Harbor作为镜像仓库,主要的交互方式就是将镜像上传到Harbor,以及从Harbor上下载拉取指定版本的镜像。
在传输镜像前,可以先使用Harbor提供的权限管理,将项目设置为私有项目,并对不同用户设置不同角色,从而更方便管理镜像。

2.1添加用户构建项目

创建用户
image
构建项目
image
点击进入项目,给项目增加成员
image

2.2发布镜像到Harbor

1.修改镜像名称

docker tag helloworld:v1.0.0 192.168.1.105:90/repository/helloworld:v1.0.0

2.修改daemon.json,支持Docker仓库,并重启Docker

vi /etc/docker/daemon.json

添加如下内容

{
        "registry-mirrors": ["https://pee6w651.mirror.aliyuncs.com"],
        "insecure-registries": ["192.168.1.105:80"]
}

重启dockersystemctl restart docker
3.设置登录仓库信息

docker login 192.168.1.105:80

输入用户名,密码即可(端口号不能省略)
4.推送镜像到Harbor

docker push 192.168.1.105:80/repository/helloworld:v1.0.0

image

2.3拉取镜像

docker pull 192.168.1.105:80/repository/helloworld:v1.0.0

扩展

Jenkins容器使用宿主机Docker并编写构建脚本
构建镜像和发布镜像到harbor都需要使用到docker命令。而在Jenkins容器内部安装Docker官方推荐直接采用宿主机带的Docker即可。
1.设置宿主机docker.sock权限

sudo chown root:root /var/run/docker.sock
sudo chmod o+rw /var/run/docker.sock

2.添加数据卷

version: "3.1"
services:
  jenkins:
    image: jenkins/jenkins
    container_name: jenkins
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - ./data/:/var/jenkins_home/
      - /data/docker/jdk1.8.0_381/:/var/java/
      - /data/docker/apache-maven-3.9.4/:/var/maven/
      - /usr/bin/docker:usr/bin/docker
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/docker/daemon.json:/etc/docker/daemon.json
    user: root

3.编写构建脚本
部署项目需要通过Publish Over SSH插件,让目标服务器执行命令。为了方便一次性实现拉取镜像和启动的命令,推荐采用脚本文件的方式。
添加脚本文件到目标服务器,再通过Publish Over SSH插件让目标服务器执行脚本即可。
编写脚本文件,添加到目标服务器:
deploy.sh:

harbor_url=$1
harbor_project_name=$2
project_name=$3
tag=$4
port=$5

imageName=$harbor_url/$harbor_project_name/$project_name:$tag

containerId=`docker ps -a | grep ${project_name} | awk '{print $1}'`
if [ "$containerId" != "" ] ; then
    docker stop $containerId
    docker rm $containerId
    echo "Delete Container Success"
fi

imageId=`docker images | grep ${project_name} | awk '{print $3}'`

if [ "$imageId" != "" ] ; then
    docker rmi -f $imageId
    echo "Delete Image Success"
fi

docker login -u DevOps -p P@ssw0rd $harbor_url

docker pull $imageName

docker run -d -p $port:$port --name $project_name $imageName

echo "Start Container Success"
echo $project_name

4.设置脚本权限

chmod a+x deploy.sh

配置构建后操作