我开始使用 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
我可以使用wget
或curl
来拉下这个工件。
您还可以决定(如果您无论如何都在使用 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/