pipeline job的分布式构建(基于docker的动态agent)
依赖于Docker Pipeline Plugin插件,先安装插件
测试示例
pipeline {
agent none
stages {
stage('JDK') {
agent {
docker {
image 'eclipse-temurin:17-jdk-alpine'
label 'master'
}
}
steps {
sh 'java --version'
}
}
stage('Maven') {
agent {
docker {
image 'maven:3.8.6-eclipse-temurin-17-alpine'
label 'master'
}
}
steps {
sh 'mvn --version'
sh 'java --version'
}
}
}
}
立即构建并查看结果

如以下作业如果基于动态agent来运行则需:
克隆代码指定gitlab镜像,并在某一docker中进行运行
build、test、代码质量扫描,指定maven镜像
但如果在docker运行的动态agent当中执行复杂的步骤,需要拼接起来很多镜像,而且众多镜像得能共享同一个工作空间才可以。否则工作空间的相关数据都下载到本地了,在其他阶段当中如打镜像是做不到的,而kubernetes pod不具有这样的问题,因为在一个pod当中可运行多个容器,不同容器用于实现不同的功能
pipeline {
agent { label 'linux-jnlp-agent' } #与agent定义标签一致
parameters {
booleanParam(name:'pushImage', defaultValue: 'true', description: 'Push Image to Harbor?')
}
tools {
maven 'maven-3.8.7'
}
triggers {
GenericTrigger(
genericVariables: [
[key: 'ref', value: '$.ref']
],
token: 'fClZ0e/kTcqL2ARh7YqxW/3ndOCZA2SqfKnRTLat',
causeString: 'Triggered on $ref',
printContributedVariables: true,
printPostContent: true
)
}
environment {
codeRepo="http://gitlab.mengfanchao.com/root/spring-boot-helloWorld.git"
harborServer='harbor.meng.org'
projectName='spring-boot-helloworld'
imageUrl="${harborServer}/ikubernetes/${projectName}"
imageTag='latest'
}
stages {
stage('Source') {
steps {
git branch: 'main', credentialsId: 'gitlab-root-credential', url: "${codeRepo}"
}
}
stage('Build') {
steps {
sh 'mvn -B -DskipTests clean package'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
}
stage("SonarQube Analysis") {
steps {
withSonarQubeEnv('SonarQube-Server') {
sh 'mvn sonar:sonar'
}
}
}
stage("Quality Gate") {
steps {
timeout(time: 30, unit: 'MINUTES') {
waitForQualityGate abortPipeline: true
}
}
}
stage('Build Docker Image') {
agent { label 'master' }
steps {
sh 'docker image build . -t "${harborServer}/ikubernetes/${projectName}:${imageTag}"'
}
}
stage('Push Docker Image') {
agent { label 'master' }
when {
expression { params.pushImage }
beforeAgent true #提前评估代码,通过了在去master上完成镜像推送
steps {
withCredentials([usernamePassword(credentialsId: 'harbor-user-credential', \
passwordVariable: 'harborUserPassword', usernameVariable: 'harborUserName')]) {
sh "echo ${harborUserPassword} | docker login -u ${env.harborUserName} --password-stdin ${harborServer}"
sh "docker image push ${imageUrl}:${imageTag}"
}
}
}
}
post {
always {
mail to: '1153454651@qq.com',
subject: "Status of pipeline: ${currentBuild.fullDisplayName}",
body: "${env.BUILD_URL} has result ${currentBuild.result}"
}
}
}