是否有任何方法或解决方案可以从Jenkins Declarative Pipeline调用GitHub操作工作流?Jenkinsfile应该包括什么来调用该操作?
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”,以支持声明式管道。
Settings
Developer settings
Personal access tokens
Generate new token
.github/workflows
.yml
.yaml
我将使用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_USERNAME
YOUR_REPOSITORY_NAME
YOUR_WORKFLOW_FILE_NAME.yml
YOUR_GITHUB_TOKEN
YOUR_BRANCH_NAME
在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函数:
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
1条答案
按热度按时间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错误。
在脚本中:
YOUR_GITHUB_USERNAME
、YOUR_REPOSITORY_NAME
、YOUR_WORKFLOW_FILE_NAME.yml
、YOUR_GITHUB_TOKEN
和YOUR_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
函数:while
循环来保持轮询GitHub API,直到工作流运行状态从“queued”或“in_progress”更改为最终状态。readJSON
实用程序用于解析从GitHub API返回的JSON响应,以提取必要的详细信息,例如工作流运行ID和状态。YOUR_GITHUB_USERNAME
、YOUR_REPOSITORY_NAME
、YOUR_WORKFLOW_FILE_NAME.yml
、YOUR_GITHUB_TOKEN
和YOUR_BRANCH_NAME
替换为实际值。