我使用了@ArtemSBulgakov的解决方案作为起点,但在尝试从其他输出生成matrix
时遇到了困难,而不是显式的JSON字符串。
如果您和我一样想要以其他outputs
的方式提供matrix
,请参见下文。
在这个例子中,我想使用
octokit/request-action
操作从GitHub获取最新的拉取请求,然后对每个拉取请求进行一些检查。听起来很简单,但是将输出(即
steps.fetch.outputs.data
)转换成像这样的东西...
{
"includes": [{ "number": 1, "title": "my first pr " }]
}
...证明比我预期的要困难得多。您可能更擅长使用GitHub提供的其中一个可用的shell
,但是您仍然必须以某种方式将output
值传递给run
脚本,然后再次传出。如果有人知道一种简单的方法来做到这一点,我会很高兴看到它。
因此,我决定创建{{link2:nickofthyme/object-remap
}} GitHub操作,以使这个过程变得更容易。我不会介绍所有用法(请参阅README.md
),但使用Object filters(即.*.
)设置matrix.includes
的示例用法如下...
name: 'PR Check'
on:
schedule:
- cron: '0 0 * * *'
jobs:
fetch:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.save.outputs.json }}
steps:
- name: Fetch GH pulls
id: fetch
uses: octokit/request-action@v2.x
with:
route: GET /repos/{repo}/pulls?state=open
repo: ${{ github.repository }}
env:
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
- name: Store matrix
id: save
uses: nickofthyme/object-remap@v1
with:
include.*.number: ${{ toJSON(fromJSON(steps.fetch.outputs.data).*.number) }}
include.*.title: ${{ toJSON(fromJSON(steps.fetch.outputs.data).*.title) }}
include.*.username: ${{ toJSON(fromJSON(steps.fetch.outputs.data).*.user.login) }}
pr-checks:
name: "PR #${{ matrix.number }} - ${{ matrix.title }}"
runs-on: ubuntu-latest
needs: fetch
strategy:
matrix: ${{ fromJSON(needs.fetch.outputs.matrix) }}
fail-fast: false
steps:
- name: Echo pr number
run: echo "pr number: ${{ matrix.number }}"
- name: Echo title
run: echo "title: ${{ matrix.title }}"
- name: Echo username
run: echo "username: ${{ matrix.username }}"
例如,如果在
react
的前2个PR上运行此工作流程。
curl https://api.github.com/repos/facebook/react/pulls?per_page=2&direction=asc&state=all
steps.fetch.outputs.data
,为了简洁起见,省略了head
、base
和_links
,结果如下:
[
{
"url": "https://api.github.com/repos/facebook/react/pulls/1",
"id": 6001916,
"node_id": "MDExOlB1bGxSZXF1ZXN0NjAwMTkxNg==",
"html_url": "https://github.com/facebook/react/pull/1",
"diff_url": "https://github.com/facebook/react/pull/1.diff",
"patch_url": "https://github.com/facebook/react/pull/1.patch",
"issue_url": "https://api.github.com/repos/facebook/react/issues/1",
"number": 1,
"state": "closed",
"locked": false,
"title": "Run each test in its own <iframe>",
"user": {
"login": "benjamn",
"id": 5750,
"node_id": "MDQ6VXNlcjU3NTA=",
"avatar_url": "https://avatars.githubusercontent.com/u/5750?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/benjamn",
"html_url": "https://github.com/benjamn",
"followers_url": "https://api.github.com/users/benjamn/followers",
"following_url": "https://api.github.com/users/benjamn/following{/other_user}",
"gists_url": "https://api.github.com/users/benjamn/gists{/gist_id}",
"starred_url": "https://api.github.com/users/benjamn/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/benjamn/subscriptions",
"organizations_url": "https://api.github.com/users/benjamn/orgs",
"repos_url": "https://api.github.com/users/benjamn/repos",
"events_url": "https://api.github.com/users/benjamn/events{/privacy}",
"received_events_url": "https://api.github.com/users/benjamn/received_events",
"type": "User",
"site_admin": false
},
"body": "This is not blocking the initial launch, so feel free to put it on the back-burner for now.\n\nThe Jasmine test harness still runs in the parent window and reports to PhantomJS via `window.callPhantom`, but each test `<iframe>` has its own copy of `react-test.js` and each individual test module is required in the global context of a separate `<iframe>`.\n\nThis gives us a significant approximation of the benefits of mocking, at least in terms of isolating tests from one another.\n\ncr @jeffmo @zpao\n",
"created_at": "2013-05-29T20:20:53Z",
"updated_at": "2014-07-16T22:39:07Z",
"closed_at": "2013-06-03T17:58:02Z",
"merged_at": "2013-06-03T17:58:02Z",
"merge_commit_sha": "7a72883d48e00854a41a1cdff99a2544c1721dcc",
"assignee": null,
"assignees": [],
"requested_reviewers": [],
"requested_teams": [],
"labels": [],
"milestone": null,
"draft": false,
"commits_url": "https://api.github.com/repos/facebook/react/pulls/1/commits",
"review_comments_url": "https://api.github.com/repos/facebook/react/pulls/1/comments",
"review_comment_url": "https://api.github.com/repos/facebook/react/pulls/comments{/number}",
"comments_url": "https://api.github.com/repos/facebook/react/issues/1/comments",
"statuses_url": "https://api.github.com/repos/facebook/react/statuses/603c9ef6a8d70d3cf29ee9d0a9d7969abce48ac4",
"head": {},
"base": {},
"_links": {},
"author_association": "CONTRIBUTOR",
"auto_merge": null,
"active_lock_reason": null
},
{
"url": "https://api.github.com/repos/facebook/react/pulls/2",
"id": 6002192,
"node_id": "MDExOlB1bGxSZXF1ZXN0NjAwMjE5Mg==",
"html_url": "https://github.com/facebook/react/pull/2",
"diff_url": "https://github.com/facebook/react/pull/2.diff",
"patch_url": "https://github.com/facebook/react/pull/2.patch",
"issue_url": "https://api.github.com/repos/facebook/react/issues/2",
"number": 2,
"state": "closed",
"locked": false,
"title": "[docs] Fix button links on bottom of home",
"user": {
"login": "paulshen",
"id": 2266187,
"node_id": "MDQ6VXNlcjIyNjYxODc=",
"avatar_url": "https://avatars.githubusercontent.com/u/2266187?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/paulshen",
"html_url": "https://github.com/paulshen",
"followers_url": "https://api.github.com/users/paulshen/followers",
"following_url": "https://api.github.com/users/paulshen/following{/other_user}",
"gists_url": "https://api.github.com/users/paulshen/gists{/gist_id}",
"starred_url": "https://api.github.com/users/paulshen/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/paulshen/subscriptions",
"organizations_url": "https://api.github.com/users/paulshen/orgs",
"repos_url": "https://api.github.com/users/paulshen/repos",
"events_url": "https://api.github.com/users/paulshen/events{/privacy}",
"received_events_url": "https://api.github.com/users/paulshen/received_events",
"type": "User",
"site_admin": false
},
"body": "The buttons on the index were pointing at wrong paths.\n",
"created_at": "2013-05-29T20:31:39Z",
"updated_at": "2014-06-27T04:39:06Z",
"closed_at": "2013-05-29T20:32:25Z",
"merged_at": "2013-05-29T20:32:25Z",
"merge_commit_sha": "9aa4d2bc27c38b01c9c8f3436bd729d5e656cb1b",
"assignee": null,
"assignees": [],
"requested_reviewers": [],
"requested_teams": [],
"labels": [],
"milestone": null,
"draft": false,
"commits_url": "https://api.github.com/repos/facebook/react/pulls/2/commits",
"review_comments_url": "https://api.github.com/repos/facebook/react/pulls/2/comments",
"review_comment_url": "https://api.github.com/repos/facebook/react/pulls/comments{/number}",
"comments_url": "https://api.github.com/repos/facebook/react/issues/2/comments",
"statuses_url": "https://api.github.com/repos/facebook/react/statuses/c5b4fe9e88a9a3b43cfd9b7e5383096bd9e213ef",
"head": {},
"base": {},
"_links": {},
"author_association": "CONTRIBUTOR",
"auto_merge": null,
"active_lock_reason": null
}
]
而steps.save.outputs.json
(又名needs.fetch.outputs.matrix
)的值将是...
{
"includes": [
{
"state": "closed",
"title": "Run each test in its own <iframe>",
"username": "benjamn"
},
{
"number": 2,
"title": "[docs] Fix button links on bottom of home",
"username": "paulshen"
}
]
}
...可以轻松传递给jobs.<job_id>.strategy.matrix
,这将触发两个pr-checks
作业。
最后注意一点:我尝试只将矩阵值数组传递给jobs.<job_id>.strategy.matrix.includes
,但这会失败,因为matrix.includes
不接受GitHub 表达式作为值。因此,嵌套值在includes
中是正确的方法!