在Gitlab CI中通过参数触发Jenkins作业

104次阅读
没有评论

问题描述

有一种方法可以通过Gitlab CI使用相应的插件触发Jenkins作业。用户的问题是:

a) 是否可以触发带参数的Jenkins作业?

b) 是否可以在触发作业时传递参数?

解决方案

请注意以下操作可能涉及版本差异及修改前做好备份。

方案1:使用API触发Jenkins作业

在Gitlab CI中触发Jenkins作业的一种常见方法是通过调用Jenkins的API来实现,这样可以在触发作业时传递参数。以下是一种基本的方式:

  1. 首先,在你的Gitlab项目中创建一个.gitlab-ci.yml文件,该文件定义了Gitlab CI的流水线配置。
  2. 在流水线中的某个阶段,使用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_USERJENKINS_TOKEN需要替换为你的实际凭证。
JENKINS_JOB_URL需要替换为你的Jenkins作业的URL。

方案2:使用监控来获取作业状态

虽然上述方案触发了Jenkins作业,但它并没有监控作业的状态。如果你希望获取作业的状态并将其反馈到Gitlab CI,可以实现一个监控逻辑,以下是一个基本示例:

  1. 使用类似上述方案的方法触发Jenkins作业。
  2. 使用循环来监控Jenkins作业的状态,直到作业完成。
  3. 获取作业的执行结果,并在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系统可能会增加复杂性,你可能还需要权衡是否真正需要两者的结合。

希望这些建议能对你有所帮助!

正文完