자동 배포 (GitHub Actions)
GitHub Actions를 이용하여 자동으로 배포하기
자동으로 생성된 자동 빌드 작업이 안될 뿐인 것이니 수동으로 자동 빌드 작업을 생성해보자.
GitHub Actions 서비스를 이용할 것이다.
GitHub Actions Workflow 정의하기
최근에 Beta 기능이 추가되어 편하게 워크플로우를 생성할 수 있게 되었다.
레포지토리 메뉴에서 Settings > Pages 로 이동한다.
Build and deployment 섹션의 Source에서 GitHub Actions를 선택한다. 이어서 등장하는 추천 워크플로우들 중에서 GitHub Pages Jekyll를 선택한다.
선택이 완료되면 .github/workflows/ 경로 아래 jekyll.yml 파일을 생성해준다. 혹여 기능을 사용할 수 없는 경우 직접 yaml 파일을 생성하는 방법도 있다.
GitHub Pages Jekyll Workflow 분석하기
이전 과정에서 생성한 워크플로우는 기본적인 Jekyll 빌드 & 배포 작업이다.
작업은 build
와 deploy
로 나누어지며 각 작업을 이루는 과정은 다음과 같다.
flowchart LR
subgraph build
c["Checkout"] --> sr["Setup Ruby"] --> sp["Setup Pages"] --> bj["Build with Jekyll"] --> ua["Upload artifact"]
end
subgraph deploy
ua --> dg["Deploy to GitHub Pages"]
end
- Checkout
- GitHub Actions가 동작하는 컨테이너에서 Git 버전을 검사하고 레포지토리를 초기화하며, 인증 작업 및 원격 저장소로 부터 fetch를 한다.
- Setup Ruby
- Ruby를 설치하고
bundle install
을 통해 필요한 gem을 설치한다. - Setup Pages
- 향후 작업을 위해 사이트에 관한 여러 메타 정보를 추출한다.
- Build with Jekyll
bundle exec jekyll build
명령을 통해 정적 사이트를 빌드한다.- Upload artifact
- 빌드된 정적 사이트와 기타 정보를 다음 작업에 넘겨주기 위해 아티팩트를 생성하여 업로드한다.
- Deploy to GitHub Pages
- 전달받은 아티팩트로부터 정보를 추출하고 레포지토리 설정에 따라 사용자의
*.github.io
혹은 커스텀 도메인 위치에 사이트를 배포한다.
이 중에서 신경써야 할 것은 Checkout 과정이다.
포스트 레포지토리를 서브 모듈로 분리를 해두었기에, 별도로 init
과 update
를 해주어야 한다.
다음 챕터에서 Checkout 과정을 개조하여 해당 작업을 수행하도록 할 것이다.
GitHub Pages Jekyll Workflow 수정하기
자동 생성된 GitHub Pages Jekyll 워크플로우를 다음과 같이 수정할 것이다. (git diff 형식으로 첨부하였다.)
@@ -11,8 +11,15 @@ on:
push:
branches: ["master"]
+ schedule:
+ - cron: '0 0 * * *'
+
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
+ secrets:
+ PRIVATE_REPO_ACCESS_TOKEN:
+ description: 'A Personal Access Token which can access to private repositories'
+ required: true
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
@@ -32,6 +39,11 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
+ with:
+ token: ${{ secrets.PRIVATE_REPO_ACCESS_TOKEN }}
+ submodules: true
+ - name: Update submodule
+ run: git submodule update --remote
- name: Setup Ruby
uses: ruby/setup-ruby@ee2113536afb7f793eed4ce60e8d3b26db912da4 # v1.127.0
with:
수정된 곳에는 크게 세 가지 파트가 있다.
정기적으로 워크플로우를 예약
+ schedule:
+ - cron: '0 0 * * *'
+
위 부분은 정기적으로 레포지토리를 업데이트 하고 빌드 후 배포하도록 정의한다.
cron
은 지정한 패턴에 맞는 시각에 이 워크플로우를 실행하겠다는 의미이다.
- 차례로 Minute[0,59], Hour[0,23], Day of the month[1,31], Month of the year[1,31], Day of the week[0,6] (0=Sunday)를 의미한다.
- 모든 가능한 숫자를 의미하는
*
asterisk의 사용이 가능하다. - 더 자세한 사용법은 이 곳에서 볼 수 있다.
생략이 가능하며, 생략 시에는 페이지 레포지토리의 지정된 브랜치(master
)에 Git push 가 감지될 때에만 빌드&배포 작업이 실행된다.
private 레포지토리 접근을 위한 엑세스 토큰 전달
+ secrets:
+ PRIVATE_REPO_ACCESS_TOKEN:
+ description: 'A Personal Access Token which can access to private repositories'
+ required: true
포스트를 분리하여 private 레포지토리에 보관하였다면, 이에 접근하기 위해서 열람 권한이 있는 개인 엑세스 토큰PAT이 필요하다.
- 엑세스 토큰은 사용자의 Settings > Developer settings > Personal access tokens 에서 발급할 수 있다.
발급한 엑세스 토큰을 secrets
의 PRIVATE_REPO_ACCESS_TOKEN
에서 가져오겠다는 의미이다.
secrets
에서 가져올 값들은 레포지토리의 Settings > Security > Secrets and variables > Actions > Secrets > Repository secrets 에서 정의할 수 있다.
새로 PRIVATE_REPO_ACCESS_TOKEN
을 추가해주고 발급해둔 엑세스 토큰을 입력해준다.
엑세스 토큰을 이용하여 서브 모듈 불러오기 & 업데이트
+ with:
+ token: ${{ secrets.PRIVATE_REPO_ACCESS_TOKEN }}
+ submodules: true
+ - name: Update submodule
+ run: git submodule update --remote
앞서 전달한 엑세스 토큰을 Checkout 과정의 .with.token
옵션으로 전달해 줄 수 있도록 위와 같이 설정한다. 이 때 .with.submodules
옵션 또한 true
로 설정한다.
이를 통해 Checkout 과정으로 하여금 비공개 서브 모듈에 접근할 권한을 얻고 모듈들을 정상적으로 불러올 수 있게 해준다.
Checkout 과정이 서브 모듈을 정상적으로 불러왔다면, 이어서 서브 모듈을 최신 버전으로 업데이트 해주어 빌드된 사이트에 최신 포스트가 포함 될 수 있도록 해준다.
이는 git submodule update --remote
명령을 통해 수행할 수 있다.
수정을 모두 마친 GitHub Pages Jekyll Workflow 파일을 GitHub에 Push 해보자.
커밋이 업로드 된 후, GitHub 레포지토리에서 GitHub Action이 예약 된 것을 확인 할 수 있다.
Action이 성공적으로 마무리 되었다면 커밋 부근의 아이콘이 노란 원에서 녹색의 체크 모양으로 바뀌는 것을 볼 수 있을 것이다.