引言
Jenkins是最流行的CI/CD工具。本文介绍Jenkins的配置和Pipeline实践。
一、Jenkins安装
1 2 3 4 5 6 7 8 9 10 11 12 13
| yum install java-11-openjdk
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key yum install jenkins
systemctl start jenkins systemctl enable jenkins
|
二、Pipeline基础
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| pipeline { agent any stages { stage('Checkout') { steps { git branch: 'main', url: 'https://github.com/user/repo.git' } } stage('Build') { steps { sh 'mvn clean package' } } stage('Test') { steps { sh 'mvn test' } } stage('Deploy') { steps { sh 'scp target/*.jar user@server:/app/' sh 'ssh user@server "systemctl restart myapp"' } } } post { success { echo 'Build succeeded!' } failure { echo 'Build failed!' } } }
|
三、Docker集成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| pipeline { agent any environment { DOCKER_REGISTRY = 'registry.example.com' IMAGE_NAME = 'myapp' IMAGE_TAG = "${BUILD_NUMBER}" } stages { stage('Build') { steps { sh 'mvn clean package' } } stage('Build Docker Image') { steps { sh """ docker build -t ${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} . docker tag ${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} ${DOCKER_REGISTRY}/${IMAGE_NAME}:latest """ } } stage('Push Image') { steps { sh """ docker push ${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} docker push ${DOCKER_REGISTRY}/${IMAGE_NAME}:latest """ } } stage('Deploy') { steps { sh """ ssh user@server "docker pull ${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}" ssh user@server "docker stop myapp || true" ssh user@server "docker rm myapp || true" ssh user@server "docker run -d --name myapp -p 8080:8080 ${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}" """ } } } }
|
四、多环境部署
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| pipeline { agent any parameters { choice(name: 'ENV', choices: ['dev', 'test', 'prod'], description: 'Environment') } stages { stage('Deploy') { steps { script { if (params.ENV == 'dev') { sh 'kubectl apply -f k8s/dev/ -n dev' } else if (params.ENV == 'test') { sh 'kubectl apply -f k8s/test/ -n test' } else if (params.ENV == 'prod') { input message: 'Deploy to production?' sh 'kubectl apply -f k8s/prod/ -n prod' } } } } } }
|
五、通知配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| post { success { emailext ( subject: "Build Success: ${env.JOB_NAME} - ${env.BUILD_NUMBER}", body: "Build succeeded!", to: 'team@example.com' ) } failure { emailext ( subject: "Build Failed: ${env.JOB_NAME} - ${env.BUILD_NUMBER}", body: "Build failed! Check ${env.BUILD_URL}", to: 'team@example.com' ) sh """ curl -X POST 'https://oapi.dingtalk.com/robot/send?access_token=xxx' \ -H 'Content-Type: application/json' \ -d '{ "msgtype": "text", "text": { "content": "Build failed: ${env.JOB_NAME}" } }' """ } }
|
总结
Jenkins CI/CD核心:
- Pipeline:声明式流水线
- 自动化:触发、构建、部署
- Docker集成:容器化部署
- 通知机制:及时反馈
参考资料