问题描述
有一种方法可以通过Gitlab CI使用相应的插件触发Jenkins作业。用户的问题是:
a) 是否可以触发带参数的Jenkins作业?
b) 是否可以在触发作业时传递参数?
解决方案
请注意以下操作可能涉及版本差异及修改前做好备份。
方案1:使用API触发Jenkins作业
在Gitlab CI中触发Jenkins作业的一种常见方法是通过调用Jenkins的API来实现,这样可以在触发作业时传递参数。以下是一种基本的方式:
- 首先,在你的Gitlab项目中创建一个
.gitlab-ci.yml
文件,该文件定义了Gitlab CI的流水线配置。 - 在流水线中的某个阶段,使用
curl
命令调用Jenkins的API来触发作业,并通过URL参数传递所需的参数。
下面是一个示例的.gitlab-ci.yml
文件的基本结构:
stages:
- trigger-jenkins-job
variables:
MY_VARIABLE: "EVERYTHING_IS_AWESOME" # 定义要传递的参数
trigger_jenkins_job:
stage: trigger-jenkins-job
script:
- |
curl -i -X POST --user JENKINS_USER:JENKINS_TOKEN \
JENKINS_JOB_URL/buildWithParameters?MY_JENK_PARAM=${MY_VARIABLE}
在上述示例中,我们首先定义了一个需要传递的参数MY_VARIABLE
。然后,在流水线的trigger-jenkins-job
阶段中,我们使用curl
命令调用Jenkins的API来触发作业,并通过URL参数${MY_VARIABLE}
传递参数。
请注意以下几点:
– JENKINS_USER
和JENKINS_TOKEN
需要替换为你的实际凭证。
– JENKINS_JOB_URL
需要替换为你的Jenkins作业的URL。
方案2:使用监控来获取作业状态
虽然上述方案触发了Jenkins作业,但它并没有监控作业的状态。如果你希望获取作业的状态并将其反馈到Gitlab CI,可以实现一个监控逻辑,以下是一个基本示例:
- 使用类似上述方案的方法触发Jenkins作业。
- 使用循环来监控Jenkins作业的状态,直到作业完成。
- 获取作业的执行结果,并在Gitlab CI中进行相应的处理。
下面是一个简化的Python脚本示例,用于触发Jenkins作业并监控其状态:
#!/usr/bin/env python3
import argparse
import sys
import time
import requests
JENKINS_JOB_URL = "https://jenkins.example.org/job/MYJOB"
JOB_BUILD_TOKEN = "MYJOBTOKEN"
api_req = requests.Session()
api_req.headers.update(
{
"Authorization": "Basic BASIC_USER_AUTH",
"Content-Type": "application/x-www-form-urlencoded",
}
)
def main():
parser = argparse.ArgumentParser(description="Run a GitLab MR job on Jenkins and poll for the result.")
parser.add_argument("--docker-image", required=True, type=str)
parser.add_argument("--display-name", required=True, type=str)
args = parser.parse_args(sys.argv[1:])
queue_id = schedule_build(args)
exit_code = poll_build(queue_id)
sys.exit(exit_code)
def schedule_build(args: argparse.Namespace) -> int:
response = api_req.post(
f"{JENKINS_JOB_URL}/buildWithParameters?token={JOB_BUILD_TOKEN}",
data={
"docker_image": args.docker_image,
"display_name": args.display_name,
},
)
response.raise_for_status()
location_header_value = response.headers["Location"]
# 从Location头中获取队列ID
return int(location_header_value.rstrip("/").split("/")[-1])
def poll_build(queue_id: int) -> int:
for _ in range(300): # 最多尝试300次
time.sleep(15) # 间隔一段时间
response = api_req.get(f"{JENKINS_JOB_URL}/api/json?tree=builds[result,queueId,url]")
response.raise_for_status()
for build in response.json()["builds"]:
if build["queueId"] != queue_id:
continue
elif build["result"] is None:
print(".", end="", flush=True)
else:
if build["result"] == "SUCCESS":
return 0
else:
return 1
if __name__ == "__main__":
main()
在上述示例中,我们编写了一个Python脚本来触发Jenkins作业并监控其状态。脚本会定期查询作业状态,直到作业完成。一旦作业完成,脚本会返回适当的退出代码,你可以根据退出代码在Gitlab CI中做出相应的处理。
请注意,上述示例中的凭证、URL等需要根据你的实际情况进行替换。
讨论
通过上述方法,你可以实现在Gitlab CI中通过参数触发Jenkins作业,并监控作业的执行状态。这样的设置可以帮助你在CI/CD流程中更好地管理作业和参数,从而实现更灵活的流程控制。但需要注意,使用两个CI/CD系统可能会增加复杂性,你可能还需要权衡是否真正需要两者的结合。
希望这些建议能对你有所帮助!