1、定义构建参数
// 1. 定义构建参数
properties([
parameters([
choice(
name: 'ENVIRONMENT',
description: '请选择要构建的环境',
choices: ['dev', 'test', 'prod']
)
])
])
2、定义的存储分支名
def selectedBranch = ''
3、switch语句灵活映射
使用
switch语句进行灵活映射(推荐)在实际项目中,分支名往往与环境名不完全一致。例如,
dev环境可能对应develop分支,prod环境对应main或master分支。这时,使用switch语句进行映射会更加清晰和灵活。
//第一阶段
stage('选择代码分支') {
echo "1.环境选择"
//使用switch语句将环境名映射到实际的分支名
switch(params.ENVIRONMENT) {
case 'dev':
//开发环境分支名
selectedBranch = 'dev'
break
case 'test':
//测试环境分支名
selectedBranch = 'test'
break
case 'prod':
//生产环境分支名,通常是main或master,这里我单独分出的prod分支
selectedBranch = 'prod'
break
default:
error("不支持的环境: ${params.ENVIRONMENT}")
break
}
//根据环境变量生成不同的镜像端点和最终镜像名
env.imageEndpoint = "java-${params.ENVIRONMENT}/demo"
env.image = "${registryUrl}/${imageEndpoint}:${imageTag}"
echo "已选择环境: ${params.ENVIRONMENT},即将拉取${params.ENVIRONMENT}代码并构建"
}
//第二阶段
stage('拉取对应分支代码') {
echo "2.拉取代码"
//使用映射后的分支名进行拉取
git branch: "${params.ENVIRONMENT}",
url: "${codeUrl}", //仓库地址变量
credentialsId: 'root_gitlab' //gitlab的token访问凭证
}
4、Jenkinsfile预览
//定义构建参数
properties([
parameters([
choice(
name: 'ENVIRONMENT',
description: '请选择要构建的环境',
choices: ['dev', 'test', 'prod']
)
])
])
//定义空变量用于传参分支名
def selectedBranch = ''
def label = "jenkins-agent"
podTemplate(label: label, containers: [
//设置mvn、buildkit、kubectl三个容器模板
containerTemplate(name: 'maven', image: 'harbor.test.com/devops/maven:3.8.5-openjdk-11', command: 'cat', ttyEnabled: true),
containerTemplate(name: 'buildkit', image: 'harbor.test.com/devops/buildkit:v0.23.2', command: 'cat', ttyEnabled: true, privileged: true),
containerTemplate(name: 'kubectl', image: 'harbor.test.com/devops/kubectl', command: 'cat', ttyEnabled: true)],
//sa权限
serviceAccount: 'jenkins-master',
volumes: [
hostPathVolume(mountPath: '/root/.m2', hostPath: '/data/nfs-data/mvn'),
//挂载harbor证书目录
hostPathVolume(mountPath: '/tmp/certs.d', hostPath: '/data/nfs-data/certs.d')])
{
node(label) {
// 仓库地址和标签
def imageTag = "v1.0"
def registryUrl = "harbor.test.com"
def codeUrl = "http://172.16.10.130/dev_team/java-demo.git"
//第一阶段
stage('选择代码分支') {
echo "1.环境选择"
//使用switch语句将环境名映射到实际的分支名
switch(params.ENVIRONMENT) {
case 'dev':
//开发环境分支名
selectedBranch = 'dev'
break
case 'test':
//测试环境分支名
selectedBranch = 'test'
break
case 'prod':
//生产环境分支名,通常是main或master,这里我单独分出的prod分支
selectedBranch = 'prod'
break
default:
error("不支持的环境: ${params.ENVIRONMENT}")
break
}
//根据环境变量生成不同的镜像端点和最终镜像名
env.imageEndpoint = "java-${params.ENVIRONMENT}/demo"
env.image = "${registryUrl}/${imageEndpoint}:${imageTag}"
echo "已选择环境: ${params.ENVIRONMENT},即将拉取${params.ENVIRONMENT}代码并构建"
}
//第二阶段
stage('拉取对应分支代码') {
echo "2.拉取代码"
//使用映射后的分支名进行拉取
git branch: "${params.ENVIRONMENT}",
url: "${codeUrl}", //仓库地址变量
credentialsId: 'root_gitlab' //gitlab的token访问凭证
}
//第三阶段
stage('mvn构建jar包') {
container('maven') {
echo "3.mvn构建"
sh """
export JAVA_HOME=/usr/local/openjdk-11
mvn -B -q clean install -DskipTests
"""
}
}
//第四阶段
stage('buildkit构建镜像') {
//引入harbor仓库认证
withCredentials([usernamePassword(
//凭据id以实际为准
credentialsId: 'harbor_auth',
passwordVariable: 'HARBOR_PASSWORD',
usernameVariable: 'HARBOR_USER')]) {
container('buildkit') {
echo "4.构建镜像"
sh """
#创建harbor认证文件
mkdir -p /root/.docker
cat > /root/.docker/config.json << EOF
{
"auths": {
"${registryUrl}": {
"auth": "\$(echo -n "${HARBOR_USER}:${HARBOR_PASSWORD}" | base64)"
}
}
}
EOF
#需创建配置文件,否则无法进行证书忽略或校验
mkdir -p /etc/buildkit
cat > /etc/buildkit/buildkitd.toml << EOF
[registry."${registryUrl}"]
insecure = true
mirrors = ["${registryUrl}"]
EOF
#启动buildkitd守护进程
buildkitd &
sleep 5
buildctl build \
--frontend dockerfile.v0 \
--local context=. \
--local dockerfile=.\
--export-cache type=inline \
--import-cache type=registry,ref=${env.image}:buildcache \
--output type=image,name=${env.image},push=true \
--registry-auth-tlscontext host=${registryUrl},insecure=false,ca=/tmp/certs.d/ca.pem,cert=/tmp/certs.d/cert.pem,key=/tmp/certs.d/key.pem
"""
}
}
}
//第五阶段
stage('kubectl一键部署') {
withCredentials([file(
credentialsId: 'kubeconfig',
variable: 'KUBECONFIG')]) {
container('kubectl') {
echo "5.kubectl更新镜像"
sh """
kubectl --kubeconfig=$KUBECONFIG set image deployment/${params.ENVIRONMENT}-demo ${params.ENVIRONMENT}-demo=${env.image} -n devops
sleep 10
kubectl --kubeconfig=$KUBECONFIG get pod -n devops |grep ${params.ENVIRONMENT}-demo|grep Running
"""
}
}
}
}
}
5、Pipeline配置
5.1 Jenkinsfile放置代码仓库
优点:安全、隐私性更好,jenkins的核心思想之一就是Jenkinsfile,它只关注代码仓库里面的Jenkinsfile
缺点:需要独立维护Jenkinsfile
5.1.1 步骤
scm配置

gitlab的jenkinsfile

5.2 直接放置jenkins的pipeline scripts
5.2.1 步骤
贴上jenkinsfile的脚本内容即可,无需额外操作

6、运行多分支流水线
进入到流水线,就有了可选的参数,dev,test,prod

6.1 dev运行情况
Build

pipeline运行日志

访问demo

6.2 test运行情况
Build

pipeline运行日志

访问demo

6.3 prod运行情况
Build

pipeline运行日志

访问demo

评论区