如何从Jenkins Pipeline中删除GitHub操作工作流?

mnemlml8  于 2023-10-17  发布在  Jenkins
关注(0)|答案(1)|浏览(169)

是否有任何方法或解决方案可以从Jenkins Declarative Pipeline调用GitHub操作工作流?
Jenkinsfile应该包括什么来调用该操作?

kcrjzv8t

kcrjzv8t1#

您应该能够调用API来创建工作流调度事件。
参见Riku Rouvila中的“How to trigger a GitHub action with an HTTP request

预处理

1.生成GitHub Token:创建一个GitHub token,并启用必要的作用域。从您的GitHub帐户在Settings> Developer settings> Personal access tokens> Generate new token下创建此令牌。
1.设置您的GitHub仓库:您的GitHub存储库必须在.github/workflows目录中包含GitHub操作工作流文件(.yml.yaml)。
1.Jenkins设置:Jenkins必须安装并配置必要的插件,如“Pipeline”,以支持声明式管道。

Jenkinsfile脚本

我将使用try-catch block来添加错误处理机制,并捕获在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'
                    }
                }
            }
        }
    }
}

在脚本中:

  • YOUR_GITHUB_USERNAMEYOUR_REPOSITORY_NAMEYOUR_WORKFLOW_FILE_NAME.ymlYOUR_GITHUB_TOKENYOUR_BRANCH_NAME替换为适当的值。
  • YOUR_GITHUB_TOKEN最好存储为Jenkins secret,以确保安全性。

在Jenkins控制台中验证作业执行后的输出,以确认GitHub操作工作流的成功调用。使用Jenkins凭据管理来安全地处理您的秘密。
我可以用这种方式触发动作,但我得到的是一个空的响应;我怎样才能得到这样触发的操作的结果呢?“
获取触发的GitHub操作工作流的结果涉及多步骤过程,因为通过API触发工作流调度事件不会直接返回工作流运行的详细信息。
您需要轮询GitHub API以获取工作流运行的状态,直到它完成。这将涉及
1.触发工作流:如上所示,通过Jenkins管道中的curl命令使用GitHub API触发工作流。
1.删除工作流运行ID:触发工作流后,您需要检索工作流运行的ID以获取其详细信息。这可以通过查询GitHub API来获得存储库的工作流运行列表来完成。您可能需要在此步骤之前引入一个轻微的延迟,以允许GitHub注册新的工作流运行。
1.工作流完成轮询:获得工作流运行ID后,定期轮询GitHub API以检查工作流运行的状态,直到完成。
1.查询工作流结果:工作流运行完成后,使用GitHub API获取工作流运行详细信息,以检索运行的最终结果。
下面是一个简化的Jenkins文件,演示了上述策略,使用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'
                    }
                }
            }
        }
    }
}
  • 我们使用while循环来保持轮询GitHub API,直到工作流运行状态从“queued”或“in_progress”更改为最终状态。
  • readJSON实用程序用于解析从GitHub API返回的JSON响应,以提取必要的详细信息,例如工作流运行ID和状态。
  • YOUR_GITHUB_USERNAMEYOUR_REPOSITORY_NAMEYOUR_WORKFLOW_FILE_NAME.ymlYOUR_GITHUB_TOKENYOUR_BRANCH_NAME替换为实际值。
  • 根据工作流的典型执行时间调整休眠时间,以避免不必要的API调用。

相关问题