Skip to main content Link Menu Expand (external link) Document Search Copy Copied

자동 배포 (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 빌드 & 배포 작업이다.

작업은 builddeploy로 나누어지며 각 작업을 이루는 과정은 다음과 같다.

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 과정이다.

포스트 레포지토리를 서브 모듈로 분리를 해두었기에, 별도로 initupdate를 해주어야 한다.

다음 챕터에서 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 에서 발급할 수 있다.

발급한 엑세스 토큰을 secretsPRIVATE_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이 성공적으로 마무리 되었다면 커밋 부근의 아이콘이 노란 원에서 녹색의 체크 모양으로 바뀌는 것을 볼 수 있을 것이다.


Back to top