CI/CD流水线搭建流程
实验环境
部署好GitLab和Jenkins
一、CI/CD简介
CI (Continuous Integration,持续集成):开发人员频繁地将代码变更合并到共享主干(通常每天多次)的实践。
CD (Continuous Delivery/Deployment,持续交付/持续部署):
持续交付:确保代码变更可以随时安全地部署到生产环境
持续部署:自动将通过测试的变更部署到生产环境
CI/CD 工作流程
1.开发人员提交代码到版本控制系统
2.CI 服务器检测到变更并触发构建
3.运行自动化测试
4.如果测试通过,构建可部署的软件包
5.(持续交付)准备部署到生产环境
6.(持续部署)自动部署到生产环境
CI/CD 的优势
更快的发布周期:可以频繁、小批量地发布变更
更高的代码质量:通过自动化测试及早发现问题
降低风险:小变更比大变更更容易调试和回滚
提高开发效率:自动化重复性任务
更好的协作:团队成员频繁集成代码
二、配置GitLab
1、在GitLab创建一个普通用户
使用管理员root用户登录
2、创建项目
(1)使用tom用户登录
(2)创建群组
(3)创建项目
3、推送Java源代码到GitLab(GitLab)
(1)设置密钥验证
生成密钥对
ssh-keygen
查看生成的公钥
cat /root/.ssh/id_rsa.pub
上传公钥到GitLab
(2)上传myproject.tar.gz Java源代码包到/root目录并推送到GitLab
tar xf myproject.tar.gzcd myproject/git remote -v
删除origin仓库
git remote remove origin
添加GitLab仓库
git remote add origin git@192.168.10.40:dev/myproject.gitgit push --set-upstream origin master
(3)查看代码
二、配置Jenkins
1、安装Maven(Jenkins)
下载地址:阿里云镜像站
(1)下载maven二进制包,解压并移动到指定目录
wget https://mirrors.aliyun.com/apache/maven/maven-3/3.9.11/binaries/apache-maven-3.9.11-bin.tar.gztar xf apache-maven-3.9.11-bin.tar.gzmv apache-maven-3.9.11 /usr/local/maven
(2)设置环境变量
vim /etc/profile
添加:
export MAVEN_HOME=/usr/local/mavenexport PATH=$JAVA_HOME/bin:$TOMCAT_HOME/bin:$MAVEN_HOME/bin:$PATH
加载环境变量
source /etc/profile
(3)查看maven版本
mvn -version
(4)配置maven
vim /usr/local/maven/conf/settings.xml
添加修改:
<localRepository>/usr/local/maven/repo</localRepository>
<mirror><id>aliyunmaven</id><mirrorOf>central</mirrorOf><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/repositories/central</url></mirror>
<profiles><profile><id>java17</id><activation><activeByDefault>true</activeByDefault></activation><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><maven.compiler.release>17</maven.compiler.release></properties></profile>
(5)查看系统环境信息和 Java 系统属性
mvn help:system
显示下载地址为阿里源即为正确
2、安装maven插件
3、设置Java和Maven环境
查看Git安装路径(Jenkins)
whereis git
4、新建maven任务并配置
(1)新建任务
(2)查看Git仓库的HTTP协议克隆地址
(3)配置myproject任务
(4)构建测试
查看构建拉取到Jenkins的代码
ls /root/.jenkins/workspace/myproject
查看由maven打包的文件
ls /root/.jenkins/workspace/myproject/target/
三、配置WEB(web)
1、安装JDK17
(1)卸载自带Java1.8.0
rpm -qa | grep java
dnf -y remove java-1.8.0-openjdk-headless-1.8.0.452.b09-2.el9.x86_64
(2)上传jdk-17_linux-x64_bin.tar.gz包到/root目录,解压并移动到指定位置
tar xf jdk-17_linux-x64_bin.tar.gzmv jdk-17.0.12/ /usr/local/java
(3)设置环境变量
echo 'export JAVA_HOME=/usr/local/java' >> /etc/profileecho 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
加载环境变量
source /etc/profile
(4)查看Java版本
java -version
2、运行由maven打包好的Spring Boot 可执行 JAR 文件
(1)拷贝Spring Boot 可执行JAR 文件到WEB服务器(Jenkins)
scp /root/.jenkins/workspace/myproject/target/myproject02-0.0.1-SNAPSHOT.jar root@192.168.10.42:/root
(2)通过系统的 Java 环境运行打包好的 Spring Boot 可执行 JAR 文件(web)
java -jar myproject02-0.0.1-SNAPSHOT.jar
(3)使用浏览器访问
192.168.10.42:8080
3、手动构建,自动运行打包好的 Spring Boot 可执行 JAR 文件
(1)安装SSH插件
(2)配置SSH
(3)配置myproject任务
nohup /usr/local/java/bin/java -jar /root/dev/myproject*.jar > myproject.out 2>&1 &
(4)构建
(5)访问验证(web)
查看进程
jps
ss -anplt | grep java
使用浏览器访问192.168.10.42:8080
关闭web服务
pkill -9 java
四、流水线
1、新建流水线任务并配置
(1)新建流水线任务
中文在线文档:https://www.jenkins.io/zh/doc/book/pipeline/
(2)配置任务
生成一个输出Hello World的模板
(3)构建
2、配置测试流水线
(1)配置任务(拉取代码)
使用生成器生成代码
checkout scmGit(branches: [[name: '*/master']], browser: gitLab(repoUrl: 'http://192.168.10.40/dev/myproject.git', version: '18.1'), extensions: [], userRemoteConfigs: [[credentialsId: 'db5ff906-1c27-4038-9741-8f9cf0cba48e', url: 'http://192.168.10.40/dev/myproject.git']])
(2)测试拉取代码
查看流水线概览
(3)配置任务(构建代码)
(4)测试构建代码
查看流水线概览
(5)配置任务(上传jar包)
使用生成器生成代码
sshPublisher(publishers: [sshPublisherDesc(configName: 'WEB-192.168.10.42', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'nohup /usr/local/java/bin/java -jar /root/dev/myproject*.jar > myproject.out 2>&1 &', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/dev', remoteDirectorySDF: false, removePrefix: '/target', sourceFiles: '**/*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
(6)测试上传jar包代码
查看流水线概览
(7)访问验证(web)
查看进程
jps
ss -anplt | grep java
使用浏览器访问192.168.10.42:8080
关闭web服务
pkill -9 java
3、配置真实情况的流水线
(1)复制流水线脚本
(2)在源代码中创建Jenkinsfile(流水线)文件(GitLab)
cd myproject/vim Jenkinsfile
添加:
pipeline {agent anystages {stage('拉取代码') {steps {checkout scmGit(branches: [[name: '*/master']], browser: gitLab(repoUrl: 'http://192.168.10.40/dev/myproject.git', version: '18.1'), extensions: [], userRemoteConfigs: [[credentialsId: 'db5ff906-1c27-4038-9741-8f9cf0cba48e', url: 'http://192.168.10.40/dev/myproject.git']])}}stage('构建代码') {steps {sh '/usr/local/maven/bin/mvn clean package'} }stage('上传jar包') {steps {sshPublisher(publishers: [sshPublisherDesc(configName: 'WEB-192.168.10.42', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'nohup /usr/local/java/bin/java -jar /root/dev/myproject*.jar > myproject.out 2>&1 &', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/dev', remoteDirectorySDF: false, removePrefix: '/target', sourceFiles: '**/*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}}}}
(3)配置任务
(4)提交并推送到GitLab(GitLab)
git add .git commit -m "add pipeline file"git push --set-upstream origin master
(3)查看项目文件
(4)构建
查看流水线概览
(5)访问验证
使用浏览器访问192.168.10.42:8080
关闭web服务
pkill -9 java
4、配置GitLab Webhook触发器
(1)安装GitLab插件
(2)开启 "允许来自 webhooks 和集成对本地网络的请求"
使用管理员root用户登录
(3)关闭 GitLab 认证
(4)配置mypipeline任务
http://192.168.10.41:8080/jenkins/project/mypipeline
65dbe341f6e283fc5046198744297734
(5)在GitLab 配置 Webhook
使用tom用户登录
(6)测试生成推送事件
关闭web服务(web)
pkill -9 java
(7)修改代码并提交触发构建(GitLab)
vim /root/myproject/src/main/resources/static/index.html
添加:
<h1>hello world!!!</h1>
git add .git commit -m "modify index.html file"git push --set-upstream origin master
(8)查看mypipeline任务状态
(9)访问验证
使用浏览器访问192.168.10.42:8080