.github/workflows/release.yml (5134B)
1 name: Release
2
3 on:
4 push:
5 tags: ["v*"]
6 # 태그를 붙이기 전에 빌드가 되는지 확인할 수 있어야 한다. 수동 실행은 아티팩트만
7 # 남기고 릴리스는 만들지 않는다 — 되돌릴 수 없는 건 태그가 있을 때만 한다.
8 workflow_dispatch:
9
10 permissions:
11 contents: write
12
13 env:
14 CARGO_TERM_COLOR: always
15
16 jobs:
17 build:
18 strategy:
19 # 한 타깃이 깨져도 나머지는 끝까지 간다. 어느 하나가 실패했다고 전부 없는
20 # 것보다, 되는 것만이라도 손에 쥐고 원인을 보는 편이 낫다.
21 fail-fast: false
22 matrix:
23 include:
24 # musl 정적 링크. 정적 아티팩트만 pure-rust 엔진으로 빌드한다 —
25 # Oniguruma(C 바인딩)가 정적 링크를 깨는 지점이 여기라서다. 기본
26 # 빌드는 onig(코드 무거운 코퍼스 실측 3배)지만, 이 잡의
27 # --no-default-features가 onig를 컴파일 타임에 차단한다. musl-gcc가
28 # onig_sys 링크에 *성공*할 수도 있으므로, 링크 실패가 순수 Rust를
29 # 지켜줄 거라 기대하지 말 것 — 플래그가 유일한 가드다.
30 - os: ubuntu-latest
31 target: x86_64-unknown-linux-musl
32 flags: --no-default-features --features pure-rust
33 # ARM 리눅스는 네이티브 러너에서 짓는다. 크로스 컴파일로도 바이너리는
34 # 나오지만, 그러면 아래 스모크 스텝이 못 돈다 — 링크만 되고 런타임에
35 # 죽는 조합을 잡으라고 둔 검사라, 실행할 수 없는 아티팩트를 내보내는
36 # 것은 그 검사를 포기하는 것이다.
37 - os: ubuntu-24.04-arm
38 target: aarch64-unknown-linux-musl
39 flags: --no-default-features --features pure-rust
40 - os: macos-latest
41 target: aarch64-apple-darwin
42 flags: ""
43
44 runs-on: ${{ matrix.os }}
45 steps:
46 - uses: actions/checkout@v7
47
48 - uses: dtolnay/rust-toolchain@stable
49 with:
50 targets: ${{ matrix.target }}
51
52 - uses: Swatinem/rust-cache@v2
53 with:
54 key: ${{ matrix.target }}
55
56 - name: Install the musl toolchain
57 if: contains(matrix.target, 'musl')
58 run: sudo apt-get update && sudo apt-get install -y musl-tools
59
60 - name: Build
61 run: cargo build --release --locked --target ${{ matrix.target }} ${{ matrix.flags }}
62
63 # 빌드된 바이너리가 실제로 사이트를 만드는지 본다. 링크만 성공하고 런타임에
64 # 죽는 조합이 있으므로(정적 빌드에서 특히), 여기서 한 번 돌려 본다.
65 - name: The binary builds a site
66 run: |
67 ./target/${{ matrix.target }}/release/sqzass init "$RUNNER_TEMP/smoke"
68 ./target/${{ matrix.target }}/release/sqzass build -i "$RUNNER_TEMP/smoke" --json
69 test -f "$RUNNER_TEMP/smoke/public/index.html"
70
71 - name: Package
72 id: package
73 shell: bash
74 run: |
75 name="sqzass-${{ github.ref_type == 'tag' && github.ref_name || 'dev' }}-${{ matrix.target }}"
76 mkdir -p "dist/$name"
77 cp "target/${{ matrix.target }}/release/sqzass" "dist/$name/"
78 cp README.md LICENSE "dist/$name/"
79 tar -C dist -czf "dist/$name.tar.gz" "$name"
80 # 체크섬을 같이 낸다. 없으면 받는 쪽이 확인할 방법이 없다.
81 (cd dist && shasum -a 256 "$name.tar.gz" > "$name.tar.gz.sha256")
82 echo "archive=dist/$name.tar.gz" >> "$GITHUB_OUTPUT"
83
84 # `releases/latest/download/<파일명>`은 파일명이 릴리스마다 같아야 쓸 수
85 # 있는데 위 이름에는 태그가 박혀 있다. 배포 안내서들이 바로 그 URL을
86 # 쓰므로 태그 없는 이름의 사본도 낸다. 태그 붙은 쪽은 그대로 둔다 —
87 # install.sh가 그 이름을 조립하고, 사본은 순수 추가다.
88 stable="sqzass-${{ matrix.target }}"
89 cp "dist/$name.tar.gz" "dist/$stable.tar.gz"
90 (cd dist && shasum -a 256 "$stable.tar.gz" > "$stable.tar.gz.sha256")
91 echo "stable=dist/$stable.tar.gz" >> "$GITHUB_OUTPUT"
92
93 - uses: actions/upload-artifact@v5
94 with:
95 name: ${{ matrix.target }}
96 path: |
97 ${{ steps.package.outputs.archive }}
98 ${{ steps.package.outputs.archive }}.sha256
99 ${{ steps.package.outputs.stable }}
100 ${{ steps.package.outputs.stable }}.sha256
101
102 # 릴리스는 태그일 때만. 수동 실행은 "빌드가 되는지"를 확인하는 용도이고,
103 # 그때 릴리스가 생기면 확인이 부작용을 갖게 된다.
104 - name: Attach to the release
105 if: github.ref_type == 'tag'
106 uses: softprops/action-gh-release@v2
107 with:
108 files: |
109 ${{ steps.package.outputs.archive }}
110 ${{ steps.package.outputs.archive }}.sha256
111 ${{ steps.package.outputs.stable }}
112 ${{ steps.package.outputs.stable }}.sha256
113 generate_release_notes: true