Jenkins多代理构建在后台切换目录,导致AWS CodeDeploy插件无法压缩构建文件

147次阅读
没有评论

问题描述

在使用Jenkins进行构建时,遇到了一个问题。他使用Jenkins-configuration-as-code在Docker容器中设置了一个Jenkins服务器,并运行一个pipelineJob脚本。该脚本设置了一个监听器,监听GitHub仓库的新提交,并从该仓库中拉取Jenkinsfile来运行一个使用声明性流水线插件的作业。作业的最后一个后构建操作使用AWS CodeDeploy插件将构建的应用程序推送到一个自动扩展组中。
之前,该应用程序的前端和后端分别有两个独立的作业,分别部署每个部分,一切都正常。整个系统可以自动运行,不需要任何人工干预。
然而,现在,将两个仓库和它们的声明性流水线合并为一个,并使用多个Docker代理进行构建后,作业仍然可以构建,如果检查Jenkins服务器,它会显示构建成功,但是如果检查CodeDeploy推送更新的EC2实例,发现只有原始源文件,没有任何构建文件。
经过一番挖掘和头痛,用户发现Jenkins在后台运行git clone和codedeploy插件时,会在/var/jenkins_home/workspace/FOLDER目录下构建后端,而在/var/jenkins_home/workspace/FOLDER@2目录下构建前端。这意味着当CodeDeploy压缩所有文件时,它会丢失实际构建的所有内容。
我的问题是如何停止/修复这个问题?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在Jenkins的声明性流水线中,可以通过设置reuseNode属性为true来解决这个问题。这个属性需要在每个Docker代理中设置。
以下是在Jenkinsfile中如何实现的步骤:
1. 打开Jenkinsfile文件。
2. 在每个Docker代理的agent部分中添加reuseNode true
下面是一个示例Jenkinsfile文件:

pipeline {
    agent any
    stages {
        stage('Clone git') {
            steps {
                git 'https://github.com/REPO'
            }
        }
        stage('Backend') {
            agent {
                docker {
                    image 'golang:latest'
                    reuseNode true
                }
            }
            environment {
                GOCACHE = "${WORKSPACE}"
            }
            steps {
                dir('backend') {
                    sh 'make install'
                    sh 'make build'
                }
            }
        }
        stage('Frontend') {
            agent {
                docker {
                    image 'node:latest'
                    reuseNode true
                }
            }
            steps {
                dir('frontend') {
                    sh 'make install'
                    sh 'make build'
                }
            }
        }
    }
    post ('Deploy') {
        success {
            step([
                $class: 'AWSCodeDeployPublisher',
                applicationName: 'server_app',
                awsAccessKey: '',
                awsSecretKey: '',
                deploymentGroupAppspec: false,
                deploymentGroupName: 'server_group',
                deploymentMethod: 'deploy',
                excludes: '',
                iamRoleArn: '',
                includes: '**',
                proxyHost: '',
                proxyPort: 0,
                region: 'us-west-2',
                s3bucket: 'server-bucket',
                s3prefix: '',
                subdirectory: '',
                versionFileName: '',
                waitForCompletion: false
            ])
        }
    }
}

在上面的示例中,我们在每个Docker代理的agent部分中添加了reuseNode true。这将确保在构建时使用相同的节点,从而解决了构建文件丢失的问题。

方案2

如果方案1无法解决问题,可以尝试使用其他方法来管理构建文件的位置和传递。
另一种方法是使用其他方法来控制构建文件的位置和传递。你可以使用一些脚本或工具来手动控制构建文件的位置,并将它们传递给CodeDeploy插件。
以下是一个示例bash脚本,可以在构建后端后启动前端构建:

#!/bin/bash
# 构建后端
cd backend
make install
make build
# 将构建文件复制到前端目录
cp -r build ../frontend
# 构建前端
cd ../frontend
make install
make build

在这个示例中,我们首先进入后端目录,执行后端构建操作。然后,我们将构建文件复制到前端目录,并进入前端目录执行前端构建操作。
请注意,这只是一个示例脚本,你需要根据你的实际情况进行调整。
以上是解决这个问题的两种方案。你可以根据你的需求选择其中一种或尝试两种方案来解决问题。希望能帮到你!

正文完