【问题标题】:How to manage per-build specific files during the Jenkins execution?如何在 Jenkins 执行期间管理每个构建的特定文件?
【发布时间】:2013-12-10 23:21:21
【问题描述】:

我开始使用 Jenkins 向 EC2 项目添加持续集成。在构建执行之后,我正在虚拟机中部署构建工件。

现在我需要在 Jenkins 中维护的中间文件有一些问题。在部署执行期间,我的胶水蚂蚁任务正在工作区/文件夹中运行。此时我需要创建几个特定于这个特定构建的中间文件。

如何维护这些文件?我知道 Jenkins 目录结构。 (詹金斯documentation link 对此)

我应该在 builds/[BUILD_ID] 文件夹下创建这些文件吗?

但是我找不到获取此文件夹绝对路径的方法。 (但是我可以从 Jenkins 中可用的 WORKSPACE 变量中扣除它)I already checked Jenkins Set Environment Variables.

【问题讨论】:

    标签: java ant jenkins jenkins-plugins jenkins-cli


    【解决方案1】:

    Jenkins 可以为每个构建存储工件。您可以指定要归档的文件夹。 (但是,我只是发现将所有需要的工件复制到一个文件夹下更容易。这样,我可以简单地指定一个文件夹,而不必担心我会丢失任何东西。)

    如果您需要根据构建部署这些文件,我会将它们作为构建工件存储在 Jenkins 中。这些存储在http://$JENKINS_URL/$JOB_NAME/$BUILD_NUMBER/artifact/... 中,其中... 是您工作区的目录结构。例如,我倾向于在 target 下构建我的 Java 项目中的所有内容,并将我的工件存储在 target/archive 文件夹下(如果所有工件都在一个文件夹下,则更容易保存它们)如果我有一个文件foo.txt 存储为工件,它的 URL 将是:

    http://$JENKINS_URL/$JOB_NAME/$BUILD_NUMBER/artifact/target/archive/foo.txt
    

    我可以使用wgetcurl 来拉下这个神器。

    您也可以决定(如果您仍然使用 Ant)将所有工件压缩或创建一个 tarball 到一个易于掌握的文件中。我就是做这个的。实际上,我的target/archive 目录中通常有三个文件:

    • 我需要部署的所有工件(包括脚本和中间文件)的 zip 文件或 tarball。
    • 一个名为 DEPLOYMENT_DIRECTIONS.txt 的文件,其中包含部署说明。
    • 名为deploy.sh 的文件是我的实际部署文件。

    在我的DEPLOYMNET_DIRECTIONS.txt 文件中有这些说明:

    1). Log onto the Server
    
    2). Execute the following curl command to download the deploy script:
    
        curl -o deploy.sh "@JENKINS_URL@job/@JOB_NAME@/@BUILD_NUMBER@/artifact/target/archive/deploy.sh"
    
        You may copy this and paste it right into the server where you're deploying.
    
    3). Run the deploy.sh script.
    
        $ bash deploy.sh
    

    在我的build.xml 里面是这样的:

        <copy todir="${archive.dir}">
            <fileset dir="${main.config.dir}">
                <include name="DEPLOYMENT_DIRECTIONS.txt"/>
                <include name="deploy.sh"/>
            </fileset>
            <filterset>
                <filter token="JOB_NAME"        value="${env.JOB_NAME}"/>
                <filter token="BUILD_NUMBER"    value="${env.BUILD_NUMBER}"/>
                <filter token="JENKINS_URL"     value="${env.JENKINS_URL}"/>
            </filterset>
        </copy>
    

    &lt;filterset&gt;@...@ 变量替换为 Jenkins 本身的环境变量。现在,我的DEPLOYMENT_DIRECTIONS.txt 看起来像这样:

    1). Log onto the Server
    
    2). Execute the following curl command to download the deploy script:
    
        curl -o deploy.sh "http://jenkins.vegicorp.com/jenkins/server_app/15/artifact/target/archive/deploy.sh"
    
        You may copy this and paste it right into the server where you're deploying.
    
    3). Run the deploy.sh script.
    
        $ bash deploy.sh
    

    您可以在服务器上从方向 #2 剪切并粘贴该行。

    几点说明:

    • 我使用curl 而不是wget,因为curl -o 将覆盖现有的deploy.sh 文件。这样,我就不必担心 wget 会在我身上下载最新的 deploy.sh.2 并且有人会意外运行旧版本的 deploy.sh
    • 我说base deploy.sh 因为我不必担心路径,也不必在deploy.sh shell 脚本上设置可执行位。告诉人们使用bash deploy.sh 比指定chmod u+x 然后使用./deploy.sh 更容易。

    希望这会有所帮助。

    顺便说一句,这是设计了三个不同的舒适度组:

    • Group #1:想要登录到正在进行部署的机器上,并选择他们想要部署的特定构建。这些组在他们想要手动部署的构建中遵循 DEPLOYMENT_DIRECTIONS.txt 文件中的三个步骤。
    • 第 2 组:他们仍然希望选择要部署的构建,但对直接从 Jenkins 执行此操作感到满意——从不登录服务器。我使用Promoted Build Plugin 来自动化DEPLOYMENT_DIRECTIONS.txt 文件中的内容。这很简单,因为它只是下载 deploy.sh 并运行它。
    • Group #3:想要自动部署每个构建。我们只需更改“Promoted Build Plugin”即可在每次成功构建后运行促销活动。

    希望这会有所帮助。

    【讨论】:

      最近更新 更多