之前采用的都是Jenkins的自由风格,每个流程都要通过不同的方式设置,并且构建过程中整体流程时不可见的,无法确认每个流程花费的时间,同时不方便问题的定位。
Jenkins的Pipeline可以让项目的发布整体流程可视化,明确执行的阶段,快速定位问题。让整个项目的生命周期可以通过一个Jenkinsfile文件管理,而且Jenkinsfile文件是可以放在项目中维护。
进入工程配置 流水线
点击构建 可以看到流水线任务就是模块化任务,单独的log比自定义工程更方便查询日志方便管理
// 所有脚本命令包含在pipeline{}中
pipeline {
// 指定任务在哪个节点执行(Jenkins支持分布式)
agent any
// 配置全局环境,指定变量名=变量值信息
environment{
host = '192.168.117.141'
}
// 存放所有任务的合集
stages {
// 单个任务
stage('任务1') {
// 实现任务的具体流程
steps {
echo 'do something'
}
}
// 单个任务
stage('任务2') {
// 实现任务的具体流程
steps {
echo 'do something'
}
}
// ……
}
}
Jenkinsfile方式需要将脚本内容编写到项目中的Jenkinsfile文件中,每次构建会自动拉取并且获取项目中的Jenkinsfile文件来对项目进行构建
进入代码目录
cd devops-test
vim Jenkinsfile
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部署工程'
}
}
}
}
推送到仓库
git add *
git commit -m "create jenkinsfile"
git push -u origin main
进入gitlab查看
再次点击构建 可以看到工程全部模块化展出,包含项目构建时间,构建状态,构建日志等
回到工程配置添加参数化构建,方便选择不同的项目版本
通过流水线语法生成Checkout代码的脚本
生成脚本并复制 将*/master更改为标签${tag}
修改Jenkinsfile
生成的流水线脚本
checkout scmGit(branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.141:8929/root/devops-test.git']])
输入
/var/jenkins_home/maven/bin/mvn clean package
生成的流水线脚本
sh '/var/jenkins_home/maven/bin/mvn clean package'
修改Jenkinsfile
通过脚本执行sonar-scanner命令即可
/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
生成的流水线脚本
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'
要是令牌忘记了再去生成一个即可
修改Jenkinsfile
修改Jenkinsfile 增加环境变量
harborHost = '192.168.117.141:7788' #地址
harborRepo = 'devops' #仓库名
harborUser = 'admin' #用户
harborPasswd = 'Harbor12345' #密码
输入
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
生成的流水线脚本
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
输入
/usr/bin/devops_start.sh $harborHost $harborRepo $JOB_NAME $tag
注意这里 由于使用了变量这里的单引号必须改为双引号
生成的脚本 修改双引号为
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
修改完再次推送代码到v1.0.3版本 顺便也推送到main
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
若机器重启过 导致构建失败 如下图
需要再次配置容器对宿主机的docker权限 并重启jenkins
chown root:root /var/run/docker.sock
chmod o+rw /var/run/docker.sock
cd /usr/local/jenkins
docker-compose up -d
再次构建完成
访问IP:9901
sonarqube 也创建了新的工程bug检测
harbor仓库中也存储了工程提交的镜像
提交v1.0.4 测试访问
vim src/main/java/com/example/testinit/controller/HelloWord.java
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 完美访问
jenkins-pipeline 流水线到这里就结束了