연습 - 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 단계에는 bug 레이블이 지정된 경우에만 프로젝트 보드에 문제를 추가해야 한다고 지정하는 if 문이 포함되어 있습니다.

Node.js 환경 사용

또한 GitHub 스크립트는 전체 Node.js 환경에 대한 액세스 권한을 부여합니다. GitHub 스크립트는 복잡한 작업에 대한 논리를 작성하는 데 권장되지는 않지만 이를 사용하여 octo/rest.js API에 더 많은 기능을 추가할 수 있습니다.

한 가지 예는 Node.js를 사용하여 문제가 열릴 때마다 기여 가이드를 표시하는 것입니다. Node.js 파일 시스템을 사용하여 파일을 읽고 문제 주석의 본문으로 사용할 수 있습니다. 리포지토리 내의 파일에 액세스하려면 워크플로의 첫 번째 단계로 actions/checkout 작업을 포함합니다.

아래 예제에서는 워크플로 파일을 다음과 같이 변경합니다.

  • .github/ISSUE_COMMENT/comment.md에 있는 템플릿 응답 파일을 읽는 action/checkout 작업을 추가합니다.
  • 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 스크립트를 사용하면 열려 있는 새 문제에 대한 포괄적인 응답을 만드는 데 도움이 됩니다. 이 응답은 리포지토리의 템플릿을 기반으로 하므로 나중에 쉽게 변경할 수 있습니다. 마지막으로, 향후 작업을 위해 쉽게 심사할 수 있도록 프로젝트 보드에 문제를 추가하는 트리거도 포함했습니다.