之前采用Jenkins的自由风格构建的项目,每个步骤流程都要通过不同的方式设置,并且构建过程中整体流程是不可见的,无法确认每个流程花费的时间,并且问题不方便定位问题。
Jenkins的Pipeline可以让项目的发布整体流程可视化,明确执行的阶段,可以快速的定位问题。并且整个项目的生命周期可以通过一个Jenkinsfile文件管理,而且Jenkinsfile文件是可以放在项目中维护。
所以Pipeline相对自由风格或者其他的项目风格更容易操作。
构建Jenkins流水线任务
构建任务
生成Groovy脚本
在配置中,选择hello world,然后进行应用,保存
构建后进行视图查看
把之前使用自由风格做的流水线任务再来重新使用jenkins流水线进行一次操作,先编写一个简单脚本,模拟要进行的操作阶段:
pipeline { agent any stages { stage('从git上拉取代码') { steps { echo '从git上拉取代码 - success!' } } stage('maven构建代码') { steps { echo 'maven构建代码 - success!' } } stage('使用sonarQube进行代码质量检测') { steps { echo 'sonarQube进行代码质量检测 - success!' } } stage('制作镜像并发布到Harbor上') { steps { echo '制作镜像并发布到Harbor上 - success!' } } stage('通知部署镜像') { steps { echo '通知部署镜像 - success!' } } } }
把上面的脚本配置到流水线上,然后重新进行构建
除了使用上面的方式外,我们可以通过使用Jenkinsfile的方式将脚本编写到项目中Jenkinsfile文件中,每次构建会自动拉取项目并且获取项目中的Jenkinsfile文件对项目进行构建
配置pipeline
再次进行构建,可以发现已经是通过
配置从gitlab上拉取代码
1、获取拉取代码的脚本
点击生成流水线脚本,然后将获取到的脚本发送填入到Jenkinsfile文件中
checkout([$class: 'GitSCM', branches: [[name: '${branch}']], extensions: [], userRemoteConfigs: [[credentialsId: 'f8be2dcd-6d83-433a-8318-712382911b64', url: 'http://192.168.19.6:8929/gitlab-instance-de033185/cicd-demo.git']]])
配置Maven构建
生成的脚本如下:
sh '/var/jenkins_home/apache-maven/bin/mvn clean package'
使用SonarQube进行代码质量检测
sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=pipeline-demo -Dsonar.projectKey=pipeline-demo -Dsonar.java.binaries=/target -Dsonar.login=1324efeaad77d14977920c2bbc3e55ae0897fe38'
制作镜像发布到Harbor上
sh '''mv target/*.jar docker/
docker build -t mytest:${projectVersion} docker/
docker login -u ${harborUser} -p ${harborPasswd} ${harborHost}
docker tag mytest:${projectVersion} ${harborHost}/${harborRepo}/mytest:${projectVersion}
docker push ${harborHost}/${harborRepo}/mytest:${projectVersion}'''
通知目标服务器来对镜像进行部署
sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "deploy.sh $harborHost $harborRepo mytest $projectVersion $host_port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
所有配置完成后,整个Jenkinsfile文件内容如下:
pipeline {
agent any
environment{
harborHost = '192.168.19.7:80'
harborRepo = 'repo'
harborUser = 'admin'
harborPasswd = 'Harbor12345'
}
stages {
stage('从git上拉取代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '${branch}']], extensions: [], userRemoteConfigs: [[credentialsId: 'f8be2dcd-6d83-433a-8318-712382911b64', url: 'http://192.168.19.6:8929/gitlab-instance-de033185/cicd-demo.git']]])
echo '从git上拉取代码 - success!'
}
}
stage('maven构建代码') {
steps {
sh '/var/jenkins_home/apache-maven/bin/mvn clean package'
echo 'maven构建代码 - success!'
}
}
stage('使用sonarQube进行代码质量检测') {
steps {
sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=pipeline-demo -Dsonar.projectKey=pipeline-demo -Dsonar.java.binaries=/target -Dsonar.login=1324efeaad77d14977920c2bbc3e55ae0897fe38'
echo 'sonarQube进行代码质量检测 - success!'
}
}
stage('制作镜像并发布到Harbor上') {
steps {
sh '''mv target/*.jar docker/
docker build -t mytest:${projectVersion} docker/
docker login -u ${harborUser} -p ${harborPasswd} ${harborHost}
docker tag mytest:${projectVersion} ${harborHost}/${harborRepo}/mytest:${projectVersion}
docker push ${harborHost}/${harborRepo}/mytest:${projectVersion}'''
echo '制作镜像并发布到Harbor上 - success!'
}
}
stage('通知部署镜像') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "deploy.sh $harborHost $harborRepo mytest $projectVersion $host_port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
echo '通知部署镜像 - success!'
}
}
}
}
进行最终的构建测试,发现所有流程均没有问题