Github Actions을 사용해 파일을 생성하고 그 파일을 레포지토리에 저장하고 싶다면 어떻게 해야할까?
Github Actions는 가상 머신에서 라이브러리의 기능이나 명령어를 통해 동작한다. 가상 머신에서 레포지토리의 코드를 가져와, 내가 원하는 파일을 생성하고 그것을 원격 저장소에 저장하면 된다. 레포지토리에 파일을 저장하려면 git push를 해야하기 때문에 권한이 필요하다. 토큰을 발급받아야 하고 그 토큰을 사용해 레포지토리의 원격 저장소에 접근하면 된다.
토큰 발급
- 먼저 Developer Settings에서 Access Token을 발급받아야 한다.
- 아래와 같이 repo 권한을 가진 Access Token 하나를 발급해준다. 토큰 값은 레포지토리의 Secrets에 설정해줘야 하니 메모장에 잘 저장해두자.
레포지토리 Secrets 지정
- Github Actions를 설정할 레포지토리를 선택하고 상단의 Settings 메뉴로 들어가자.
- 왼쪽 메뉴의 Security - Secrets and variables - Actions를 선택한다.
- 위에서 만들어둔 Access Token을 Secrets에 저장해준다.
- NAME은 나중에 Github Actions에서 env의 변수로 사용할 이름을 넣어주면 된다.
- 저장하면 아래와 같이 값이 보인다.
yaml 작성하기
- 아래의 코드 예시는 create.js 파일을 실행해 현재 레포지토리에서 저장하길 원하는 파일을 생성하고 그것을 add, commit하고 push해 원격 레포지토리에 파일이 자동으로 저장되게 하는 workflow이다.
name: my push flow
on:
push:
branches: [main]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
permissions: write-all
steps:
- name: checkout code
uses: actions/checkout@v4
- name: setup node
uses: actions/setup-node@v3
with:
node-version: 16
- name: run node
run: |
npm ci
node create.js
- name: push json
env:
GITHUB_TOKEN: ${{secrets.SECRET_TOKEN}}
run: |
git config --global user.email "{당신의 이메일}"
git config --global user.name "{당신의 깃헙 아이디}"
git add .
git commit -m "update my file"
git push origin main
- workflow를 수동으로 실행하기 위해 on에 workflow_dispatch를 추가해줬다.
- jobs.build.permissions를 꼭 write-all로 둬야 한다. 참고로 이 설정을 넣지 않을 경우 권한이 없기 때문에 "remote: Write access to repository not granted. fatal: unable to access '': The requested URL returned error: 403" 에러가 발생한다.
- actions/checkout@v4를 통해 레포지토리에 있는 코드 환경을 세팅해준다.
- 자바스크립트를 실행하기 위해 actions/setup-node@v3를 통해 자바스크립트 런타임 환경인 노드를 설정해줬다.
- npm 의존성을 노드를 실행해 파일을 생성한다.
- 마지막으로 git add, commit, push 명령어를 통해 원격 저장소에 파일이 저장되도록 한다. 이 때 env에 GITHUB_TOKEN으로 방금 전에 발급받았던 토큰의 값을 넣어줘야 push가 정상적으로 실행된다.
주의사항
nothing to commit, working tree clean
- 만약 작업을 진행한 후에 업데이트할 수 있는 파일이 없다면 어떻게 될까? 아래와 같이 작업에 실패하게 된다.
- 위와 같은 에러가 발생하는 이유는 실제로 추가할 파일이 없어서 그런 것이다. 따라서 커밋 및 푸시 작업이 진행되지 않도록 처리해야 한다.
- git status의 --porcelain 옵션을 사용하면 된다. 해당 옵션을 통해 변경사항이 있는지 파악할 수 있다. 아래와 같이 쉘 스크립트로 분기처리를 해주면 된다.
name: my push flow
on:
push:
branches: [main]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
permissions: write-all
steps:
...
- name: push json
env:
GITHUB_TOKEN: ${{secrets.SECRET_TOKEN}}
run: |
git config --global user.email "{당신의 이메일}"
git config --global user.name "{당신의 깃헙 아이디}"
if [[ -n $(git staus --porcelain) ]]; then
git add .
git commit -m "update my file"
git push origin main
else
echo "No changes to commit"
fi