Akemi

Jenkins构建pipeline项目到docker

2024/10/10

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 { // 使用test代理节点
label 'test'
}
// 定义全局变量
environment {
// 设置Git凭证ID
GIT_CREDENTIALS = '3ecfd94e-fbba-458e-b3f6-4a65f5762751'
// 设置Docker私有仓库地址
DOCKER_REGISTRY = '192.168.10.130/jenkins-demo'
// 目标服务器IP
TARGET_SERVER = '192.168.10.100'
}

stages {
stage('Git Checkout') {
steps {
// 从指定的Git仓库中检出代码
git(
branch: 'main',
credentialsId: "${GIT_CREDENTIALS}",
url: 'http://gitlab.wangsheng.com/group01/java_discuz.git'
)
}
}

stage('Maven Build') {
steps {
// 设置JAVA_HOME并运行Maven构建
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 {
// 创建Dockerfile并构建Docker镜像,然后推送到私有仓库
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 {
// 在本地测试Docker镜像
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 {
// 在目标服务器上部署Docker镜像
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 # 图方便解除保护了,生产环境中需要上传至dev然后合并

构建成功

CATALOG
  1. 1. 使用脚本式语法构建
    1. 1.1. 构建成功
  2. 2. 使声明式语法+SCM构建
    1. 2.1. 声明式语法
    2. 2.2. SCM方式
    3. 2.3. 构建成功