From 2e48ba0528e28b386b2ba35bea0f192fb149931a Mon Sep 17 00:00:00 2001 From: Nicolas Dusart Date: Thu, 1 Feb 2024 14:23:42 +0100 Subject: [PATCH] implement ci to test commits and deploy on tags --- .github/workflows/ci.yml | 147 ++++++++++++++++++++++++++++ .github/workflows/release.yml | 177 ++++++++++++++++++++++++++++++++++ 2 files changed, 324 insertions(+) create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..68f9ceb --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,147 @@ +name: ci +on: + pull_request: + push: + branches: + - master + - ci + +env: + RUSTFLAGS: -Dwarnings + CARGO: cargo + TARGET_FLAGS: + FEATURES_FLAGS: + TARGET_DIR: ./target + CROSS_VERSION: v0.2.5 + CLIPPY_RUST_VERSION: 1.75 + RUST_BACKTRACE: 1 + +jobs: + test: + name: test + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - build: minimal + os: ubuntu-latest + rust: 1.70.0 + - build: stable + os: ubuntu-latest + rust: stable + - build: beta + os: ubuntu-latest + rust: beta + - build: nightly + os: ubuntu-latest + rust: nightly + - build: stable-musl + os: ubuntu-latest + rust: stable + target: x86_64-unknown-linux-musl + features: vendored-openssl + - build: stable-x86 + os: ubuntu-latest + rust: stable + target: i686-unknown-linux-gnu + features: vendored-openssl + - build: stable-aarch64 + os: ubuntu-latest + rust: stable + target: aarch64-unknown-linux-gnu + features: vendored-openssl + - build: stable-arm-gnueabihf + os: ubuntu-latest + rust: stable + target: armv7-unknown-linux-gnueabihf + features: vendored-openssl + - build: stable-arm-musleabihf + os: ubuntu-latest + rust: stable + target: armv7-unknown-linux-musleabihf + features: vendored-openssl + - build: stable-arm-musleabi + os: ubuntu-latest + rust: stable + target: armv7-unknown-linux-musleabi + features: vendored-openssl + - build: stable-powerpc64 + os: ubuntu-latest + rust: stable + target: powerpc64-unknown-linux-gnu + features: vendored-openssl + - build: stable-s390x + os: ubuntu-latest + rust: stable + target: s390x-unknown-linux-gnu + features: vendored-openssl + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ matrix.rust }} + + - name: Use Cross + if: matrix.os == 'ubuntu-latest' && matrix.target != '' + 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 + echo "TARGET_FLAGS=--target ${{ matrix.target }}" >> $GITHUB_ENV + echo "TARGET_DIR=./target/${{ matrix.target }}" >> $GITHUB_ENV + + - name: Enable features + if: matrix.features != '' + run: echo "FEATURES_FLAGS=--features ${{ matrix.features }}" >> $GITHUB_ENV + + - name: Show command used for Cargo + run: | + echo "cargo command is: ${{ env.CARGO }}" + echo "target flag is: ${{ env.TARGET_FLAGS }}" + echo "target dir is: ${{ env.TARGET_DIR }}" + echo "features flag is: ${{ env.FEATURES_FLAGS }}" + + - name: Build deltasync + run: ${{ env.CARGO }} build --verbose ${{ env.TARGET_FLAGS }} ${{ env.FEATURES_FLAGS }} + + - name: Run tests + if: matrix.target == '' + run: ${{ env.CARGO }} test --verbose ${{ env.TARGET_FLAGS }} ${{ env.FEATURES_FLAGS }} + + rustfmt: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Install Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: stable + components: rustfmt + - name: Check formatting + run: cargo fmt --all --check + + clippy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Install Rust ${{ env.CLIPPY_RUST_VERSION }} + uses: dtolnay/rust-toolchain@stable + with: + toolchain: ${{ env.CLIPPY_RUST_VERSION }} + components: clippy + - uses: Swatinem/rust-cache@v2 + # Run clippy + - name: "clippy" + run: cargo clippy --all diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..5b64dba --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,177 @@ +name: release + +# Only do the release on x.y.z tags. +on: + push: + tags: + - "[0-9]+.[0-9]+.[0-9]+" + +env: + CARGO: cargo + TARGET_FLAGS: + FEATURES_FLAGS: + TARGET_DIR: ./target + CROSS_VERSION: v0.2.5 + +permissions: + contents: write + +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 }} + strategy: + fail-fast: false + matrix: + include: + - build: stable-x86_64 (gnu) + os: ubuntu-latest + rust: stable + target: x86_64-unknown-linux-gnu + features: vendored-openssl + - build: stable-x86_64 (musl) + os: ubuntu-latest + rust: stable + target: x86_64-unknown-linux-musl + features: vendored-openssl + - build: stable-x86 + os: ubuntu-latest + rust: stable + target: i686-unknown-linux-gnu + features: vendored-openssl + - build: stable-aarch64 + os: ubuntu-latest + rust: stable + target: aarch64-unknown-linux-gnu + features: vendored-openssl + - build: stable-arm-gnueabihf + os: ubuntu-latest + rust: stable + target: armv7-unknown-linux-gnueabihf + features: vendored-openssl + - build: stable-arm-musleabihf + os: ubuntu-latest + rust: stable + target: armv7-unknown-linux-musleabihf + features: vendored-openssl + - build: stable-arm-musleabi + os: ubuntu-latest + rust: stable + target: armv7-unknown-linux-musleabi + features: vendored-openssl + - build: stable-powerpc64 + os: ubuntu-latest + rust: stable + target: powerpc64-unknown-linux-gnu + features: vendored-openssl + - build: stable-s390x + os: ubuntu-latest + rust: stable + target: s390x-unknown-linux-gnu + features: vendored-openssl + + 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 + if: matrix.target != '' + run: | + echo "TARGET_FLAGS=--target ${{ matrix.target }}" >> $GITHUB_ENV + echo "TARGET_DIR=./target/${{ matrix.target }}" >> $GITHUB_ENV + + - name: Set features variable + shell: bash + if: matrix.features != '' + run: echo "FEATURES_FLAGS=--features ${{ matrix.features }}" >> $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 }}" + echo "features flag is: ${{ env.FEATURES_FLAGS }}" + + - name: Build release binary + shell: bash + run: | + ${{ env.CARGO }} build --verbose --release ${{ env.FEATURES_FLAGS }} ${{ env.TARGET_FLAGS }} + bin="target/${{ matrix.target }}/release/deltasync" + echo "BIN=$bin" >> $GITHUB_ENV + + - name: Determine archive name + shell: bash + run: | + version="${{ needs.create-release.outputs.version }}" + echo "ARCHIVE=deltasync-$version-${{ matrix.target }}" >> $GITHUB_ENV + + - name: Copy binary in archive + shell: bash + run: | + mkdir -p "$ARCHIVE" + cp "$BIN" "$ARCHIVE"/ + + - name: Build archive + shell: bash + 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 }}