通过脚本触发 Jenkins Job 运行

Published: 2024-01-18
Updated: 2024-06-18

Tags: Jenkins CI/CD

本文总阅读量

本文介绍通过脚本的方式触发 Jenkins Job 执行,注意事项主要是分清楚两个 Token 为 Authentication Token 和 API Token,并在脚本中对携带用户认证信息。

如果你需要从 SCM(Github、Gitlab、Bitbucket 等)自动触发,可以考虑使用 Generic Webhook Trigger,可以参考这篇:提交代码自动触发 Jenkins 构建(Github、Gitlab、Bitbucket)

或者使用特定的 SCM 插件如 Gitlab Plugin,提供了 “Build when a change is pushed to GitLab” 选项。

启用 Trigger builds remotely (e.g., from scripts)

填入随机值作为 Job 的 Authentication Token

生成用户的 API Token

位置在 “用户” - “Configure” - “API Token”,新增一个用户 Token

名称填写描述 Token 用户的信息即可,生成的 API Token 保存好,刷新页面后将不再可见。

Jenkins Job 触发地址

需要注意的是,Jenkins 页面上提示的 token=TOKEN_NAME 很不准确,此处的 TOKEN_NAME 指代第一步配置的 Authentication Token,这也是记录本文的原动力,又一次误导我

# 不携带参数
JENKINS_URL/job/diamond/job/develop/job/test-trigger-build/build?token=TOKEN_NAME

# 携带参数
JENKINS_URL/job/diamond/job/develop/job/test-trigger-build/buildWithParameters?token=TOKEN_NAME

替换参数后,在浏览器打开即可触发构建。

使用 buildWithParameters 时,自定义参数可以通过 &param1=value1&params2=value2 补充到路径后进行传递

通过脚本触发

注意替换变量值

Python3 脚本

import requests

JOB_AUTH_TOKEN = "YT7ivRT2GwcDxCfN"
JENKINS_USERNAME = "<your-jenkins-user-name>" # 在用户页面的 URL 路径上可以看到
JENKINS_USER_API_TOKEN = "11d9732***********2f3212" # 第二步生成的 API Token

jenkins_url = f"https://<your-jenkins-host>/job/<your-jobname>/build?token={JOB_AUTH_TOKEN}"
auth = (JENKINS_USERNAME, JENKINS_USER_API_TOKEN)  # Jenkins用户名和API Token

print(jenkins_url)

response = requests.get(jenkins_url, auth=auth)

if response.status_code == 201:
    print("Jenkins build triggered successfully")
else:
    print("Failed to trigger Jenkins build. Status code:", response.status_code)

Bash 脚本

JOB_AUTH_TOKEN="YT7ivRT2GwcDxCfN"
JENKINS_USERNAME="<your-jenkins-user-name>"
JENKINS_USER_API_TOKEN="11d9732***********2f3212"
JENKINS_HOST="<your-jenkins-host>"
JOB_NAME="<your-jobname>"

curl -u "$JENKINS_USERNAME:$JENKINS_USER_API_TOKEN" -X GET "https://$JENKINS_HOST/job/$JOB_NAME/build?token=$JOB_AUTH_TOKEN"

Bash 脚本(循环)

#!/bin/bash

JOB_AUTH_TOKEN="YT7ivRT2GwcDxCfN"
JENKINS_USERNAME="<your-jenkins-user-name>"
JENKINS_USER_API_TOKEN="11d9732***********2f3212"
JENKINS_HOST="<your-jenkins-host>"
JOB_NAME="<your-jobname>"

# Jenkins URL模板
BASE_URL="$JENKINS_HOST/job/$JOB_NAME/buildWithParameters?token=$JOB_AUTH_TOKEN"

# 其他固定参数
FIXED_PARAMS="&code_version=1.5.41&replicas=retain&cpu_request=retain&cpu_limit=retain&mem_request=retain&mem_limit=retain"

# 服务名称列表
service_names=("app1" "app2")

# 循环调用并替换 service_name
for service_name in "${service_names[@]}"
do
    # 构建完整的URL
    URL="${BASE_URL}&service_name=${service_name}${FIXED_PARAMS}"

    # 调用 Jenkins 构建 URL
    echo "Calling: $service_name"
    echo "Calling: $URL"
    curl -u "$JENKINS_USERNAME:$JENKINS_USER_API_TOKEN" -X GET "$URL"

    # 等待 30 秒
    sleep 30
done