diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..147b724 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,215 @@ +name: release + +# Only do the release on x.y.z tags. +on: + push: + tags: + - "[0-9]+.[0-9]+.[0-9]+" + +# We need this to be able to create releases. +permissions: + contents: write + +jobs: + # The create-release job runs purely to initialize the GitHub release itself, + # and names the release after the `x.y.z` tag that was pushed. It's separate + # from building the release so that we only create the release once. + 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: + # For some builds, we use cross to test on 32-bit and big-endian + # systems. + CARGO: cargo + # When CARGO is set to CROSS, this is set to `--target matrix.target`. + TARGET_FLAGS: + # When CARGO is set to CROSS, TARGET_DIR includes matrix.target. + TARGET_DIR: ./target + # Bump this as appropriate. We pin to a version to make sure CI + # continues to work as cross releases in the past have broken things + # in subtle ways. + CROSS_VERSION: v0.2.5 + # Emit backtraces on panics. + RUST_BACKTRACE: 1 + strategy: + fail-fast: false + matrix: + include: + - build: linux + os: ubuntu-latest + rust: nightly + target: x86_64-unknown-linux-musl + strip: x86_64-linux-musl-strip + - build: stable-x86 + os: ubuntu-latest + rust: stable + target: i686-unknown-linux-gnu + strip: x86_64-linux-gnu-strip + qemu: i386 + - build: stable-aarch64 + os: ubuntu-latest + rust: stable + target: aarch64-unknown-linux-gnu + strip: aarch64-linux-gnu-strip + qemu: qemu-aarch64 + - build: stable-arm-gnueabihf + os: ubuntu-latest + rust: stable + target: armv7-unknown-linux-gnueabihf + strip: arm-linux-gnueabihf-strip + qemu: qemu-arm + - build: stable-arm-musleabihf + os: ubuntu-latest + rust: stable + target: armv7-unknown-linux-musleabihf + strip: arm-linux-musleabihf-strip + qemu: qemu-arm + - build: stable-arm-musleabi + os: ubuntu-latest + rust: stable + target: armv7-unknown-linux-musleabi + strip: arm-linux-musleabi-strip + qemu: qemu-arm + - build: stable-powerpc64 + os: ubuntu-latest + rust: stable + target: powerpc64-unknown-linux-gnu + strip: powerpc64-linux-gnu-strip + qemu: qemu-ppc64 + - build: stable-s390x + os: ubuntu-latest + rust: stable + target: s390x-unknown-linux-gnu + strip: s390x-linux-gnu-strip + qemu: qemu-s390x + - build: macos + os: macos-latest + rust: nightly + target: x86_64-apple-darwin + - build: win-msvc + os: windows-latest + rust: nightly + target: x86_64-pc-windows-msvc + - build: win-gnu + os: windows-latest + rust: nightly-x86_64-gnu + target: x86_64-pc-windows-gnu + - build: win32-msvc + os: windows-latest + rust: nightly + target: i686-pc-windows-msvc + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ matrix.rust }} + target: ${{ matrix.target }} + + - name: Use Cross + if: matrix.os == 'ubuntu-latest' && matrix.target != '' + shell: bash + run: | + # In the past, new releases of 'cross' have broken CI. So for now, we + # pin it. We also use their pre-compiled binary releases because cross + # has over 100 dependencies and takes a bit to compile. + dir="$RUNNER_TEMP/cross-download" + mkdir "$dir" + echo "$dir" >> $GITHUB_PATH + cd "$dir" + curl -LO "https://github.com/cross-rs/cross/releases/download/$CROSS_VERSION/cross-x86_64-unknown-linux-musl.tar.gz" + tar xf cross-x86_64-unknown-linux-musl.tar.gz + echo "CARGO=cross" >> $GITHUB_ENV + + - 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 "cargo command is: ${{ env.CARGO }}" + echo "target flag is: ${{ env.TARGET_FLAGS }}" + echo "target dir is: ${{ env.TARGET_DIR }}" + + - name: Build release binary + shell: bash + run: | + ${{ env.CARGO }} build --verbose --release ${{ env.TARGET_FLAGS }} + if [ "${{ matrix.os }}" = "windows-latest" ]; then + bin="target/${{ matrix.target }}/release/yage.exe" + else + bin="target/${{ matrix.target }}/release/yage" + fi + echo "BIN=$bin" >> $GITHUB_ENV + + - name: Determine archive name + shell: bash + run: | + version="${{ needs.create-release.outputs.version }}" + echo "ARCHIVE=yage-$version-${{ matrix.target }}" >> $GITHUB_ENV + + - name: Creating directory for archive + shell: bash + run: | + mkdir -p "$ARCHIVE"/{complete,doc} + cp "$BIN" "$ARCHIVE"/ + cp {README.md,LICENSE} "$ARCHIVE"/ + cp doc/* "$ARCHIVE"/doc/ + + - 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 }} diff --git a/README.md b/README.md index 3745744..30a1a10 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ Options: -V, --version Print version ``` -See also the [markdown version of the command line reference](docs/CommandLineHelp.md). +See also the [markdown version of the command line reference](doc/CommandLineHelp.md). You may also find convenient to install the completion for your shell. For example for fish: diff --git a/build.rs b/build.rs index 88a670a..5ec0caf 100644 --- a/build.rs +++ b/build.rs @@ -10,7 +10,7 @@ fn main() -> std::io::Result<()> { fn generate_man() -> std::io::Result<()> { let command = C::command(); - let out_dir: PathBuf = "docs".into(); + let out_dir: PathBuf = "doc".into(); let name = command.get_name(); let name = if name == "yage" { "yage.1".to_owned() @@ -27,7 +27,7 @@ fn generate_man() -> std::io::Result<()> { fn generate_markdown() -> std::io::Result<()> { let md = clap_markdown::help_markdown::(); - let mut f = fs::File::create("docs/CommandLineHelp.md")?; + let mut f = fs::File::create("doc/CommandLineHelp.md")?; write!(f, "{md}")?; Ok(()) } diff --git a/docs/CommandLineHelp.md b/doc/CommandLineHelp.md similarity index 100% rename from docs/CommandLineHelp.md rename to doc/CommandLineHelp.md diff --git a/docs/yage.1 b/doc/yage.1 similarity index 100% rename from docs/yage.1 rename to doc/yage.1