github-script는 유용합니다.

15285 단어 GitHubActions

전치



안녕하세요 Bugfire입니다.

클라우드 워크스 Advent Calendar 2020 5일째.
또한 GitHub Actions의 주제입니다.

github-script 란 무엇입니까?



github-script은 공식 GitHub Action입니다.
인라인 JavaScript에서 인증된 GitHub API를 호출할 수 있습니다.

GitHub API는 다양할 수 있지만 공식 Actions는 모든 기능이 정의된 것은 아닙니다. 약간의 기능을 사용하기 위해서 3rd party 의 Action 를 사용하는 것도...라고 하는 때에 이 Action 가 도움이 됩니다.

물론이 환경에서 작성된 코드로 Lint 나 Test는 어렵고 복잡한 일을하기에는 적합하지 않습니다. 조금 조건 분기와 API를 호출하는 정도로하는 것이 좋습니다.

주의



Note This action is still a bit of an experiment—the API may change in future versions. 🙂

그리고 있기 때문에 변경 가능성이 있습니다.

사용법 (README에서)



반환값



리포지토리의 README에서 인용
- uses: actions/github-script@v3
  id: set-result
  with:
    script: return "Hello!"
    result-encoding: string
- name: Get result
  run: echo "${{steps.set-result.outputs.result}}"

간단하네요. return 로 반환한 것을 outputs.result 로 참조할 수 있습니다.
result-encoding 의 사양에 대해서는, htps : // 기주 b. 이 m/Ac 치온 s/기테이 bsc리 pt/bぉb/96374 에세 582f3d27d61b7로 f6d0fd209아 7058dbc/src/만. ts#L35-L49 (을)를 보면, 'string' 인가 'json' 이라고 있네요.

object 를 돌려주는 경우는 json 로 해 두면 stringify 해 줍니다만, 이용할 때는, JSON.parse() (or jq 커멘드등) 하지 않으면 안 되므로, 거기까지 편리하지 않습니다.

댓글 달기


on:
  issues:
    types: [opened]

jobs:
  comment:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/github-script@v3
        with:
          github-token: ${{secrets.GITHUB_TOKEN}}
          script: |
            github.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: '👋 Thanks for reporting!'
            })



코멘트가 붙었습니다.

라벨 붙이기


on:
  issues:
    types: [opened]

jobs:
  apply-label:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/github-script@v3
        with:
          github-token: ${{secrets.GITHUB_TOKEN}}
          script: |
            github.issues.addLabels({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              labels: ['Triage']
            })



라벨이 붙었습니다.

기타 README 샘플


  • 끌어 오기 요청이 생성되면 해당 사용자가 첫 번째 Issue에 연결하는 끌어 오기 요청이면 Welcome 주석을 발행합니다.
  • 끌어 오기 요청 차이 얻기
  • 특정 레이블이있는 Issue 검색
  • 스크립트를 다른 파일로 만들기

  • 등이 있습니다. 희귀 D 째. MD은 매우 유용합니다.

    기타 사용법



    Deployment 작성 및 Status 업데이트


    on:
      push:
    
    jobs:
      test-for-script:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/github-script@v3
            id: create-deployment
            env:
              # オプショナル
              # DEPLOY_ENVIRONMENT: 'production', 'staging' 等。デフォルトは 'production'。
              # DEPLOY_AUTO_MERGE: 'true' の場合は default branch に自動マージされる。デフォルトは 'false'。
              # DEPLOY_DESCRIPTION: 任意のメッセージ。140文字以内。デフォルトはなし。
              DEPLOY_ENVIRONMENT: staging
            with:
              script: |
                const env = process.env;
                const logUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/commit/${context.sha}/checks`
                // https://octokit.github.io/rest.js/v18
                // https://developer.github.com/v3/repos/deployments/#create-a-deployment
                // required_contexts がなくても良いと書いてあるが、ないと通らない
                const deployment = await github.repos.createDeployment({
                  ref: context.ref,
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  required_contexts: [],
                  environment: env.DEPLOY_ENVIRONMENT || 'production',
                  transient_environment: true,
                  auto_merge: env.DEPLOY_AUTO_MERGE === 'true',
                  description: env.DEPLOY_DESCRIPTION
                });
                // https://developer.github.com/v3/repos/deployments/#create-a-deployment-status
                await github.repos.createDeploymentStatus({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  deployment_id: deployment.data.id,
                  state: 'in_progress',
                  log_url: logUrl,
                  mediaType: {
                    // state を inactive, in_progress, queued にする場合は必要
                    previews: ["flash-preview", "ant-man-preview"]
                  }
                });
                return deployment.data.id.toString();
              result-encoding: string          
          - uses: actions/github-script@v3
            id: update-deployment
            env:
              # 必須
              # DEPLOY_STATUS: 'error', 'failure', 'inactive', 'in_progress', 'queued', 'pending', 'success'
              # DEPLOY_ID: デプロイメントID
              # オプショナル
              # DEPLOY_TARGET_URL: デプロイ先を指す任意 URL。Deployments ページ上で表示される。デフォルトはなし。
              # DEPLOY_DESCRIPTION: 任意のメッセージ。140文字以内。デフォルトはなし。
              DEPLOY_STATUS: 'success'
              DEPLOY_ID: '${{steps.create-deployment.outputs.result}}'
              DEPLOY_TARGET_URL: https://www.google.com/
              DEPLOY_DESCRIPTION: 'デプロイした'
            with:
              script: |
                const env = process.env;
                const logUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/commit/${context.sha}/checks`
                // https://developer.github.com/v3/repos/deployments/#create-a-deployment-status
                await github.repos.createDeploymentStatus({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  deployment_id: Number(env.DEPLOY_ID),
                  state: env.DEPLOY_STATUS,
                  log_url: logUrl,
                  environment_url: env.DEPLOY_TARGET_URL,
                  description: env.DEPLOY_DESCRIPTION,
                  mediaType: {
                    // state を inactive, in_progress, queued にする場合は必要
                    previews: ["flash-preview", "ant-man-preview"]
                  }
                });
    

    Deployment를 작성하고 Status를 작성합니다.
    배포가 완료되면 'success'로 변경하고 if failure()에서 'failure'로 변경하는 것이 좋습니다.

    step 의 if failure() 는 같은 job 이면 정의된 행보다 위의 어딘가에서 실패하면 반드시 불리기 때문에, 마지막 스텝에 예외 핸들러적으로 써 두는 것이 좋다. job을 건너면 귀찮습니다.
    (job에서 if always() or if failure()를 지정하고 다른 job의 status를 얻음으로써 DRY에 쓸 수있는 것 같습니다)

    실행하면 상단에 Environments가 생성되고,



    Deployments 페이지에서 다음과 같이 표시됩니다 (View deployment의 링크 대상은 DEPLOY_TARGET_URL입니다)



    Label에 따라 자동으로 Issue 닫기


    on:
      issues:
        types: [labeled]
    
    jobs:
      comment:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/github-script@v3
            with:
              github-token: ${{secrets.GITHUB_TOKEN}}
              script: |
                if (context.payload.label.name !== 'invalid') {
                  return;
                }
                github.issues.createComment({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  issue_number: context.issue.number,
                  body: 'Please follow the issue templates.'
                })
                github.issues.update({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  issue_number: context.issue.number,
                  state: 'closed'
                });
    

    특정 레이블 (위에서 invalid)이 부여되면 자동으로 주석을 달고 Close합니다.



    요약



    We're hiring!

    몇 가지 API를 호출하거나 거기에 조건을 조금 더하는 정도라면 github-script로 API를 호출하는 것은 전망이 좋고 편리하지 않을까요?

    좋은 웹페이지 즐겨찾기