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阶段
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
- 修改密码
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
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
3.使用Jenkins
3.1上传代码
- gitlab创建项目
- 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创建任务
创建自由风格的构建任务
3.2.2配置源码拉取地址
Jenkins需要将Git上存放的源码存储到Jenkins服务所在磁盘的本地
- 立即构建
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 ⽂件可以直 接运⾏或部署到服务器上。
- 立即构建成功
#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
- 配置私钥
不配置私钥出现下图报错
- 构建任务配置
/app/test
目录要存在,否则出现下图情况
- 构建成功远程推送业务服务器
[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构建后执行命令
- 访问查看
3.4持续交付、部署
- 下载Git Parameter 插件
- 设置项目参数化构建
- gitlab增加tag
- 基于Parameter构建任务
- 访问业务、
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
4.1.1安装中文插件
- 安装成功后重启
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
- 扫描成功
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安装插件
5.2Jenkins配置Sonar Qube
- 开启Sonar Qube权限认证,已经开启
- 获取Sonar Qube的令牌
ee69b937d2e3253205620c6307fead1ab5931205
- 配置Jenkins的Sonar Qube信息
5.3配置Sonar-scanner
- 将Sonar-scanner拷贝到Jenkins数据卷并配置全局配置
cp -r /root/sonar-scanner-4.6.0.2311-linux/ /docker_data/data/sonar-scanner
5.4构建任务配置Sonar-scanner
sonar.projectname=${JOB_NAME}
sonar.projectKey=${JOB_NAME}
sonar.source=./
sonar.java.binaries=target/
sonar.login=admin
sonar.password=pwd111111
遇到这个报错更改项目目录权限
6.集成Harbor
通过Harbor作为私有的Docker镜像仓库。让Jenkins统⼀将项⽬打包并制作成Docker镜像发布到Harbor 仓库中,只需要通知⽬标服务,让⽬标服务统⼀去Harbor仓库上拉取镜像并在本地部署即可
6.1部署Harbor
- 下载Harbor安装包:https://github.com/goharbor/harbor/releases/download/v2.3.4/harbor-offline-installer-v2.3.4.tgz
- 编辑yaml配置文件
##cp harbor.yml.tmpl harbor.yml
配置ip,注释https
- 启动Harbor
./install.sh
- 创建用户
- 创建项目并增加成员
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
-
添加构建后操作,实现业务服务拉取镜像
- 脚本文件
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
- 配置参数
- 配置构建后操作
- 构建成功