diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..9c9a5e3 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,125 @@ +# Reference: https://github.com/BurntSushi/ripgrep/blob/827082a33ae7d86846a103ef14fb9ff297587049/.github/workflows/ci.yml +name: release + +on: + push: + tags: + - "[0-9]+.[0-9]+.[0-9]+" + +env: + CARGO_TERM_COLOR: always + +jobs: + create-release: + name: create-release + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Get the release version from the tag + if: env.VERSION == '' + run: echo "VERSION=${{ github.ref_name }}" >> $GITHUB_ENV + - name: Show the version + run: | + echo "version is: $VERSION" + - name: Check that tag version and Cargo.toml version are the same + shell: bash + run: | + if ! grep -q "version = \"$VERSION\"" Cargo.toml; then + echo "version does not match Cargo.toml" >&2 + exit 1 + fi + - name: Create GitHub release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: gh release create $VERSION --draft --verify-tag --title $VERSION + outputs: + version: ${{ env.VERSION }} + + build-release: + name: build-release + needs: ['create-release'] + runs-on: ${{ matrix.os }} + env: + RUST_BACKTRACE: 1 + strategy: + fail-fast: false + matrix: + include: + - build: linux + os: ubuntu-latest + target: x86_64-unknown-linux-gnu + rust: stable + - build: win-msvc + os: windows-latest + target: x86_64-pc-windows-msvc + rust: stable + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ matrix.rust }} + target: ${{ matrix.target }} + + - name: Set target variables + shell: bash + run: | + echo "TARGET_FLAGS=--target ${{ matrix.target }}" >> $GITHUB_ENV + echo "TARGET_DIR=./target/${{ matrix.target }}" >> $GITHUB_ENV + + - name: Show command used for Cargo + shell: bash + run: | + echo "target flag is: ${{ env.TARGET_FLAGS }}" + echo "target dir is: ${{ env.TARGET_DIR }}" + + - name: Build release binary + shell: bash + run: | + cargo build --verbose --release --target ${{ matrix.target }} + if [ "${{ matrix.os }}" = "windows-latest" ]; then + bin="target/${{ matrix.target }}/release/palworld-guild-save-fix.exe" + else + bin="target/${{ matrix.target }}/release/palworld-guild-save-fix" + fi + echo "BIN=$bin" >> $GITHUB_ENV + + - name: Determine archive name + shell: bash + run: | + version="${{ needs.create-release.outputs.version }}" + echo "ARCHIVE=palworld-guild-save-fix-$version-${{ matrix.target }}" >> $GITHUB_ENV + + - name: Creating directory for archive + shell: bash + run: | + mkdir -p "$ARCHIVE"/ + cp "$BIN" "$ARCHIVE"/ + + - name: Build archive (Windows) + shell: bash + if: matrix.os == 'windows-latest' + run: | + 7z a "$ARCHIVE.zip" "$ARCHIVE" + certutil -hashfile "$ARCHIVE.zip" SHA256 > "$ARCHIVE.zip.sha256" + echo "ASSET=$ARCHIVE.zip" >> $GITHUB_ENV + echo "ASSET_SUM=$ARCHIVE.zip.sha256" >> $GITHUB_ENV + + - name: Build archive (Unix) + shell: bash + if: matrix.os != 'windows-latest' + run: | + tar czf "$ARCHIVE.tar.gz" "$ARCHIVE" + shasum -a 256 "$ARCHIVE.tar.gz" > "$ARCHIVE.tar.gz.sha256" + echo "ASSET=$ARCHIVE.tar.gz" >> $GITHUB_ENV + echo "ASSET_SUM=$ARCHIVE.tar.gz.sha256" >> $GITHUB_ENV + + - name: Upload release archive + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + shell: bash + run: | + version="${{ needs.create-release.outputs.version }}" + gh release upload "$version" ${{ env.ASSET }} ${{ env.ASSET_SUM }}