sqzass.git

sqzass

~ A static site generator written in Rust
git clone https://github.com/debuman/sqzass.git

.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