pipeline相当于是将自由风格、maven项目等全部流程通过pipeline脚本进行串联
流程概述
gitlab(checkout)→jenkins→maven编译→docker镜像构建→推送私仓→docker测试→docker发布

环境说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| 软件版本: CentOS 7.9.2009 jenkins 2.462.3 gitlab 17.4 maven 3.9.9 jdk 17.0.12 2024-07-16 LTS jdk 11.0.24 2024-07-16 LTS tomcat 9.0.93 tomcat 8
地址分配: jenkins 192.168.10.135 test 192.168.10.102 (jenkins工作节点) gitlab 192.168.10.119 harbor 192.168.10.130 web-vip 192.168.10.51 docker主机 192.168.10.100
gitlab项目目录 http://gitlab.wangsheng.com/group01/java_discuz.git web-tomcat生产镜像 192.168.10.130/jenkins-demo/tomcat8:v1 docker测试环境端口 192.168.10.102:8081 docker生产环境端口 192.168.10.100:8081 test主机java_home=/usr/local/jdk-17
准备工作(略过的部分) 部署docker,配置daemon.json 部署harbor,docker与harbor互信与登录 封装tomcat镜像与测试完成 部署gitlab 部署git,与gitlab连接 部署jenkins,与gitlab连接 jenkins工作节点与docker主机ssh互信
tomcat镜像的dockerfile如下 FROM centos:latest MAINTAINER wangsheng WORKDIR /usr/local/ RUN rm -rf /etc/yum.repos.d/* COPY Centos-vault-8.5.2111.repo /etc/yum.repos.d/ ADD jdk-8u45-linux-x64.rpm . ADD apache-tomcat-8.5.43.tar.gz . RUN rpm -ivh jdk-8u45-linux-x64.rpm RUN mv apache-tomcat-8.5.43 tomcat8 && rm -rf apache-tomcat-8.5.43.tar.gz ENTRYPOINT /usr/local/tomcat8/bin/startup.sh && tail -f /usr/local/tomcat8/logs/catalina.out EXPOSE 8080
|
使用脚本式语法构建
点击下方的流水线语法可以通过点点点的方式快速生成脚本式语法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| node ("test") { stage('git checkout') { git branch: 'main', credentialsId: '3ecfd94e-fbba-458e-b3f6-4a65f5762751', url: 'http://gitlab.wangsheng.com/group01/java_discuz.git' } stage('maven build') { sh '''export JAVA_HOME=/usr/local/jdk-17 /usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true''' } stage('build and push images') { sh '''cat > Dockerfile << EOF FROM 192.168.10.130/jenkins-demo/tomcat8:v1 RUN rm -rf /usr/local/tomcat8/webapps/* && mkdir /usr/local/tomcat8/webapps/ROOT ADD webapp/target/webapp.war /usr/local/tomcat8/webapps/hello-world.war EOF docker build -t 192.168.10.130/jenkins-demo/tomcat8-demo:latest . docker push 192.168.10.130/jenkins-demo/tomcat8-demo:latest''' } stage('test') { sh '''docker ps -a | grep -q -i -w jenkins-test && docker rm -f jenkins-test''' sh '''docker run -itd -p 8081:8080 --name jenkins-test 192.168.10.130/jenkins-demo/tomcat8-demo:latest /bin/bash''' sh '''docker ps | grep -i -w -q jenkins-test && echo "deploy successfully"''' } stage('deploy') { sh '''sshpass -p1 ssh 192.168.10.100 "docker ps -a | grep -q -i -w jenkins-demo && docker rm -f jenkins-demo"''' sh '''sshpass -p1 ssh 192.168.10.100 "docker run -itd -p 8081:8080 --name jenkins-demo --ulimit nofile=65535:65535 --ulimit nproc=65535:65535 192.168.10.130/jenkins-demo/tomcat8-demo:latest /bin/bash"''' sh '''sshpass -p1 ssh 192.168.10.100 "docker ps | grep -i -w -q jenkins-demo && echo 'deploy successfully'"''' } }
|
构建成功

使声明式语法+SCM构建
声明式语法
声明式pipeline语法包括以下核心流程:
1.pipeline : 声明其内容为一个声明式的pipeline脚本
2.agent: 执行节点(job运行的slave或者master节点)
none 不指定运行节点,由stage决定
any 可运行在任意节点上
3.stages: 阶段集合,包裹所有的阶段(例如:打包,部署等各个阶段)
4.stage: 阶段,被stages包裹,一个stages可以有多个stage
5.steps: 步骤,为每个阶段的最小执行单元,被stage包裹
6.post: 执行构建后的操作,根据构建结果来执行对应的操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| pipeline { agent { label 'test' } environment { GIT_CREDENTIALS = '3ecfd94e-fbba-458e-b3f6-4a65f5762751' DOCKER_REGISTRY = '192.168.10.130/jenkins-demo' TARGET_SERVER = '192.168.10.100' } stages { stage('Git Checkout') { steps { git( branch: 'main', credentialsId: "${GIT_CREDENTIALS}", url: 'http://gitlab.wangsheng.com/group01/java_discuz.git' ) } } stage('Maven Build') { steps { script { sh ''' export JAVA_HOME=/usr/local/jdk-17 /usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true ''' } } } stage('Build and Push Docker Images') { steps { script { sh ''' cat > Dockerfile << EOF FROM ${DOCKER_REGISTRY}/tomcat8:v1 RUN rm -rf /usr/local/tomcat8/webapps/* && mkdir /usr/local/tomcat8/webapps/ROOT ADD webapp/target/webapp.war /usr/local/tomcat8/webapps/hello-world.war EOF docker build -t ${DOCKER_REGISTRY}/tomcat8-demo:latest . docker push ${DOCKER_REGISTRY}/tomcat8-demo:latest ''' } } } stage('Test') { steps { script { sh ''' docker ps -a | grep -q -i -w jenkins-test && docker rm -f jenkins-test docker run -itd -p 8081:8080 --name jenkins-test ${DOCKER_REGISTRY}/tomcat8-demo:latest /bin/bash if docker ps | grep -i -w -q jenkins-test; then echo "Test deploy successfully" else echo "Test deploy failed" exit 1 fi ''' } } } stage('Deploy') { steps { script { sh ''' sshpass -p1 ssh ${TARGET_SERVER} "docker ps -a | grep -q -i -w jenkins-demo && docker rm -f jenkins-demo" sshpass -p1 ssh ${TARGET_SERVER} "docker run -itd -p 8081:8080 --name jenkins-demo --ulimit nofile=65535:65535 --ulimit nproc=65535:65535 ${DOCKER_REGISTRY}/tomcat8-demo:latest /bin/bash" if sshpass -p1 ssh ${TARGET_SERVER} "docker ps | grep -i -w -q jenkins-demo"; then echo 'Deploy successfully' else echo 'Deploy failed' exit 1 fi ''' } } } } post { success { echo 'Pipeline executed successfully' } failure { echo 'Pipeline execution failed' } } }
|
SCM方式
使用pipeline-SCM的方式进行设置
这种方式可以直接读取项目代码中的jenkinsfile文件,jenkinsfile文件内写pipeline脚本
就可以自动执行jenkinsfile中的pipeline脚本
SCM配置

SCM代码上传
1 2 3 4 5 6 7 8 9 10 11
| cd /root/git cat >Jenkinsfile<<'EOF' ... 这里写上面声明式脚本 ... EOF
git add Jenkinsfile git commit -m "SCM" Jenkinsfile git push origin main
|
构建成功
