如何从 Jenkins Pipeline 调用 GitHub Actions 工作流?

Hus*_*ain 2 jenkins jenkins-groovy jenkins-pipeline github-actions

是否有任何方法或解决方案可以从 Jenkins 声明性管道调用 GitHub Actions 工作流程?

Jenkinsfile 应包含什么内容来调用所述操作?

Von*_*onC 6

您应该能够调用 API 来创建工作流调度事件请参阅Riku Rouvila
的 “如何使用 HTTP 请求触发 GitHub 操作

先决条件

  1. 生成 GitHub 令牌:创建启用必要范围的 GitHub 令牌。Settings从您的 GitHub 帐户的> Developer settings> Personal access tokens>创建此令牌Generate new token

  2. 设置您的 GitHub 存储库:您的 GitHub 存储库必须在目录中包含 GitHub Actions 工作流程文件 (.yml.yaml) .github/workflows

  3. Jenkins 设置:必须安装 Jenkins 并配置必要的插件(例如“ Pipeline ”)以支持声明式管道。

Jenkinsfile 脚本

我将使用try-catch 块添加错误处理机制并捕获 API 请求期间可能发生的 HTTP 错误。

pipeline {
    agent any 

    stages {
        stage('Invoke GitHub Actions Workflow') {
            steps {
                script {
                    try {
                        def url = "https://api.github.com/repos/YOUR_GITHUB_USERNAME/YOUR_REPOSITORY_NAME/actions/workflows/YOUR_WORKFLOW_FILE_NAME.yml/dispatches"
                        def response = sh(script: 'curl -X POST -H "Accept: application/vnd.github.v3+json" -H "authorization: Bearer YOUR_GITHUB_TOKEN" -d \'{"ref":"YOUR_BRANCH_NAME"}\' "${url}"', returnStdout: true).trim()
                        echo "Response: ${response}"
                    } catch (Exception e) {
                        echo "Failed to invoke GitHub Actions Workflow: ${e.getMessage()}"
                        currentBuild.result = 'FAILURE'
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在脚本中:

  • YOUR_GITHUB_USERNAMEYOUR_REPOSITORY_NAMEYOUR_WORKFLOW_FILE_NAME.ymlYOUR_GITHUB_TOKEN和替换YOUR_BRANCH_NAME为适当的值。
  • YOUR_GITHUB_TOKEN最好将其存储为 Jenkins 机密以确保安全。

验证 Jenkins 控制台作业执行后的输出,以确认 GitHub Actions 工作流程的成功调用。并使用 Jenkins 凭证管理来安全地处理您的机密。


我可以通过这种方式触发操作,但我得到的是空响应;我怎样才能得到以这种方式触发的操作的结果?”

获取已触发的 GitHub Actions 工作流的结果涉及一个多步骤过程,因为通过 API 触发工作流调度事件不会直接返回工作流运行的详细信息。
您需要轮询 GitHub API 以了解工作流运行的状态,直到其完成。这将涉及

  1. 触发工作流程:如上所示,通过 Jenkins 管道中的curl 命令使用 GitHub API 触发工作流程。

  2. 检索工作流程运行 ID:触发工作流程后,您需要检索工作流程运行的 ID 以获取其详细信息。这可以通过查询 GitHub API 以获取存储库的工作流运行列表来完成。您可能需要在此步骤之前引入轻微的延迟,以允许 GitHub 注册新的工作流程运行。

  3. 轮询工作流程完成:获得工作流程运行 ID 后,继续定期轮询 GitHub API 以检查工作流程运行的状态,直至其完成。

  4. 检索工作流程结果:工作流程运行完成后,使用 GitHub API 获取工作流程运行详细信息,以检索运行的最终结果。

这是一个简化的 Jenkinsfile,演示了上述策略,使用 Jenkins 中的“ Pipeline Utility Steps ”插件来使用该readJSON功能

pipeline {
    agent any 

    stages {
        stage('Invoke GitHub Actions Workflow and Get Result') {
            steps {
                script {
                    try {
                        // Step 1: Trigger the Workflow
                        def url = "https://api.github.com/repos/YOUR_GITHUB_USERNAME/YOUR_REPOSITORY_NAME/actions/workflows/YOUR_WORKFLOW_FILE_NAME.yml/dispatches"
                        sh(script: 'curl -X POST -H "Accept: application/vnd.github.v3+json" -H "authorization: Bearer YOUR_GITHUB_TOKEN" -d \'{"ref":"YOUR_BRANCH_NAME"}\' "${url}"', returnStdout: true).trim()

                        // Step 2 & 3: Get Workflow Run ID and Poll for Completion
                        def workflowRunsUrl = "https://api.github.com/repos/YOUR_GITHUB_USERNAME/YOUR_REPOSITORY_NAME/actions/runs"
                        def workflowRunID
                        def status = "queued"
                        
                        // Introduce a delay before polling for workflow run ID
                        sleep time: 10, unit: 'SECONDS'
                        
                        while (status == "queued" || status == "in_progress") {
                            def response = sh(script: "curl -H 'Accept: application/vnd.github.v3+json' -H 'authorization: Bearer YOUR_GITHUB_TOKEN' ${workflowRunsUrl}", returnStdout: true).trim()
                            def runs = readJSON text: response
                            workflowRunID = runs.workflow_runs[0].id
                            status = runs.workflow_runs[0].status

                            if (status == "queued" || status == "in_progress") {
                                sleep time: 10, unit: 'SECONDS'
                            }
                        }
                        
                        // Step 4: Retrieve the Workflow Result
                        def workflowRunDetailUrl = "${workflowRunsUrl}/${workflowRunID}"
                        def detailResponse = sh(script: "curl -H 'Accept: application/vnd.github.v3+json' -H 'authorization: Bearer YOUR_GITHUB_TOKEN' ${workflowRunDetailUrl}", returnStdout: true).trim()
                        def workflowRunDetails = readJSON text: detailResponse
                        
                        echo "Workflow Run Details: ${workflowRunDetails}"
                        
                    } catch (Exception e) {
                        echo "Failed to invoke GitHub Actions Workflow or retrieve results: ${e.getMessage()}"
                        currentBuild.result = 'FAILURE'
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 我们使用while循环不断轮询 GitHub API,直到工作流运行状态从“queued”或“in_progress”更改为最终状态。
  • readJSON实用程序用于解析从 GitHub API 返回的 JSON 响应,以提取必要的详细信息,例如工作流运行 ID 和状态。
  • YOUR_GITHUB_USERNAMEYOUR_REPOSITORY_NAME、 、YOUR_WORKFLOW_FILE_NAME.ymlYOUR_GITHUB_TOKEN和替换YOUR_BRANCH_NAME为实际值。
  • 根据工作流程的典型执行时间调整睡眠时间,以避免不必要的 API 调用。