Jenkins如何使用特定提交重新运行旧构建

108次阅读
没有评论

问题描述

在使用Jenkins时,用户想要实现回滚功能,即重新运行旧的构建。用户的流程是获取Beanstalk的Webhook(基于Git的版本控制),构建项目,获取构建产物并部署到Azure。然而,用户发现在进行“重新运行”操作时,并不会获取实际构建运行的提交,而是获取当前代码库的最新提交。因此,用户希望找到一种方法,能够重新运行特定提交上的构建。

以下是用户的Jenkins流水线脚本:

pipeline {
    agent any
    stages {
        stage('Install Dependencies') {
            steps {
                bat 'npm install'
            }
        }
        stage('Build the Project') {
            steps {
                bat 'npm run build'
            }
        }
        stage('Deploy to Azure Prod') {
            when {
                environment name: 'REPOSITORY_BRANCH', value: 'master'
                beforeAgent true
            }
            steps {
                timeout(time: 5, unit: 'DAYS') {
                    input message: 'Approve Deployment?'
                }
                azureWebAppPublish azureCredentialsId: env.AZURE_CRED_ID,
                                   resourceGroup: env.RES_GROUP,
                                   appName: env.WEB_APP,
                                   filePath: "**/*.*",
                                   sourceDirectory: "build"
            }
        }
        stage('Deploy to Azure Development') {
            when {
                environment name: 'REPOSITORY_BRANCH', value: 'development'
                beforeAgent true
            }
            steps {
                azureWebAppPublish azureCredentialsId: env.AZURE_CRED_ID,
                                   resourceGroup: env.RES_GROUP,
                                   appName: env.WEB_APP,
                                   filePath: "**/*.*",
                                   sourceDirectory: "build"
            }
        }
    }
    post {
        always {
            archiveArtifacts artifacts: "build/**/*.*", onlyIfSuccessful: true
            cleanWs()
        }
        success {
            mail bcc: '', body: "<b>Example</b><br>Project: ${env.JOB_NAME} <br>Build Number: ${env.BUILD_NUMBER} <br> URL de build: ${env.BUILD_URL}",
                 cc: '', charset: 'UTF-8', from: '', mimeType: 'text/html', replyTo: '',
                 subject: "ERROR CI: Project name -> ${env.JOB_NAME}", to: "";
        }
    }
}

解决方案

请注意以下操作可能会受到版本差异及风险。根据具体情况酌情使用。

短期解决方案

短期内,你可以尝试使用Jenkins的”Replay”功能,但需要注意该功能在多分支流水线中才能正常工作。你可以阅读Jenkins官方文档中有关”Replay”的章节以获取更多信息。然而,需要注意的是,由于存在一个已知的问题,”Replay”功能在非多分支流水线中可能无法按预期工作。

长期解决方案

长期来看,建议将构建和部署过程分开,并将构建产物存储在私有的npm仓库中,以便随时选择所需版本进行部署。以下是一种可能的解决方案:

  1. 构建和存储构建产物:

    • 修改你的流水线,使构建和部署步骤分开。
    • 在构建步骤中,生成构建产物,并将其存储在一个可访问的地方,比如Azure Blob存储或私有的npm仓库。
  2. 使用版本控制:

    • 在每次构建成功后,为该构建生成一个唯一的版本号或标签,例如通过Git的tag功能。
    • 将构建产物和版本号关联起来,这样你就能够根据版本号找到对应的构建产物。
  3. 部署特定版本:

    • 当需要重新部署特定版本时,你可以通过版本号或标签在私有npm仓库中找到对应的构建产物。
    • 根据需要,将找到的构建产物部署到Azure。

需要注意的是,这个方案需要一些额外的工作,包括设置构建产物的存储和版本控制,以及在部署时根据版本号选择正确的构建产物。你可以参考Jenkins的文档、Git的版本控制功能,以及Azure的部署方法来逐步实施这个方案。

额外资源

请根据你的具体情况和需求,逐步考虑并实施上述解决方案。如果需要更详细的教程,可以参考各个平台的官方文档或在线资源。

正文完