연습 - GitHub Actions에서 GitHub Script 사용
이 단원에서는 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_RESPONSES/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 스크립트를 사용하면 새 문제에 대한 포괄적인 응답을 만들 수 있습니다. 이 응답은 리포지토리의 템플릿을 기반으로 하므로 쉽게 변경할 수 있습니다. 마지막으로, 향후 작업을 위해 쉽게 심사할 수 있도록 프로젝트 보드에 문제를 추가하는 트리거도 포함했습니다.