.github/workflows/pages.yml (3829B)
1 name: Deploy
2
3 on:
4 push:
5 branches: [main]
6 workflow_dispatch:
7
8 permissions:
9 contents: read
10 pages: write
11 id-token: write
12
13 # 배포를 직렬화한다. cancel-in-progress 를 켜면 절반쯤 올라간 배포가 취소되어
14 # 사이트가 부분적으로만 갱신된 상태로 남는데, 그건 기다리는 것보다 나쁘다.
15 concurrency:
16 group: pages
17 cancel-in-progress: false
18
19 jobs:
20 build:
21 runs-on: ubuntu-latest
22 steps:
23 - uses: actions/checkout@v7
24
25 # 빌드보다 먼저 돈다. 셋 다 sqzass 가 확인해 주지 않는 것들이라,
26 # 여기서 안 잡으면 조용히 배포된다.
27 #
28 # check.py 의 죽은 링크 검사만은 public/ 이 있어야 돌기 때문에 빌드 뒤에
29 # 한 번 더 부른다. 여기서는 조용히 건너뛴다.
30 - name: Check content integrity
31 run: python3 tools/check.py
32
33 # 폰트는 실제로 쓰는 글자만 담고 있다. 새 한글이 콘텐츠에 들어왔는데
34 # 서브셋을 다시 안 만들었으면 그 글자만 시스템 폰트로 떨어진다.
35 - name: Check font coverage
36 run: |
37 python3 -m pip install --quiet fonttools brotli
38 python3 tools/fonts.py --check
39
40 # 별 개수는 front matter 에 구워져 있다. repo 를 추가하고 숫자를 안
41 # 채웠으면 그 항목만 빈칸이 된다.
42 - name: Check star counts
43 run: python3 tools/stars.py --check
44
45 - uses: dtolnay/rust-toolchain@stable
46
47 # Swatinem/rust-cache 는 여기서 쓰지 않는다. 이 레포에는 Cargo.toml 이
48 # 없어서 워크스페이스를 못 찾고 매번 에러를 남긴다 — 캐시할 크레이트는
49 # 이 레포가 아니라 sqzass 쪽에 있다.
50
51 # TODO: sqzer-x/sqzass#1 이 머지되면 --branch 를 지운다.
52 # 목록에 날짜를 실어 오는 PageRefCtx.date 가 그 PR 에 있고, Posts 원장이
53 # 그걸 쓴다.
54 - name: Install sqzass
55 run: cargo install --git https://github.com/sqzer-x/sqzass --branch feat/pageref-date --locked
56
57 - uses: actions/configure-pages@v6
58
59 - name: Build
60 run: sqzass build -i .
61
62 # 이번에는 죽은 링크 검사까지 돈다. 템플릿이 조립한 주소는 sqzass 가
63 # 확인해 주지 않는다 — 한국어 홈을 없앤 날 로고 링크가 열한 장에서
64 # 없는 페이지를 가리킨 채로 배포됐다.
65 - name: Check built links
66 run: python3 tools/check.py
67
68 # 재현성은 sqzass 가 내세우는 것이므로 이 사이트에서도 확인한다.
69 # 같은 입력을 두 번 빌드해서 바이트가 다르면 배포하지 않는다.
70 - name: Build again and compare
71 run: |
72 mv public /tmp/first
73 sqzass build -i .
74 diff -r /tmp/first public
75
76 - uses: actions/upload-pages-artifact@v5
77 with:
78 path: public
79
80 deploy:
81 needs: build
82 runs-on: ubuntu-latest
83 environment:
84 name: github-pages
85 url: ${{ steps.deployment.outputs.page_url || steps.retry.outputs.page_url }}
86 steps:
87 - id: deployment
88 uses: actions/deploy-pages@v5
89 continue-on-error: true
90
91 # concurrency 는 워크플로 실행을 직렬화하지만 Pages 배포는 자기를 띄운
92 # 실행보다 오래 산다. 커밋 두 개를 붙여서 밀면 두 번째가 그 틈에 들어가
93 # "due to in progress deployment" 로 400 을 받는다. 한 번 더 시도하면
94 # 되고, 안전하다 — 배포는 아무것도 바꾸기 전에 실패한다.
95 - name: Wait for the previous deployment to settle
96 if: steps.deployment.outcome == 'failure'
97 run: sleep 90
98
99 - id: retry
100 if: steps.deployment.outcome == 'failure'
101 uses: actions/deploy-pages@v5