Jenkins 是由 Kohsuke Kawaguchi 于 2004 年创建的开源自动化服务器,是持续集成(CI)和持续交付(CD)领域最流行的工具。Jenkins 提供了 1800+ 插件,支持从代码构建、测试到部署的全流程自动化。
Jenkins 的核心定位是 开源 CI/CD 自动化服务器。它提供了:
Jenkins 最初名为 Hudson,由 Kohsuke Kawaguchi 于 2004 年在 Sun Microsystems 创建。2011 年,由于 Oracle 与社区的分歧,项目更名为 Jenkins。
// Jenkinsfile(声明式流水线)
pipeline {
agent any
// 环境变量
environment {
APP_NAME = "my-app"
DOCKER_REGISTRY = "docker.io/myorg"
}
// 工具配置
tools {
maven "Maven 3.8"
jdk "JDK 11"
}
// 参数
parameters {
string(name: "BRANCH", defaultValue: "main", description: "构建分支")
choice(name: "ENV", choices: ["dev", "staging", "prod"], description: "部署环境")
booleanParam(name: "RUN_TESTS", defaultValue: true, description: "是否运行测试")
}
// 触发器
triggers {
cron("H 2 * * *") // 每天凌晨 2 点触发
pollSCM("H/5 * * * *") // 每 5 分钟检查代码变更
githubPush() // GitHub Push 触发
}
// 阶段
stages {
stage("Checkout") {
steps {
git branch: params.BRANCH,
url: "https://github.com/org/repo.git",
credentialsId: "github-cred"
}
}
stage("Build") {
steps {
sh "mvn clean compile"
}
}
stage("Test") {
when {
expression { params.RUN_TESTS }
}
steps {
sh "mvn test"
}
post {
always {
junit "**/target/surefire-reports/*.xml"
}
}
}
stage("Package") {
steps {
sh "mvn package"
sh "docker build -t ${DOCKER_REGISTRY}/${APP_NAME}:${BUILD_NUMBER} ."
}
}
stage("Deploy") {
when {
expression { params.ENV == "staging" || params.ENV == "prod" }
}
steps {
sh "docker push ${DOCKER_REGISTRY}/${APP_NAME}:${BUILD_NUMBER}"
sh "kubectl set image deployment/${APP_NAME} ${APP_NAME}=${DOCKER_REGISTRY}/${APP_NAME}:${BUILD_NUMBER} -n ${params.ENV}"
}
}
}
// 后处理
post {
success {
emailext (
subject: "构建成功: ${env.JOB_NAME} - ${env.BUILD_NUMBER}",
body: "构建成功,请查看详情",
to: "team@example.com"
)
}
failure {
emailext (
subject: "构建失败: ${env.JOB_NAME} - ${env.BUILD_NUMBER}",
body: "构建失败,请检查日志",
to: "team@example.com"
)
}
always {
cleanWs() // 清理工作空间
}
}
}
// Jenkinsfile(脚本式流水线)
node {
// 环境变量
env.APP_NAME = "my-app"
env.DOCKER_REGISTRY = "docker.io/myorg"
stage("Checkout") {
checkout scm
}
stage("Build") {
sh "mvn clean compile"
}
stage("Test") {
try {
sh "mvn test"
} catch (Exception e) {
currentBuild.result = "UNSTABLE"
throw e
} finally {
junit "**/target/surefire-reports/*.xml"
}
}
stage("Package") {
sh "mvn package"
sh "docker build -t ${env.DOCKER_REGISTRY}/${env.APP_NAME}:${env.BUILD_NUMBER} ."
}
stage("Deploy") {
withCredentials([
string(credentialsId: "k8s-token", variable: "K8S_TOKEN")
]) {
sh """
docker push ${env.DOCKER_REGISTRY}/${env.APP_NAME}:${env.BUILD_NUMBER}
kubectl set image deployment/${env.APP_NAME} \
${env.APP_NAME}=${env.DOCKER_REGISTRY}/${env.APP_NAME}:${env.BUILD_NUMBER} \
-n ${params.ENV}
"""
}
}
stage("Notify") {
emailext (
subject: "构建结果: ${env.JOB_NAME} - ${env.BUILD_NUMBER}",
body: "构建 ${currentBuild.result},请查看详情",
to: "team@example.com"
)
}
}
// vars/myBuild.groovy(共享库代码)
def call(Map config) {
node {
stage("Checkout") {
git branch: config.branch ?: "main",
url: config.repoUrl,
credentialsId: config.credentialsId
}
stage("Build") {
if (config.buildTool == "maven") {
sh "mvn clean compile"
} else if (config.buildTool == "gradle") {
sh "gradle build"
}
}
stage("Test") {
sh "${config.testCmd ?: "mvn test"}"
}
stage("Deploy") {
if (config.deployTo) {
sh "kubectl set image deployment/${config.appName} ${config.appName}=${config.imageTag} -n ${config.deployTo}"
}
}
}
}
// 使用共享库
@Library("my-shared-library") _
myBuild(
repoUrl: "https://github.com/org/repo.git",
buildTool: "maven",
appName: "my-app",
deployTo: "staging",
imageTag: "${env.BUILD_NUMBER}"
)
| 对比项 | Jenkins | GitHub Actions |
|---|---|---|
| 托管方式 | 自托管 | 云托管/自托管 |
| 价格 | 免费 | 免费(有限) |
| 插件/生态 | 1800+ | 快速增长 |
| 学习曲线 | 陡峭 | 平缓 |
| 维护成本 | 高 | 低 |
| 适用场景 | 复杂流水线 | GitHub 原生 |
Jenkins 安装、界面操作、创建简单 Job
Pipeline 语法、插件使用、分布式构建
共享库、Docker/K8s 集成、安全配置
CI/CD 流水线设计、GitOps、大规模部署
Jenkins 是 CI/CD 领域的"老牌劲旅"。
它用 插件化架构、流水线即代码、丰富的生态 支撑了全球无数 DevOps 流水线。Jenkins 是自动化运维的核心工具。
"Jenkins 让持续集成变得简单而强大。" 🔧