问题描述
在使用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仓库中,以便随时选择所需版本进行部署。以下是一种可能的解决方案:
-
构建和存储构建产物:
- 修改你的流水线,使构建和部署步骤分开。
- 在构建步骤中,生成构建产物,并将其存储在一个可访问的地方,比如Azure Blob存储或私有的npm仓库。
-
使用版本控制:
- 在每次构建成功后,为该构建生成一个唯一的版本号或标签,例如通过Git的tag功能。
- 将构建产物和版本号关联起来,这样你就能够根据版本号找到对应的构建产物。
-
部署特定版本:
- 当需要重新部署特定版本时,你可以通过版本号或标签在私有npm仓库中找到对应的构建产物。
- 根据需要,将找到的构建产物部署到Azure。
需要注意的是,这个方案需要一些额外的工作,包括设置构建产物的存储和版本控制,以及在部署时根据版本号选择正确的构建产物。你可以参考Jenkins的文档、Git的版本控制功能,以及Azure的部署方法来逐步实施这个方案。
额外资源
- Jenkins Pipeline Replay
- Jenkins Issue – Replay not working for non-multibranch pipeline
- Jenkins Wiki – Storing artifacts
- Git Tags
- Azure Blob Storage
请根据你的具体情况和需求,逐步考虑并实施上述解决方案。如果需要更详细的教程,可以参考各个平台的官方文档或在线资源。
正文完