name: learn-github-actions
on:
push:
branches: [ main ]
jobs:
hello-world:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run a one-line script
run: echo "Hello, world!"
- name: Run a multi-line script
run: |
echo "Add other actions to build,"
echo "test, and deploy your project."
on
에는 이 워크플로우를 트리거 할 이벤트를 정의합니다. 여기서는 main
브랜치에 커밋이 푸시되었을 때 워크플로우가 동작합니다.job
에는 워크플로우에 들어갈 작업들을 정의합니다.runs-on
에는 워크플로우를 실행할 러너를 정의합니다. 여기서는 ubuntu-latest
머신을 사용하고 있습니다.step
에는 하나의 작업에 들어가는 스텝들을 정의합니다.uses
에는 사용할 액션의 패키지 이름이 들어갑니다. 여기서는 러너에서 리포지토리에 접근할 수 있도록 세팅 및 체크아웃을 하는 action/checkout
액션을 사용하고 있습니다. 이처럼 GitHub Actions는 복잡하거나 자주 사용하는 작업을 재사용이 가능하도록 Actions 라는 모듈로 묶을 수 있으며, 이러한 액션은 GitHub에서 공식적으로 제공하는 것을 사용하거나 다른 사람이 작성한 것을 가져올 수 있습니다.run
에는 러너에서 명령어를 실행할 때 사용합니다.
package.json
파일을 열어서 version
을 원하는 값으로 수정합니다.npm login
명령어를 이용해 사내 패키지 레지스트리에 로그인합니다.npm publish
명령어로 패키지를 배포합니다.
workflow_dispatch
가 있는데, 이를 이용하면 액션 탭에서 직접 워크플로우를 실행할 수 있도록 버튼을 노출합니다. 더 중요한 점은 이렇게 워크플로우를 트리거 할 때 원하는 입력을 넘겨줄 수 있고, 이 값을 워크플로우 내에서 읽고 사용할 수도 있습니다. on:
workflow_dispatch:
inputs:
tag:
description: "Version you want to publish (ex: 1.0.0)"
required: true
package.json
파일의 version
값으로부터 버전 정보를 가져옵니다. 새로운 버전을 배포하기 위해서는 이 값을 바꿔야 하므로 적절한 방법을 이용하여 이 파일을 파싱하고 수정하는 작업이 필요합니다. package.json
파일은 확장자에서도 알 수 있듯이 JSON 형식을 따르므로 이를 파싱 하는 데 jq 와 같은 프로그램을 사용해도 좋지만, 어차피 특정 값만 수정하는 것이라면 sed 명령어를 이용하여 특정 패턴을 수정하는 방식으로도 작성할 수 있습니다.=e "s/regexp/replacement/"
옵션을 이용하여 version
뒤에 있는 값을 워크플로우 트리거 시 입력받은 값으로 바꾸도록 작성하였습니다.- name: Update package.json to version ${{ inputs.tag }}
run: sed -i -e "s/\(\"version\":\) \"\(.*\)\",/\1 \"${{ inputs.tag }}\",/" package.json
package.json
파일이 변경되었으므로, 이를 커밋하고 원격 리포지토리에 반영하여야 합니다. 그리고 태그 역시 생성하고 푸시 해야 합니다.- name: Commit and push
run: |
git config --local user.name ${GITHUB_ACTOR}
git config --local user.email ${GITHUB_ACTOR}@users.noreply.github.com
git commit -a -m "Prepare for version ${{ inputs.tag }}"
git push ${REPO_URL}
- name: Create tag ${{ inputs.tag }} and push
run: |
git tag ${{ inputs.tag }}
git push ${REPO_URL} ${{ inputs.tag }}
REPO_URL: https://<your_github_id>:<your_personal_access_token>@github.com/${{ github.repository }}.git
GITHUB_TOKEN
키를 제공합니다. 이 키는 secrets
컨텍스트에서 가져올 수 있는데, 이름에서 알 수 있듯이 비밀스럽게 보관되어야 하는 값들이 저장되는 곳입니다. 이러한 값들은 워크플로우 내에서 암호화된 상태로 유지되며, 로그 상에서는 마스킹 되어 보이지 않습니다.REPO_URL: https://${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git
npm
명령어를 이용하므로 node
환경이 필요한데, GitHub에서는 이러한 node
환경을 구축하기 위한 actions/setup-node
액션을 공식적으로 제공합니다. 그리고 레지스트리 로그인 시 필요한 인증 정보는 앞에서와 마찬가지로 secrets
컨텍스트에 추가한 후 이를 읽어들이면 됩니다.- name: Setup node
uses: actions/setup-node@v3
with:
node-version: 16
- name: Login to registry and publish
env:
NPM_USER: ${{ secrets.NPM_USER }}
NPM_PASS: ${{ secrets.NPM_PASS }}
NPM_EMAIL: ${{ secrets.NPM_EMAIL }}
NPM_REGISTRY: ${{ secrets.NPM_REGISTRY }}
run: |
npm install -g npm-cli-login
npm-cli-login
npm publish --registry $NPM_REGISTRY
name: Publish
on:
workflow_dispatch:
inputs:
tag:
description: "Version you want to publish (ex: 1.0.0)"
required: true
defaults:
run:
working-directory: ./Assets/Package
jobs:
update-package-json:
runs-on: ubuntu-latest
env:
REPO_URL: https://${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git
steps:
- name: Checkout
uses: actions/checkout@v3
with:
ref: ${{ github.ref }}
fetch-depth: 0
- name: Update package.json to version ${{ inputs.tag }}
run: sed -i -e "s/\(\"version\":\) \"\(.*\)\",/\1 \"${{ inputs.tag }}\",/" package.json
- name: Commit and push
run: |
git config --local user.name ${GITHUB_ACTOR}
git config --local user.email ${GITHUB_ACTOR}@users.noreply.github.com
git commit -a -m "Prepare for version ${{ inputs.tag }}"
git push $REPO_URL
- name: Create tag ${{ inputs.tag }} and push
run: |
git tag ${{ inputs.tag }}
git push $REPO_URL ${{ inputs.tag }}
- name: Setup node
uses: actions/setup-node@v3
with:
node-version: 16
- name: Login to registry and publish
env:
NPM_USER: ${{ secrets.NPM_USER }}
NPM_PASS: ${{ secrets.NPM_PASS }}
NPM_EMAIL: ${{ secrets.NPM_EMAIL }}
NPM_REGISTRY: ${{ secrets.NPM_REGISTRY }}
run: |
npm install -g npm-cli-login
npm-cli-login
npm publish --registry $NPM_REGISTRY