docker jenkins gitlab 流水线构建
场景:代码部署后,需要快速回退到上个版本。
一、jenkins 创建 job。
二、流水线执行脚本。
pipeline {agent anyenvironment {IMAGE_NAME = "web-vue"}stages {stage('Checkout') {steps {// 使用真实的 Git 仓库地址和凭据 IDgit url: 'http://host.docker.internal:8929/jqh/web-vue.git',branch: 'master', // 或者使用 'main' 如果你的默认分支是 maincredentialsId: 'gitlab-web-vue-token'}}stage('Get Git Commit Info') {steps {script {env.GIT_COMMIT_SHORT = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim()env.GIT_COMMIT_FULL = sh(script: 'git rev-parse HEAD', returnStdout: true).trim()env.GIT_COMMIT_MSG = sh(script: "git log -1 --pretty=%B ${env.GIT_COMMIT_FULL}", returnStdout: true).trim()env.GIT_AUTHOR_NAME = sh(script: "git log -1 --pretty=%an ${env.GIT_COMMIT_FULL}", returnStdout: true).trim()env.GIT_AUTHOR_EMAIL = sh(script: "git log -1 --pretty=%ae ${env.GIT_COMMIT_FULL}", returnStdout: true).trim()env.GIT_COMMIT_DATE = sh(script: "git log -1 --pretty=%cd ${env.GIT_COMMIT_FULL} --date=format:'%Y-%m-%d %H:%M:%S'", returnStdout: true).trim()env.IMAGE_TAG = "${env.IMAGE_NAME}:${env.GIT_COMMIT_SHORT}"echo "📦 提交短哈希: ${env.GIT_COMMIT_SHORT}"echo "📦 提交完整哈希: ${env.GIT_COMMIT_FULL}"echo "📦 提交注释: ${env.GIT_COMMIT_MSG}"echo "📦 提交人: ${env.GIT_AUTHOR_NAME} (${env.GIT_AUTHOR_EMAIL})"echo "📦 提交时间: ${env.GIT_COMMIT_DATE}"echo "📦 构建镜像标签: ${env.IMAGE_TAG}"}}}stage('Build Docker Image') {steps {script {def buildDate = sh(script: 'date -u +\'%Y-%m-%dT%H:%M:%SZ\'', returnStdout: true).trim()sh """docker build \\--build-arg GIT_COMMIT=${env.GIT_COMMIT_SHORT} \\--build-arg BUILD_DATE=${buildDate} \\-t ${env.IMAGE_TAG} \\-t ${env.IMAGE_NAME}:latest \\."""}}}stage('Deploy to Docker') {steps {script {sh 'docker stop my-nginx || true'sh 'docker rm my-nginx || true'sh "docker run -d --name my-nginx -p 8081:80 ${env.IMAGE_TAG}"}}}}post {success {echo "✅ 部署成功!当前运行镜像: ${env.IMAGE_TAG}"echo "✅ 提交注释: ${env.GIT_COMMIT_MSG}"echo "✅ 提交人: ${env.GIT_AUTHOR_NAME} (${env.GIT_AUTHOR_EMAIL})"echo "✅ 提交时间: ${env.GIT_COMMIT_DATE}"}failure {echo "❌ 部署失败"}}
}
三、实现每次构建都有版本标签。
# 查看当前的镜像版本
docker images web-vue
# 停止当前运行的容器
docker stop my-nginx
# 删除当前运行容器
docker rm my-nginx
# 启动回退版本的镜像容器
docker run -d --name my-nginx -p 8081:80 web-vue:83a3781
四、优化为 Jenkinsfile 文件。
pipeline {agent anyenvironment {IMAGE_NAME = "web-vue"}stages {stage('Checkout') {steps {script {echo "✅ 拉取代码成功"}}}stage('Build Image') {steps {script {sh 'docker build -t ${IMAGE_NAME}:latest .'}}}stage('Deploy') {steps {script {sh 'docker stop my-nginx || true'sh 'docker rm my-nginx || true'sh 'docker run -d --name my-nginx -p 8081:80 web-vue:latest'}}}}post {success {echo "✅ 部署成功!"}failure {echo "❌ 部署失败!"}}
}