์ด๋ฒ์ ์ฌ๋ด์์ ๋ฉ์ผ ํ ํ๋ฆฟ์ ๊ด๋ฆฌํ๋ ํ๋ก์ ํธ์ ๋ฐฐํฌ ๋ฐฉ์์ ๋ณ๊ฒฝํ๋ ์ ๋ฌด๋ฅผ ๋งก์ ์งํํ๋ฉฐ
Github Action (์ดํ GHA)์ ๋ค๋ค๋ณผ ๊ธฐํ๊ฐ ์๊ฒผ์ต๋๋ค.
GHA๋ก PR์์ ํน์ comment ๋ฅผ ๋จ๊ธฐ๋ฉด, ๋ณ๊ฒฝ์ฌํญ์ ๋ฐฐํฌํด์ฃผ๋ ์๋ํ ํ๋ก์ธ์ค๋ฅผ ๋ง๋ค๊ณ ์ถ์๋๋ฐ
GHA ์ฌ์ฉ์ด ์ฒ์์ด๋ผ ๊ฝค๋ ๋ง์ ์ฝ์ง์ ํด์ ๋น์ทํ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์ถ์ ๋ถ๋ค์ ์ํด ๊ธฐ๋ก์ ๋จ๊ธฐ๋ ค๊ณ ํฉ๋๋ค.
๐ PR comment echo ํ ์คํธํ๊ธฐ
์ฐ์ PR์์ ํน์ ๋ช ๋ น์ด๋ฅผ ๋ด์ ๋๊ธ์ ๋จ๊ธฐ๋ฉด, ์ด๋ฅผ ๊ฐ์งํ๋ workflow ๋ฅผ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
release
๋ผ๋ comment ๋ฅผ ๋จ๊ธฐ๋ฉด workflow ๊ฐ ํด๋น PR ์ ๋๊ธ๋ก ์๋ตํด์ฃผ๋ workflow ๋ฅผ ์์ฑํฉ๋๋ค.
comment ์ถ๊ฐ๋ issue_comment
event ๋ฅผ ํตํด ๊ฐ์งํ ์ ์์ต๋๋ค.
comment ์์ฑ์ github ์ REST API ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋๋ฐ, curl
์ ์ด์ฉํ๋ ๋์
github-script
action์ ์ฌ์ฉํ๋ฉด workflow ์์ JavaScript ๋ฅผ ์ด์ฉํ REST API ๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
name: Pull request comment
on:
issue_comment:
types: [created, edited]
jobs:
pull_request_comment:
runs-on: ubuntu-latest
if: github.event.issue.pull_request && contains(github.event.comment.body, 'release')
steps:
- name: Add comment
if: contains(github.event.comment.body, 'release')
uses: actions/github-script@v6
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: '๐ release'
})
โ ๏ธ ๋ง์ฝ ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋๋ค๋ฉด..
createComment
์์ ๊ถํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ฉด workflow ์ permission ์ ํ์ธํด๋ณด์๋ฉด ๋ฉ๋๋ค.
repository setting > actions > general ์์ ๋ณ๊ฒฝ ๊ฐ๋ฅํฉ๋๋ค.
๐ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก release bot ์ ๋ง๋ค์ด๋ด ์๋ค.
release comment ํ์
์์์ ์์ฑํ workflow ๋ฅผ ๋ฐํ์ผ๋ก ๋ณธ๊ฒฉ์ ์ผ๋ก release bot ์ ๋ง๋ค์ด๋ด ์๋ค.
์ฃผ์ด์ง ์ต์ ์ ๋ฐ๋ผ ๋น๋ ์กฐ๊ฑด์ ๋ค๋ฅด๊ฒ ํ๊ณ ์ถ์๋๋ฐ, ๋ค์์ ๊ทธ ์์์ ๋๋ค.
// ์์ : release-<๋น๋ํ๊ฒฝ> <์ต์
> <ํ์ผ ํน์ ๋๋ ํ ๋ฆฌ๋ช
>
/release-staging file air-refund
/release-production directory air
issue comment trigger ๊ธฐ์ค์ ์ ์ํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก issue comment
event ๋ repository default branch ๋ฅผ ๊ธฐ์ค์ผ๋ก workflow ๊ฐ ์คํ๋ฉ๋๋ค.
์ด๋ฒ์ ๊ตฌํํ release bot ์ ํน์ ์์ ๋ธ๋์น PR์์ ๋ณ๊ฒฝ์ด ๋ฐ์ํ ๋ชจ๋ ํ์ผ๋ค์ ์กฐํํด์
๋ฐฐํฌ๊ฐ ํ์ํ ํ ํ๋ฆฟ๋ค์ ์ถ์ถํ๋ ๊ณผ์ ์ด ํ์ํ์ต๋๋ค.
์ด๋ ๊ณง main ๋ธ๋์น HEAD ์ ํ์ฌ ์์ ์ค์ธ PR ๋ธ๋์น HEAD ์ฌ์ด์ ๋ชจ๋ ๋ณ๊ฒฝํ์ผ ์กฐํ๊ฐ ํ์ํ ๊ฒ์ธ๋ฐ,
์ด ๋๋ฌธ์ comment ๋ฅผ ๋จ๊ธด ํ๊ฒ ๋ธ๋์น๋ก checkout ํด์ค์ผํฉ๋๋ค.
์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ๋จผ์ issue number
๋ก PR ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ค๊ณ , HEAD SHA ๋ฅผ ์ด์ฉํด์ checkout ํฉ๋๋ค.
name: release comment
on:
issue_comment:
types: [created, edited]
jobs:
release-comment:
if: github.event.issue.pull_request && contains(github.event.comment.body, 'release-')
runs-on: ubuntu-latest
steps:
- name: fetch branch
id: fetch-branch
uses: actions/github-script@v6
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
try {
const pr = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.issue.number
})
return pr.data
} catch (err) {
core.setFailed(`โ Request failed with error ${err}`)
}
- name: checkout to branch
uses: actions/checkout@v3
with:
ref: ${{ fromJSON(steps.fetch-branch.outputs.result).head.sha }}
fetch-depth: 0
๋ช ๋ น์ด ํ์ฑํด์ ์ ๋ฌํ๊ธฐ
์ด์ shell script๋ก command line์ ํ์ฑํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ workflow ํ๊ฒฝ๋ณ์๋ก ์ถ๊ฐํฉ๋๋ค.
jobs:
release-comment:
// ...
- name: Define release options
run: |
comment="${{ github.event.comment.body }}"
args=($comment)
PHASE=$(echo "${args[0]}" | cut -d"-" -f 2)
TYPE=${args[1]}
SLUG=${args[2]}
echo "PHASE=$PHASE" >> $GITHUB_ENV
echo "TYPE=$TYPE" >> $GITHUB_ENV
echo "SLUG=$SLUG" >> $GITHUB_ENV
์ดํ ๋ฐฐํฌ ์ต์ ์ ๋ฐ๋ฅธ ๋น๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋๋ก step ์ ์ถ๊ฐํด์ค๋๋ค.
๋น๋ ๊ฒฐ๊ณผ๋ก ๋ฐ์ํ ๋ก๊ทธ๋ค์ output text file ๋ก ํจ๊ป ์ถ๋ ฅํด์ฃผ๋๋ก ํฉ๋๋ค.
- name: Release single template
if: env.TYPE == 'file'
run: |
npm run release:${{ env.PHASE }} -- -t FILE -s ${{ env.SLUG }} | tee output.txt
// ... other options
comment ์์ฑํ๊ธฐ
์ด์ ๋ก๊ทธ ํ์ผ์ ํ์ค์ฉ ์ฝ์ด์ ํ
ํ๋ฆฟ ๋ฐฐํฌ ๊ด๋ จ ๋ก๊ทธ๋ค๋ง ์ถ์ถํด์ ,
๋ก ๊ตฌ๋ถ๋ ๋ฌธ์์ด์ ๋ง๋ค์ด์ฃผ๊ณ ,
์ดํ step ์์ ์ด ๊ฒฐ๊ณผ๊ฐ์ ์ด์ฉํด์ ํ ์ด๋ธ ํ์์ report comment ๋ฅผ ์์ฑํด์ค๋๋ค.
- name: Read report
id: read-report
run: |
messages=()
// ... "output.txt" ๋ก๋ถํฐ ํ์ผ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด messages ์ ๋ฐฐ์ด๋ก ํ ๋นํ๋ ์ ์คํฌ๋ฆฝํธ
REPORT="$(printf "%s," "${messages[@]}")"
echo "REPORT="$REPORT"" >> $GITHUB_OUTPUT
- name: Notify release success
if: success()
uses: actions/github-script@v6
with:
script: |
try {
function createReport() {
const reports = '${{ steps.read-report.outputs.REPORT }}'.split(',')
// ... reports ๋ก comment body ๋ฅผ ํ์์ ๋ง๊ฒ ์์ฑํด์ ๋ฐํํฉ๋๋ค.
}
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: createReport()
})
} catch (err) {
core.setFailed(`โ Request failed with error ${err}`)
}
HEAD ๋น๊ตํด์ ๋ณ๊ฒฝ๋ ํ์ผ ์กฐํํ๊ธฐ
์์ PR ์์ ๋ณ๊ฒฝ๋ ํ ํ๋ฆฟ๋ง ์ถ์ถํด์ ๋ฐฐํฌํ๋ ์ต์ ๋ ์ถ๊ฐํ๋ค๊ณ ํ๋๋ฐ, ์ด๋ฅผ ์ํด์
์ค์ ์๋น์ค ์ฝ๋์์๋ changed-files
๋ฅผ ์ด์ฉํด์ ๋ณ๊ฒฝ๋ ํ
ํ๋ฆฟ ํ์ผ ๋ชฉ๋ก์ ์กฐํํ๊ณ
ํด๋น ํ ํ๋ฆฟ ์ฝ๋๋ฅผ ํ์ฑํด ์์กด์ฑ์ ํ์ ํ ๋ค ์ค์ ๋ฐฐํฌ ๋์ ํ ํ๋ฆฟ์ ํ์ ํ๋ ๋ชจ๋์ ์ถ๊ฐํ์ต๋๋ค.
๐ ์ฐธ๊ณ ์๋ฃ
'๐จโ๐ป web.dev > ops' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SVN ์ ์ด์ฉํ ํ์๊ด๋ฆฌ PART.2 - SVN ๋ธ๋์น ์ ๋ต ์ธ์ฐ๊ธฐ (1) | 2022.03.01 |
---|---|
SVN ์ ์ด์ฉํ ํ์๊ด๋ฆฌ PART.1 - SVN ์ด๋? (0) | 2022.03.01 |
๐ฌ ๋๊ธ