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 샘플
반환값
리포지토리의 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 샘플
등이 있습니다. 희귀 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를 호출하는 것은 전망이 좋고 편리하지 않을까요?
Reference
이 문제에 관하여(github-script는 유용합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/bugfire/items/a2fa85fa58dd20322e3f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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"]
}
});
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'
});
We're hiring!
몇 가지 API를 호출하거나 거기에 조건을 조금 더하는 정도라면 github-script로 API를 호출하는 것은 전망이 좋고 편리하지 않을까요?
Reference
이 문제에 관하여(github-script는 유용합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/bugfire/items/a2fa85fa58dd20322e3f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)