docker jenkins gitlab 流水线构建

场景:代码部署后,需要快速回退到上个版本。

一、jenkins 创建 job。

二、流水线执行脚本。

复制代码
pipeline {
    agent any

    environment {
        IMAGE_NAME = "web-vue"
    }

    stages {
        stage('Checkout') {
            steps {
                // 使用真实的 Git 仓库地址和凭据 ID
                git url: 'http://host.docker.internal:8929/jqh/web-vue.git',
                    branch: 'master',  // 或者使用 'main' 如果你的默认分支是 main
                    credentialsId: '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 any

    environment {
        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 "❌ 部署失败!"
        }
    }
}
相关推荐
qq75903536631 分钟前
2026 docker run启动的容器通过命令导出为docker-composer.yml文件
docker·eureka·composer
lisanmengmeng44 分钟前
gitlab 免密配置
linux·服务器·gitlab
Java 码思客1 小时前
【ElasticSearch从入门到架构师】第7章-聚合查询——实现数据统计与分析
大数据·elasticsearch·jenkins
极客先躯2 小时前
高级java每日一道面试题-2026年02月03日-实战篇[Docker]-如何备份和恢复 Docker Volume?
运维·docker·容器·自动化·备份·持久化·恢复
“码”力全开2 小时前
基于 Docker 与边缘计算的 AI 视频管理平台:打破 GB28181/RTSP 协议壁垒与源码交付架构解析
人工智能·docker·边缘计算
江湖有缘2 小时前
自建私有任务管理平台|Docker Compose部署Ticky完整教程
运维·docker·容器
ai产品老杨2 小时前
破局多路异构计算:基于 Docker 容器化与 GB28181/RTSP 统一接入的 AI 边缘计算视频管理平台架构解析
人工智能·docker·边缘计算
梦想的颜色2 小时前
Docker 知识全貌:一份体系化的知识结构报告
docker·云原生·容器·eureka
求知若渴,虚心若愚。2 小时前
Jenkins 自动化流水线(CICD)
运维·自动化·gitlab
“码”力全开4 小时前
架构师视角的自研流媒体中台:基于 Docker、GB28181 与 RTSP 的边缘计算 AI 平台,源码交付赋能二次开发
人工智能·docker·边缘计算