Jenkins 流水线pipeline

【百炼成魔】Jenkins 流水线pipeline

Jenkins流水线任务介绍

1
2
3
之前采用的都是Jenkins的自由风格,每个流程都要通过不同的方式设置,并且构建过程中整体流程时不可见的,无法确认每个流程花费的时间,同时不方便问题的定位。

Jenkins的Pipeline可以让项目的发布整体流程可视化,明确执行的阶段,快速定位问题。让整个项目的生命周期可以通过一个Jenkinsfile文件管理,而且Jenkinsfile文件是可以放在项目中维护。

构建Jenkins流水线任务

新建流水线工程

image-20230915161802702

进入工程配置 流水线

image-20230915161941722

点击构建 可以看到流水线任务就是模块化任务,单独的log比自定义工程更方便查询日志方便管理

image-20230915162024165

Groovy脚本基本语法

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
// 所有脚本命令包含在pipeline{}中
pipeline {  
// 指定任务在哪个节点执行(Jenkins支持分布式)
  agent any
   
  // 配置全局环境,指定变量名=变量值信息
  environment{
  host = '192.168.117.141'
  }

  // 存放所有任务的合集
  stages {
  // 单个任务
      stage('任务1') {
      // 实现任务的具体流程
          steps {
              echo 'do something'
          }
      }
// 单个任务
      stage('任务2') {
      // 实现任务的具体流程
          steps {
              echo 'do something'
          }
      }
      // ……
  }
}

配置Git

image-20230915162640918

JenkinsFile实现pipeline

1
Jenkinsfile方式需要将脚本内容编写到项目中的Jenkinsfile文件中,每次构建会自动拉取并且获取项目中的Jenkinsfile文件来对项目进行构建

进入代码目录

1
cd devops-test
1
vim Jenkinsfile
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
pipeline {
  agent any

  // 存放所有任务的合集
  stages {
      stage('拉取Git代码') {
          steps {
              echo '拉取Git代码'
          }
      }

      stage('检测代码质量') {
          steps {
              echo '检测代码质量'
          }
      }

      stage('构建代码') {
          steps {
              echo '构建代码'
          }
      }

      stage('制作自定义镜像并发布Harbor') {
          steps {
              echo '制作自定义镜像并发布Harbor'
          }
      }

      stage('基于Harbor部署工程') {
          steps {
              echo '基于Harbor部署工程'
          }
      }
  }
}

image-20230915163218780

推送到仓库

1
2
3
git add * 
git commit -m "create jenkinsfile"
git push -u origin main

image-20230915163427660

进入gitlab查看

image-20230915163536512

image-20230915163555412

再次点击构建 可以看到工程全部模块化展出,包含项目构建时间,构建状态,构建日志等

image-20230915163638674

流水线任务实现参数化构建

回到工程配置添加参数化构建,方便选择不同的项目版本

image-20230915163934995

拉取Git代码

通过流水线语法生成Checkout代码的脚本

image-20230915164031826

生成脚本并复制 将*/master更改为标签${tag}

image-20230915164750416

image-20230915164827517

修改Jenkinsfile

生成的流水线脚本

1
checkout scmGit(branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.141:8929/root/devops-test.git']])

image-20230915165103648

通过脚本执行mvn的构建命令

image-20230915165459373

输入

1
/var/jenkins_home/maven/bin/mvn clean package

生成的流水线脚本

1
sh '/var/jenkins_home/maven/bin/mvn clean package'

修改Jenkinsfile

image-20230915165647865

代码质量检测

通过脚本执行sonar-scanner命令即可

1
/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=8f0b840a4211368e33d38f33ddd0f19c6fc112bd

生成的流水线脚本

1
sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=8f0b840a4211368e33d38f33ddd0f19c6fc112bd'

image-20230915170040320

要是令牌忘记了再去生成一个即可

image-20230915170303411

修改Jenkinsfile

image-20230915170425933

制作自定义镜像并发布

修改Jenkinsfile 增加环境变量

1
2
3
4
harborHost = '192.168.117.141:7788'   #地址
harborRepo = 'devops' #仓库名
harborUser = 'admin' #用户
harborPasswd = 'Harbor12345'         #密码

image-20230915173530278

输入

1
2
3
4
5
6
cd /var/jenkins_home/workspace/${JOB_NAME}/docker
mv ../target/*.jar ./
docker build -t ${JOB_NAME}:$tag .
docker login -u admin -p Harbor12345 192.168.117.141:7788
docker tag ${JOB_NAME}:$tag 192.168.117.141:7788/devops/${JOB_NAME}:$tag
docker push 192.168.117.141:7788/devops/${JOB_NAME}:$tag

image-20230915171003253

生成的流水线脚本

1
2
3
4
5
6
sh '''cd /var/jenkins_home/workspace/${JOB_NAME}/docker
mv ../target/*.jar ./
docker build -t ${JOB_NAME}:$tag .
docker login -u admin -p Harbor12345 192.168.117.141:7788
docker tag ${JOB_NAME}:$tag 192.168.117.141:7788/devops/${JOB_NAME}:$tag
docker push 192.168.117.141:7788/devops/${JOB_NAME}:$tag'''

编写jenkinsfire

image-20230915171139650

生成Publish Over SSH脚本

输入

1
/usr/bin/devops_start.sh $harborHost $harborRepo $JOB_NAME $tag 

image-20230915171451316

注意这里 由于使用了变量这里的单引号必须改为双引号

image-20230915171638889

生成的脚本 修改双引号为

1
sshPublisher(publishers: [sshPublisherDesc(configName: 'devops', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/usr/bin/devops_start.sh $harborHost $harborRepo $JOB_NAME $tag", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])

修改jenkinsfile

image-20230915171853443

修改完再次推送代码到v1.0.3版本 顺便也推送到main

1
2
3
4
5
git add * 
git commit -m "create v1.0.3"
git tag -a v1.0.3 -m "create jenkinsfile"
git push -u origin v1.0.3
git push -u origin main

image-20230915172331868

构建

image-20230915172510027

若机器重启过 导致构建失败 如下图

image-20230915174209358

需要再次配置容器对宿主机的docker权限 并重启jenkins

1
2
3
4
chown root:root /var/run/docker.sock
chmod o+rw /var/run/docker.sock
cd /usr/local/jenkins
docker-compose up -d

再次构建完成

image-20230915174410654

访问IP:9901

image-20230915174540742

sonarqube 也创建了新的工程bug检测

image-20230915174630830

harbor仓库中也存储了工程提交的镜像

image-20230915174744686

提交v1.0.4 测试访问

1
vim src/main/java/com/example/testinit/controller/HelloWord.java

image-20230915174955109

image-20230915175044373

1
2
3
4
git add * 
git commit -m "create v1.0.4"
git tag -a v1.0.4 -m "create v1.0.4"
git push -u origin v1.0.4

再次构建v1.0.4 完美访问

image-20230915175217886

image-20230915175225448

image-20230915175241932

image-20230915175254205

jenkins-pipeline 流水线到这里就结束了