跳到主要内容

声明式流水线与多分支实践

Jenkins 是一款老牌且强大的开源自动化持续集成/持续交付(CI/CD)工具。在现代运维流水线中,推荐使用声明式流水线 (Declarative Pipeline)


1. 规范的声明式流水线文件(Jenkinsfile)

以下是一个企业中常用的 Jenkinsfile 模版,使用了 Kubernetes 容器化动态代理、凭证注入和飞书/钉钉企业微信通知:

pipeline {
agent {
// 使用 Kubernetes 动态代理节点,确保 Runner 的弹性伸缩
kubernetes {
yaml '''
apiVersion: v1
kind: Pod
spec:
containers:
- name: maven
image: maven:3.8.6-openjdk-11
command: ['cat']
tty: true
- name: docker
image: docker:20.10.12
command: ['cat']
tty: true
volumeMounts:
- mountPath: /var/run/docker.sock
name: docker-sock
volumes:
- name: docker-sock
hostPath:
path: /var/run/docker.sock
'''
}
}

environment {
REGISTRY = "registry.company.com"
APP_NAME = "backend-service"
// 从 Jenkins 系统凭证中读取密码
DOCKER_CREDS = credentials('harbor-registry-auth')
}

stages {
stage('Java 编译打包') {
steps {
container('maven') {
sh 'mvn clean package -Dmaven.test.skip=true'
}
}
}

stage('Docker 镜像打包') {
steps {
container('docker') {
sh """
docker login -u ${DOCKER_CREDS_USR} -p ${DOCKER_CREDS_PSW} ${REGISTRY}
docker build -t ${REGISTRY}/${APP_NAME}:${BUILD_NUMBER} .
docker push ${REGISTRY}/${APP_NAME}:${BUILD_NUMBER}
"""
}
}
}
}

post {
success {
echo '🎉 编译打包发布成功!'
// 在此处调用企业通知 API 脚本
}
failure {
echo '❌ 运行失败,请检查构建日志!'
}
}
}

2. 运维最佳实践要点

1. 将流水线代码化 (Pipeline as Code)

所有的 Jenkinsfile 必须存储在业务代码仓库根目录下,而不是在 Jenkins Web UI 界面中手写。这能确保流水线的历史版本和代码一同被 Git 记录。

2. 动态清理空间

Jenkins 在运行完任务后,通常会残留巨大的 Workspaces 导致磁盘爆满。建议配置:

post {
always {
cleanWs() // 任务结束后永远清理当前 Workspace 空间
}
}