在不使用 TFS 插件的情况下从 Jenkins 触发 Azure Devops 发布管道
Trigger Azure Devops Release pipeline from Jenkins without using TFS plugin
简要背景。我的团队将 Jenkins 用于 CI,但(除其他事项外)我们将输出传递到 Azure Devops 发布管道,以用于下游测试。我们目前有一个工作系统,但它使用 Jenkins Team Foundation Server/TFS 插件(触发 Azure Devops 版本)和 azure-pipelines-tasks 的特定功能(从 Jenkins 提取工件)。问题是前者在最近版本的 Jenkins 中被故意禁用(出于许可和安全问题),而后者同样有一个与 Jenkins 对话的错误。基本上我们停留在 Jenkins 2.263.1 上,没有迹象表明这将得到纠正。使用完全不同的方法似乎是明智的。
直觉上,我们需要能够以编程方式触发发布管道。此外,我需要传输工件——我不知道是 Jenkins 会推送还是 ADevops 会拉取——我猜后者更接近当前。不管怎样,我想知道是否有人已经说明了如何执行此操作以避免我们重新发明轮子。
安装 TEE-CLC 并从 shell?
调用 CLI 命令
这似乎是 MS 对他们正式拥有的 Azure 插件的建议 announced abandoning。
当然,现在他们已经悄悄地宣布 won't maintain that either,所以我猜暗示的信息是“去使用 github?”
在经历了 Azure REST API 之后,主要是 here 和一些实验,我可以报告我的工作内容。
因为原来的工作是Traditional/Freestyle(插件不支持流水线),所以我保留了工作,但用bash脚本替换了插件步骤,运行在无论如何,我在那里进行了“存档”步骤。此脚本中的关键语句是:
curl -X POST -f \
-H "Authorization: Basic ${SERVICE_TOKEN_B64}" \
-H "Content-Type: application/json" \
-d "{\"definitionId\":${RELEASE_DEFINITION_ID},\"description\":\"Triggered by ${BUILD_TAG}\",\"isDraft\":false,\"artifacts\":[{\"alias\":\"_${JOB_BASE_NAME}\",\"instanceReference\":{\"id\":\"${BUILD_NUMBER}\",\"name\":\"${BUILD_DISPLAY_NAME}\"}}]" \
-o output.json \
"${AZURE_URL}/${ORGANISATION}/${PROJECT_NAME}/_apis/release/releases?api-version=5.0"
各种宏主要是在上面的一个“Inject Environment Variables”中设置的。
AZURE_URL 这里是“https://vsrm.dev.azure.com”,但如果你有自己的 Azure 企业实例,我想可能是别的东西。 ORGANIZATION 和 PROJECT_NAME 应该是显而易见的。
不太明显的是RELEASE_DEFINITION_ID。您可以通过 REST API 进行查询,然后给出您正在处理的发布(管道)的名称 - 本质上,API 中的发布定义等同于 Web UI。但是,最简单的方法是在 Web UI 中导航到您感兴趣的发布管道(而不是单个发布 job/instance)。如果您为此查看 URL,您将看到 definitionId=XXX 作为参数。您想要 XXX 值。
SERVICE_TOKEN_B64 是一个合适的 PAT,可以处理成不同的格式。您真正想要的是获取以下输出:
printf "%s"":$PAT" | base64
并将其作为机密文本保存在 Jenkins 凭据系统中。请注意,插件可以即时执行此操作(使用凭据系统中的用户名和 PAT),但如果您在 bash 脚本中执行此操作,它将(通常)在日志中显示此修改后的令牌 - 哪种类型的击败对象。
这留下了工件。我花了很长时间才发现 i) 你需要工件和 ii) 有效负载非常重要。我认为我们有一个相当标准的设置,其中在 Azure 发布管道上有一个“Jenkins”工件。对于默认版本,我们有“在发布创建时指定”——我没有设置 Azure 发布管道,但我怀疑所有这些都相当标准。有了这个,工件部分是至关重要的,如果没有它(或设置为空数组),我会收到 400 个错误,这让我感到困惑 - 我提出了一个平行问题 。回顾这个场景是相当简单的。工件负载本身是:
[{"alias":"_${JOB_BASE_NAME}","instanceReference":{"id":"${BUILD_NUMBER}","name":"${BUILD_DISPLAY_NAME}"}}]
别名值是 Azure 发布管道中工件名称的别名 - 不确定仅在作业前加上“_”是标准的,还是只是设置管道的人使用的约定。我认为其他值可以被视为魔术,但我的猜测是“id”是 Jenkins 作业实例使用的实际值,从中提取工件本身(Jenkins 作业名称来自 Azure 管道设置)和“名称”用于 displaying/logging。如前所述,这适用于我们的目的,但您的用法可能有所不同。
简要背景。我的团队将 Jenkins 用于 CI,但(除其他事项外)我们将输出传递到 Azure Devops 发布管道,以用于下游测试。我们目前有一个工作系统,但它使用 Jenkins Team Foundation Server/TFS 插件(触发 Azure Devops 版本)和 azure-pipelines-tasks 的特定功能(从 Jenkins 提取工件)。问题是前者在最近版本的 Jenkins 中被故意禁用(出于许可和安全问题),而后者同样有一个与 Jenkins 对话的错误。基本上我们停留在 Jenkins 2.263.1 上,没有迹象表明这将得到纠正。使用完全不同的方法似乎是明智的。
直觉上,我们需要能够以编程方式触发发布管道。此外,我需要传输工件——我不知道是 Jenkins 会推送还是 ADevops 会拉取——我猜后者更接近当前。不管怎样,我想知道是否有人已经说明了如何执行此操作以避免我们重新发明轮子。
安装 TEE-CLC 并从 shell?
调用 CLI 命令这似乎是 MS 对他们正式拥有的 Azure 插件的建议 announced abandoning。
当然,现在他们已经悄悄地宣布 won't maintain that either,所以我猜暗示的信息是“去使用 github?”
在经历了 Azure REST API 之后,主要是 here 和一些实验,我可以报告我的工作内容。
因为原来的工作是Traditional/Freestyle(插件不支持流水线),所以我保留了工作,但用bash脚本替换了插件步骤,运行在无论如何,我在那里进行了“存档”步骤。此脚本中的关键语句是:
curl -X POST -f \
-H "Authorization: Basic ${SERVICE_TOKEN_B64}" \
-H "Content-Type: application/json" \
-d "{\"definitionId\":${RELEASE_DEFINITION_ID},\"description\":\"Triggered by ${BUILD_TAG}\",\"isDraft\":false,\"artifacts\":[{\"alias\":\"_${JOB_BASE_NAME}\",\"instanceReference\":{\"id\":\"${BUILD_NUMBER}\",\"name\":\"${BUILD_DISPLAY_NAME}\"}}]" \
-o output.json \
"${AZURE_URL}/${ORGANISATION}/${PROJECT_NAME}/_apis/release/releases?api-version=5.0"
各种宏主要是在上面的一个“Inject Environment Variables”中设置的。 AZURE_URL 这里是“https://vsrm.dev.azure.com”,但如果你有自己的 Azure 企业实例,我想可能是别的东西。 ORGANIZATION 和 PROJECT_NAME 应该是显而易见的。
不太明显的是RELEASE_DEFINITION_ID。您可以通过 REST API 进行查询,然后给出您正在处理的发布(管道)的名称 - 本质上,API 中的发布定义等同于 Web UI。但是,最简单的方法是在 Web UI 中导航到您感兴趣的发布管道(而不是单个发布 job/instance)。如果您为此查看 URL,您将看到 definitionId=XXX 作为参数。您想要 XXX 值。
SERVICE_TOKEN_B64 是一个合适的 PAT,可以处理成不同的格式。您真正想要的是获取以下输出:
printf "%s"":$PAT" | base64
并将其作为机密文本保存在 Jenkins 凭据系统中。请注意,插件可以即时执行此操作(使用凭据系统中的用户名和 PAT),但如果您在 bash 脚本中执行此操作,它将(通常)在日志中显示此修改后的令牌 - 哪种类型的击败对象。
这留下了工件。我花了很长时间才发现 i) 你需要工件和 ii) 有效负载非常重要。我认为我们有一个相当标准的设置,其中在 Azure 发布管道上有一个“Jenkins”工件。对于默认版本,我们有“在发布创建时指定”——我没有设置 Azure 发布管道,但我怀疑所有这些都相当标准。有了这个,工件部分是至关重要的,如果没有它(或设置为空数组),我会收到 400 个错误,这让我感到困惑 - 我提出了一个平行问题
[{"alias":"_${JOB_BASE_NAME}","instanceReference":{"id":"${BUILD_NUMBER}","name":"${BUILD_DISPLAY_NAME}"}}]
别名值是 Azure 发布管道中工件名称的别名 - 不确定仅在作业前加上“_”是标准的,还是只是设置管道的人使用的约定。我认为其他值可以被视为魔术,但我的猜测是“id”是 Jenkins 作业实例使用的实际值,从中提取工件本身(Jenkins 作业名称来自 Azure 管道设置)和“名称”用于 displaying/logging。如前所述,这适用于我们的目的,但您的用法可能有所不同。