java - 如何在 Jenkins 执行期间管理每个构建的特定文件?

标签 java ant jenkins jenkins-plugins jenkins-cli

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

现在我需要在 Jenkins 中维护的中间文件存在一些问题。在部署执行期间,我的glue ant 任务从workspace/文件夹运行。此时,我需要创建几个特定于该特定构建的中间文件。

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

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

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

最佳答案

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里面一般有3个文件目录:

  • 包含部署所需的所有工件(包括脚本和中间文件)的 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>

<filterset>取代@...@变量与 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 .

希望这有帮助。

顺便说一句,这是针对三种不同舒适度的群体而设计的:

  • 组#1:想要登录到进行部署的计算机,并选择他们想要部署的特定版本。这些组遵循 DEPLOYMENT_DIRECTIONS.txt 中的三个步骤他们想要手动部署的构建中的文件。
  • 第 2 组:他们仍然希望选择要部署的构建,但愿意直接从 Jenkins 执行此操作 - 从不登录服务器。我用Promoted Build Plugin自动化 DEPLOYMENT_DIRECTIONS.txt 中的内容文件。这非常简单,因为它只是下载 deploy.sh并运行它。
  • 第 3 组:希望自动部署每个版本。我们只需更改升级构建插件即可在每次成功构建后运行升级。

希望这有帮助。

关于java - 如何在 Jenkins 执行期间管理每个构建的特定文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20507467/

相关文章:

android - 如何在构建时设置 strings.xml 值?

java - 如何以编程方式打开/关闭 Caps Lock、Scroll Lock 和 Num Lock

Java实现区间解析int

java - 是否可以将 JViewport 的标题行放在底部?

java - 避免使用 ant 并通过 eclipse 自动构建。这可能吗?

macos - Jenkins 调用 mount_smbfs 失败并出现身份验证错误

java - 设计模式来替换具有多个参数的方法

ant - 将环境变量传递给ant任务,不带ANT_OPTS

jenkins - 当使用 “sudo su”时,jenkins通过ssh挂起执行shell

jenkins - 在Blue Ocean中使用不同的jenkinsfile路径