如何从Jenkins的另一个工作中提升特定的内部版本号?

时间:2013-02-28 01:49:27

标签: build jenkins promotions

我从Promoted Build Plugin安装了Jenkins,现在我面临一些麻烦,无法从现有工作中推广构建。这是场景:

  1. 现有Nightly Build个作业每晚运行一次,运行所需的所有测试和指标;

  2. 现有Deploy Build接受参数$ {BUILD_NUMBER},并从Nightly Build

    部署具有相应$ {BUILD_NUMBER}的版本
    • 说[夜间构建]运行并成功构建了工件#39
    • 现在我可以在#39中作为参数运行[Deploy Build]
      • [Nightly Build]#39中的工件将被部署
  3. 到目前为止一切顺利。现在是我要添加Build Promotions ...

    的部分

    This is exactly what I need to achieve

    有没有办法从Nightly Build #39宣传Deploy Build注意它已经在之前构建)?或者甚至可能来自其他地方,坦率地说,我有点迷失在这里:(

    我没有看到它们具有清晰的上游/下游关系,因为它们没有:总是运行此构建,然后在执行期间运行另一个 - [Deploy Build]有时仅执行并且并不总是在[夜间建造] 之后。

2 个答案:

答案 0 :(得分:117)

从参数化触发插件版本2.23开始更新:

使用版本2.23 + behavior changed(感谢AbhijeetKamble指出)。调用( 构建 )作业的预定义参数部分传递的任何参数都必须存在于被调用者中( 部署 )工作。此外,所谓的作业参数的限制适用,因此如果被叫作业的参数是选择,则必须预先填充所有可能的值(来自促销)。或者只使用文字参数类型。

解决方案

是的,我有完全相同的设置:构建作业(基于SVN提交)和手动执行部署作业。当用户从 build 作业(包括旧版本)中选择任何版本时,他们可以转到促销状态链接并执行各种部署促销,例如部署到DEV 部署到QA

以下是如何在构建作业上设置促销:

  • 您需要这些插件:Parameterized Trigger PluginPromoted Builds Plugin
  • 您还需要在此构建作业上设置默认的存档工件构建后操作。
  • 复选标记
  • 时提升构建
  • 定义名称"部署到DEV"
  • 标准下,选中仅在手动批准时
  • 操作下,使用在其他项目上触发/调用构建
  • 要构建的项目中输入 deploy 作业的名称
  • 选中标记阻止,直到触发的项目完成构建
  • 如果触发的构建更糟或等于,请将此构建标记为失败:FAILURE(根据部署作业的状态进行调整)
  • 预定义参数(代码A)

代码A:

Server=IP_of_my_dev_server`  
Job=$PROMOTED_JOB_NAME`  
BuildSelection=<SpecificBuildSelector><buildNumber>$PROMOTED_NUMBER</buildNumber></SpecificBuildSelector>

在上面的预定义参数部分中,=左侧的名称是 deploy 作业中定义的参数。在=的右边是执行此促销时将分配给这些参数的值。定义三个参数ServerJobBuildSelection

参数Server=是我自己的,因为我的部署作业可以部署到多个服务器。但是,如果您的部署作业被硬编码为始终部署到特定位置,则您不会需要它。

Job=参数是必需的,但参数的名称取决于您在部署作业中设置的内容(我将在那里解释配置)。值$PROMOTED_JOB_NAME必须保持原样。这是促销流程知道的环境变量,并引用回 build 作业的名称(配置促销流程的作业)

BuildSelection=参数是必需的。整条线必须保持原样。传递的值是$PROMOTED_NUMBER,促销活动再次意识到这一点。在您的示例中,它将是#39

阻止,直到触发的项目完成构建复选标记将使升级过程一直等到部署作业完成。否则,升级过程将触发部署作业并成功退出。等待部署作业完成的好处是,如果部署作业失败,促销明星也将标记为失败。

(此处有一点注意:促销明星将成功 部署作业正在运行。如果部署失败,则只会在部署失败后更改为失败 deploy 作业已完成。逻辑......但如果在部署完成之前查看促销明星,可能会有点混乱)

以下是如何设置部署作业

  • 您需要Copy Artifacts plugin
  • 此版本已参数化
  • 使用名称 Server配置选择(或文字)类型的参数(此名称必须与促销中的配置相匹配上一节中的预定义参数
  • 选择:输入上一部分中促销的预定义参数将使用的可能服务器IP列表(请参阅下面的更新说明
  • 使用名称 Job配置选择(或文字)类型的参数(此名称必须与促销中的配置相匹配上一节中的预定义参数
  • 选择:默认输入构建作业的名称。 仅在手动触发部署作业时才需要此选项。当促销触发部署作业时,促销将提供值(我们配置的预定义参数中的Job=)。此外,如果促销的预定义参数没有传递任何值,则将使用第一个选择值。如果 build deploy 作业之间存在一对一关系,则可以在促销的配置中省略Job=参数。< / LI>
  • 更新 since version 2.23 of Parameterized Trigger 部署 作业配置中的可用选项必须包含所有可能的值来自促销和#39;预定义的参数。如果您不想要这个限制,请使用&#34; Text&#34;而不是&#34;选择&#34;
  • 使用名称配置构建选择器以进行复制工件的参数:BuildSelection
  • 默认选择器:最新成功构建
  • 构建步骤
  • 配置从其他项目复制工件
  • 项目名称中输入${Job}
  • 哪个版本选择Specified by a build parameter
  • 参数名称中输入BuildSelection(不含${...}!)
  • 根据将从构建作业复制到部署作业工作区的工件相应地配置其余部分
  • 根据需要使用 deploy 作业中复制的工件进行部署

现在,通过上面的部署作业,您可以手动运行它并从您要部署的 build 作业中选择哪个版本号(上次构建,上次成功,按照编号等)。您可能已经将它配置得非常相似。 build 作业上的升级基本上会执行相同的操作,并根据执行的促销提供内部版本号。

如果您对说明有任何疑问,请与我们联系。

答案 1 :(得分:1)

标记的答案是对该问题的很好解释。但是我想为那些寻求“如何从另一个工作中抽出一个特定的构建编号的人”提出解决方案

我们可以使用通用解决方案来使用CURL和REST API进行强制升级。您可以从Shell或Groovy脚本执行curl。

使用CURL的Shell解决方案:

    user_name="jenkins_user"
    user_token="token" 
    promotion_name="Test_Promote"
    jenkins_url="http://build-server.com"
    JOB_NAME="job_name"
    JOB_NO="job-no"

    url="--silent -u $user_name:$user_token $jenkins_url/job/$JOB_NAME/$JOB_NO/promotion/forcePromotion?name=$promotion_name"
    curl $url


Groovy Soultion:
        user_name="jenkins_user"
        user_token="token" 
        promotion_name="Test_Promote"
        jenkins_url="http://build-server.com"
        JOB_NAME="job_name"
        JOB_NO="job-no"


def response = "curl -u $user_name:$user_token \" $jenkins_url/job/$JOB_NAME/$JOB_NO/promotion/forcePromotion?name=$promotion_name".execute().text

如何生成詹金斯用户令牌:https://jenkins.io/blog/2018/07/02/new-api-token-system/