练习 - 在 GitHub Actions 中使用 GitHub 脚本
在本单元中,你将详细了解如何使用 GitHub 脚本改进工作流。
向项目板添加问题
除了使用 octokit/rest.js 创建注释和打开拉取请求外,还可以使用 octokit/rest.js 来管理 GitHub 项目。 在下面的代码示例中,创建一个工作流,只要有人向存储库添加新问题,该工作流就会运行。 这会将问题添加到项目板,使你更轻松地对工作进行分类。
name: Learning GitHub Script
on:
issues:
types: [opened]
jobs:
comment:
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@0.8.0
with:
github-token: {% raw %}${{secrets.GITHUB_TOKEN}}{% endraw %}
script: |
github.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: "🎉 You've created this issue comment using GitHub Script!!!"
})
github.projects.createCard({
column_id: {{columnID}},
content_id: context.payload.issue.id,
content_type: "Issue"
});
每当创建新问题时,此工作流的第一部分都将创建注释,如上一单元中所述。 下一部分将基于此问题创建卡片,并将其添加到项目板。
将工作流分解为若干步骤
使用操作的一个好处是,可以将作业分为称作步骤的较小工作单元。 在上面的示例工作流中,可以将此工作流分为两个步骤。
将当前工作流分解为多个步骤的一个优点是,它允许使用表达式来应用逻辑。 使用步骤使你能够围绕何时允许运行步骤创建规则,并有助于优化工作流运行。
将示例工作流分解为若干步骤:
- 为每个步骤命名,以便从“操作”选项卡对其进行跟踪。
- 使用表达式来确定是否应执行步骤(可选)。
在此示例中,原始工作流文件中的两个任务已分为单个的步骤。
name: Learning GitHub Script
on:
issues:
types: [opened]
jobs:
comment:
runs-on: ubuntu-latest
steps:
- name: Comment on new issue
uses: actions/github-script@0.8.0
with:
github-token: {% raw %}${{secrets.GITHUB_TOKEN}}{% endraw %}
script: |
github.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: "🎉 You've created this issue comment using GitHub Script!!!"
})
- name: Add issue to project board
if: contains(github.event.issue.labels.*.name, 'bug')
uses: actions/github-script@0.8.0
with:
github-token: {% raw %}${{secrets.GITHUB_TOKEN}}{% endraw %}
script: |
github.projects.createCard({
column_id: {{columnID}},
content_id: context.payload.issue.id,
content_type: "Issue"
});
每个步骤都包含一个描述性 name
元素,该元素还有助于从“操作”选项卡对步骤进行跟踪。
Add issue to project board
步骤还包括一个 if
语句,该语句指定仅当问题被标记为 bug
时才应将它添加到项目板。
使用 Node.js 环境
GitHub 脚本还授予你对完整 Node.js 环境的访问权限。 虽然不建议使用 GitHub 脚本编写复杂操作的逻辑,但你可以使用它向 octo/rest.js API 添加更多功能。
一个示例是在打开问题时使用 Node.js 显示贡献指南。 可以使用 Node.js 文件系统读取文件并将其用作问题注释的正文。 若要访问存储库中的文件,请将 actions/checkout
操作作为工作流中的第一步包含在内。
以下示例对工作流文件进行了以下更改:
- 添加
action/checkout
操作以读取位于.github/ISSUE_COMMENT/comment.md
的模板化响应文件 - 添加 JavaScript,以使用 Node.js 文件系统模块将模板化响应的内容作为问题注释的正文
name: Learning GitHub Script
on:
issues:
types: [opened]
jobs:
comment:
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v2
- name: Comment on new issue
uses: actions/github-script@0.8.0
with:
github-token: {% raw %}${{secrets.GITHUB_TOKEN}}{% endraw %}
script: |
const fs = require('fs')
const issueBody = fs.readFileSync(".github/ISSUE_RESPONSES/comment.md", "utf8")
github.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: issueBody
})
- name: Add issue to project board
if: contains(github.event.issue.labels.*.name, 'bug')
uses: actions/github-script@0.8.0
with:
github-token: {% raw %}${{secrets.GITHUB_TOKEN}}{% endraw %}
script: |
github.projects.createCard({
column_id: {{columnID}},
content_id: context.payload.issue.id,
content_type: "Issue"
});
使用 GitHub 脚本,可对打开的新问题创建全面的响应。 此响应还基于存储库中的模板,因此将来可以轻松更改它。 最后,你还包含了一个触发器,用于将问题添加到项目板,以便轻松对其进行分类以备将来工作使用。