우선 이 블로그를 만들기 위해서..

위의 ‘quartz’ 라는 publishing tool을 조금 수정해서 사용하고 있다.

문득, obsidian에서 수정한 사항을 직접 build하고 publish하는 과정이 귀찮아져서,, obsidian vault를 통째로 github에 올리고 push 될때마다 자동으로 publish해주면 좋을 것 같다는 생각에 github action을 이용하여 가능한 방법들을 찾아보았다.

github action을 이용하면 기본적으로 자기 repository 파일들을 받아오는듯

github action은 jobs/steps에 표기된 순서대로 작업이 실행된다고 한다..

그래서 만든 step들이다.

Step 01

quartz에서는 obsidian vault가 content라는 폴더로 네이밍 되어있어야 돼서

  1. content라는 폴더 만든 뒤
  2. 모든 파일들을 content 폴더 밑으로 이동시켜 주었다
  - name: move entire files to content
	run: |
	  mkdir content
	  shopt -s extglob
	  mv -v ./!(content) content/

Step 02

빌드를 하려면 quartz repository가 필요하다.

with 구문을 이용해서 repository를 명시해주고,, quartz라는 폴더로 clone하도록 하였다.

  - name: Checkout quartz
	uses: actions/checkout@v3
	with:
	  clean: false
	  repository: parkjbdev/quartz
	  path: ./quartz
 

Step 03

기본으로 깔린 nodejs 버전이 좀 옛날거같다.

21버전으로 올려준다.

      - uses: actions/setup-node@v4
        with:
          node-version: 21

Step 04

아까 content에 넣어둔 vault를 quartz 밑으로 옮겨두고 빌드하기

  - name: Move Content and change directory 
	run: |
	  mv -v content quartz/content
	  cd quartz
	  yarn
	  yarn quartz build
	  pwd
	  ls

Step 05

내 github page에 올려야 되니까.. repository를 clone해왔다..

근데 유지하고 싶은 파일 있는게 아니라면 굳이안해도 될듯?

CNAME만 가져오려고 우선 ghpage라는 폴더로 clone하였다.

  - name: parkjbdev ghpage
	uses: actions/checkout@v3
	with:
	  clean: false
	  repository: parkjbdev/parkjbdev.github.io
	  path: ./ghpage

Step 06

clone한 ghpage 폴더로 가서 필요한 파일빼고 다 날려버린다..

그런 뒤에 quartz에서 빌드한 결과 (quartz/public) 에 있는 파일들을 다 복사해온다

  - name: clean parkjbdev ghpage and copy from build
	run: |
	  cd ghpage
	  shopt -s extglob
	  rm -rf ./!(CNAME)
	  cp -r ../quartz/public/** .
	  pwd
	  ls
 

Step 07

마지막으로, github page에 commit하고 push한다..

push 권한 얻으려면 personal token이나 ssh deploy key 발급해서 등록해야되는데, 보안이슈 때문에 ssh deploy key를 권장한다고 한다.

ssh-keygen 해서 하나 만들어주고, - push할 repository에는 deploy key에 퍼블릭키를, - action이 수행되는 지금 이 repository에는 github action secret 키에 프라이빗 키를 등록해준다. (ssh deploy key 쓰면 아래처럼 DEPLOY_PRIVATE_KEY)

자세한건 https://cpina.github.io/push-to-another-repository-docs/index.html 참조하기..

  - name: Deploy to external repository
	uses: cpina/github-action-push-to-another-repository@main
	env:
	  SSH_DEPLOY_KEY: ${{ secrets.DEPLOY_PRIVATE_KEY }}
 
	with:
	  source-directory: ghpage
	  destination-github-username: parkjbdev 
	  destination-repository-name: parkjbdev.github.io 
	  user-email: dev@parkjb.com 

publish.yml 전문

name: Publish 
 
on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
 
  workflow_dispatch:
 
jobs:
  build:
    runs-on: ubuntu-latest
 
    steps:
      - uses: actions/checkout@v3
 
	# Step 01
      - name: move entire files to content
        run: |
          mkdir content
          shopt -s extglob
          mv -v ./!(content) content/
 
	# Step 02
      - name: Checkout quartz
        uses: actions/checkout@v3
        with:
          clean: false
          repository: parkjbdev/quartz
          path: ./quartz
 
	# Step 03
      - uses: actions/setup-node@v4
        with:
          node-version: 21
    
    # Step 04
      - name: Move Content and change directory 
        run: |
          mv -v content quartz/content
          cd quartz
          yarn
          yarn quartz build
          pwd
          ls
    # Step 05
      - name: parkjbdev ghpage
        uses: actions/checkout@v3
        with:
          clean: false
          repository: parkjbdev/parkjbdev.github.io
          path: ./ghpage
	# Step 06
      - name: clean parkjbdev ghpage and copy from build
        run: |
          cd ghpage
          shopt -s extglob
          rm -rf ./!(CNAME)
          cp -r ../quartz/public/** .
          pwd
          ls
    # Step 07
      - name: Deploy to external repository
        uses: cpina/github-action-push-to-another-repository@main
        env:
          SSH_DEPLOY_KEY: ${{ secrets.DEPLOY_PRIVATE_KEY }}
 
        with:
          source-directory: ghpage
          destination-github-username: parkjbdev 
          destination-repository-name: parkjbdev.github.io 
          user-email: dev@parkjb.com