Jenkins&CICD

1.环境规划及Devops介绍

1.1环境规划

IP、系统 角色
11.0.1.202 ubuntu 18 gitlab、开发代码
11.0.1.201 centos7.6 master Harbor
11.0.1.199 centos7.6 master3 业务
11.0.1.198 centos7.6 master2 jenkins Sonar

1.2Devops介绍

Devops是一种方法论,用于提高开发人员和运维人员的合作效率,以实现更快、更稳定、更可靠的软件发布,通过自动化流程和技术来提高效率,强调团队合作,通过紧密的写作来提高软件质量

各个阶段

  • PLAN:开发团队根据需求定制计划
  • CODE:开发人员进行编码
  • BUILD:对编码进行构建运行
  • TEST:测试代码是否有bug
  • DEPLOY:测试没问题且准备部署交给运维团队
  • OPERATE:运维团队进行部署
  • MONITOR:对新版本进行监控
  • INTERGRATE:将监控的收到的反馈发送回PLAN阶段

img

2.环境搭建

2.1GitLab

2.1.1安装git

sudo apt-get install -y git

2.1.2安装GitLab

采用Docker进行部署

##拉取镜像
sudo docker pull gitlab/gitlab-ce
  • 安装docker-compose

下载Docker/Compose:https://github.com/docker/compose

#下载docker-compose,上传到虚拟机,增加执行权限
sudo chmod a+x docker-compose-Linux-x86_64
# 移动到/usr/bin⽬录下,并重命名为docker-compose
sudo mv docker-compose-Linux-x86_64 /usr/bin/docker-compose
  • 准备yaml文件
version: '3.1'
services:
 gitlab:
   image: 'gitlab/gitlab-ce:latest'
   container_name: gitlab
   restart: always
   environment:
     GITLAB_OMNIBUS_CONFIG: |
       external_url 'http://11.0.1.202:8929'
       gitlab_rails['gitlab_shell_ssh_port'] = 2224
   ports:
   - '8929:8929'
   - '2224:2224'
   volumes:
   - './config:/etc/gitlab'
   - './logs:/var/log/gitlab'
   - './data:/var/opt/gitlab'

  • 查看初始密码

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

用户:root

  • 登录gitlab

image-20230516011417728

  • 修改密码

2.2Jenkins安装

  • 安装docker和docker-compose

2.2.1部署Jenkins

docker pull jenkins/jenkins:2.396-centos7

  • 准备yaml文件
version: "3.1"
services:
 jenkins:
   image: jenkins/jenkins:2.396-centos7
   container_name: jenkins
   ports:
   - 8080:8080
   - 50000:50000
   volumes:
   - /docker_data/data/:/var/jenkins_home/

  • 配置卷的目录权限
[root@master2 ~]# mkdir /docker_data/data -p
[root@master2 ~]# chmod -R a+w /docker_data/data/
  • 运行Jenkins

docker-compose -f Jenkins.yml up -d

  • 设置下载地址为国内镜像站
# 修改数据卷中的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>
# 将下载地址替换为
 <url>http://mirror.esuni.jp/jenkins/updates/update-center.json</url>
# 清华⼤学的插件源也可以http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
  • 重启Jenkins

  • 查看密码登录Jenkins,并登录下载插件

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

image-20230516131159806

2.2.2配置JDK环境

  • Jenkins构建代码需要使用Maven,Maven需要jdk环境
##上传jdk、Maven通过数据卷映射到Jenkins容器内部
  • 解压重命名
[root@master2 data]# tar -xf apache-maven-3.6.3-bin.tar.gz
[root@master2 data]# tar -xf jdk-8u231-linux-x64.tar.gz
[root@master2 data]# mv apache-maven-3.6.3 maven
[root@master2 data]# mv jdk1.8.0_231 jdk
  • 配置Maven
    <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

image-20230516133000755

image-20230516133011172

3.使用Jenkins

3.1上传代码

  • gitlab创建项目

image-20230516140235985

  • clone并上传代码
sudo git clone http://11.0.1.202:8929/root/test.git
###将代码拷贝到本地
sudo cp -r ./main/java/ ../../test/
##上传代码到gitlab
sudo git add .
sudo git commit -m "test"
sudo git push  -uf origin main

3.2Jenkins构建任务

准备好GitLab仓库中的项⽬,并且通过Jenkins配置项⽬的实现当前项⽬的DevOps基本流程

3.2.1创建任务

创建自由风格的构建任务

image-20230516140914561

3.2.2配置源码拉取地址

Jenkins需要将Git上存放的源码存储到Jenkins服务所在磁盘的本地

image-20230516141534390

  • 立即构建

image-20230516141754202

image-20230516141806418

3.2.3配置Maven构建代码

mvc package是Maven的命令之一,⽤于编译项⽬代码并将其打包成可执⾏⽂件(如 jar 或 war ⽂件)。在 执⾏ mvn package 命令时,Maven 会根据项⽬中的 pom.xml ⽂件定义的构建配置和依赖关系,从远程 Maven 仓库下载所需的依赖项,并将项⽬源代码编译成字节码,最终将所有字节码打包成⼀个可执⾏的 jar 或 war ⽂件(根据项⽬类型⽽定)。

具体来说,mvn package 命令会执⾏以下步骤:

清理⽬标⽂件夹,删除旧的输出⽂件 

检查项⽬依赖,下载需要的 JAR 包并放⼊本地仓库 

编译源代码,⽣成字节码⽂件 

执⾏测试代码,并⽣成测试报告 

打包编译好的字节码和相关资源⽂件成⼀个可执⾏的 jar 或 war ⽂件 

打包完成后,可执⾏⽂件会被保存在 Maven 的默认输出⽬录 target 中。

这个可执⾏的 jar 或 war ⽂件可以直 接运⾏或部署到服务器上。

image-20230516142216031

  • 立即构建成功
#target目录
[root@master2 data]# ls workspace/test/
.git/      mvnw       mvnw.cmd   pom.xml    README.md  resources/ src/       target/

3.2.4配置Publish发布&远程操作

jar包构建好之后,就可以根据情况发布到测试或⽣产环境,这⾥需要⽤到之前下载好的插件Publish Over SSH

  • 配置密钥
###Jenkins生成密钥
docker exec -it jenkins bash
bash-4.2$ ssh-keygen
cat /var/jenkins_home/.ssh/id_rsa.pub
###将公钥写入业务服务器的authorized_keys
[root@master3 ~]# vim .ssh/authorized_keys

image-20230516144601056

  • 配置私钥

image-20230516150236840

不配置私钥出现下图报错

image-20230516150634748

  • 构建任务配置

image-20230516150408340

/app/test目录要存在,否则出现下图情况

image-20230516150539980

  • 构建成功远程推送业务服务器
[root@master3 ~]# ls /app/test/target/
hello-0.0.1-SNAPSHOT.jar

3.3持续集成

构建好的程序代码推送到了业务服务器,现在基于Docker服务运⾏,需要添加Docker配置和脚本⽂件让程序可以在集成到主⼲的同时运⾏起来。

3.3.1编写Dockerfile文件

# 使⽤官⽅的Java 8镜像作为基础镜像
FROM openjdk:8
# 将本地的jar⽂件复制到容器中
COPY ./target/*.jar /usr/local/demo.jar
# 设置⼯作⽬录
WORKDIR /usr/local/
# 运⾏jar⽂件
CMD ["java", "-jar", "demo.jar"]

3.3.2编写docker-compose.yml文件

version: '3.1'
services:
  demo:
    build: ./
    image: demo:v1.0.0
    container_name: demo
    ports:
      - 8080:8080

3.3.3Jenkins构建后执行的脚本

docker-compose stop
docker-compose up -d --build

3.3.4配置Jenkins构建后执行命令

image-20230516151607284

  • 访问查看

image-20230516161534580

3.4持续交付、部署

  • 下载Git Parameter 插件

image-20230516161746603

  • 设置项目参数化构建

image-20230516161945269

  • gitlab增加tag

image-20230516162029839

  • 基于Parameter构建任务

image-20230516162151052

image-20230516162509453

  • 访问业务、

image-20230516162524749

4.Sonar Qube

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

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

4.1Sonar Qube安装

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

docker pull postgres
docker pull sonarqube:8.9.3-community
##编写docker-compoe.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
   
  • 启动容器
  • 设置sysctl.conf,重启容器

vm.max_map_count = 262144

  • 登录Sonar Qube

admin&admin

image-20230516165403519

4.1.1安装中文插件

image-20230516165628258

  • 安装成功后重启

image-20230516165922440

4.2基本使用

Sonar Qube的使⽤⽅式很多,Maven可以整合,也可以采⽤sonar-scanner的⽅式,再查看Sonar Qube的检测效果

4.2.1Maven实现代码检测

修改Maven的setting.xml文件,

    <profile>
      <id>sonar</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <sonar.login>admin</sonar.login>
        <sonar.password>pwd111111</sonar.password>
        <sonar.host.url>http://11.0.1.198:9000</sonar.host.url>
      </properties>
      </profile>
  • 执行命令,检查代码

bash-4.2$ ../../maven/bin/mvn sonar:sonar

  • 扫描成功

image-20230516172934954

image-20230516172953543

4.3Sonar-scanner

下载Sonar-scanner:https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/ 下载4.6.x版本即可,要求Linux版本

  • 解压
  • 配置sonarQube服务端地址,修改conf下的sonar-scanner.properties
#----- Default SonarQube server
#sonar.host.url=http://localhost:9000
sonar.hosturl=http://11.0.1.198:9000
sonar.login=admin
sonar.password=pwd111111

#----- Default source code encoding
sonar.sourceEncoding=UTF-8
  • 检测代码
cd /docker_data/data/workspace/test/
/root/sonar-scanner-4.6.0.2311-linux/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=demo -Dsonar.projectKey=java -Dsonar.java.binaries=target/

5.Jenkins集成Sonar Qube

5.1Jenkins安装插件

image-20230516173802269

5.2Jenkins配置Sonar Qube

  • 开启Sonar Qube权限认证,已经开启

image-20230516174303523

  • 获取Sonar Qube的令牌
ee69b937d2e3253205620c6307fead1ab5931205

image-20230516174403984

  • 配置Jenkins的Sonar Qube信息

image-20230516174640760

image-20230516174748843

5.3配置Sonar-scanner

  • 将Sonar-scanner拷贝到Jenkins数据卷并配置全局配置

cp -r /root/sonar-scanner-4.6.0.2311-linux/ /docker_data/data/sonar-scanner

image-20230516175232521

5.4构建任务配置Sonar-scanner

sonar.projectname=${JOB_NAME}
sonar.projectKey=${JOB_NAME}
sonar.source=./
sonar.java.binaries=target/
sonar.login=admin
sonar.password=pwd111111

image-20230516175425878

遇到这个报错更改项目目录权限

image-20230516222007915

6.集成Harbor

通过Harbor作为私有的Docker镜像仓库。让Jenkins统⼀将项⽬打包并制作成Docker镜像发布到Harbor 仓库中,只需要通知⽬标服务,让⽬标服务统⼀去Harbor仓库上拉取镜像并在本地部署即可

6.1部署Harbor

##cp harbor.yml.tmpl harbor.yml
配置ip,注释https

image-20230516222607644

  • 启动Harbor

./install.sh

image-20230516223255539

  • 创建用户

image-20230516223530459

  • 创建项目并增加成员

image-20230516223611431

6.2发布镜像到Harbor

  • 修改daemon.json
{
        "registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"],
        "insecure-registries":[”11.0.1.201“]
}

Jenkins构建镜像和发布镜像到harbor都需要使⽤到docker命令。⽽在Jenkins容器内部安装Docker官⽅推荐直接采⽤宿主 机带的Docker即可

  • 设置宿主机docker.sock权限
[root@master2 ~]# chown root:root /var/run/docker.sock
[root@master2 ~]# chmod o+rw /var/run/docker.sock
  • 添加数据卷
version: "3.1"
services:
 jenkins:
   image: jenkins/jenkins:2.396-centos7
   container_name: jenkins
   ports:
   - 8080:8080
   - 50000:50000
   volumes:
   - /docker_data/data/:/var/jenkins_home/
   - /usr/bin/docker:/usr/bin/docker
   - /var/run/docker.sock:/var/run/docker.sock
   - /etc/docker/daemon.json:/etc/docker/daemon.json

启动容器,加载数据卷

docker-compose -f Jenkins.yml up -d

  • 添加构建操作,实现Jenkins构建镜像到Harbor
mv target/*.jar docker/
docker build -t demo:$tag docker/
docker login -ugrowfs -pPwd111111 11.0.1.201
docker tag demo:$tag 11.0.1.201/test/demo:$tag
docker push 11.0.1.201/repository/demo:$tag

image-20230516230225018

  • 添加构建后操作,实现业务服务拉取镜像

    • 脚本文件
    harbor_url=$1
    harbor_project_name=$2
    project_name=$3
    tag=$4
    port=$5
    host_port=$6
    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 wing -pWingpwd123 $harbor_url
    docker pull $imageName
    docker run -d -p $host_port:$port --name $project_name $imageName
    echo "Start Container Success"
    echo $project_name
    
    • 配置参数

image-20230516231446316

  • 配置构建后操作

image-20230516231605227

  • 构建成功

image-20230516234125138

image-20230516234152751

posted @ 2023-05-17 21:57  loser_xu  阅读(29)  评论(0编辑  收藏  举报