name: CI on: repository_dispatch: workflow_dispatch: push: branches: - master tags: - "*.*.*" pull_request: types: - opened - synchronize env: CARGO_TERM_COLOR: always jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - uses: taiki-e/install-action@nextest - uses: Swatinem/rust-cache@v2 - name: Run tests run: make test lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: components: clippy - uses: Swatinem/rust-cache@v2 - name: Run cargo fmt (check if all code is rustfmt-ed) uses: actions-rs/cargo@v1 with: command: fmt args: --all -- --check - name: Run cargo clippy (deny warnings) uses: actions-rs/cargo@v1 with: command: clippy # --all-targets makes it lint tests too args: --all-targets --all-features -- -D warnings publish-check: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: cargo fetch uses: actions-rs/cargo@v1 with: command: fetch - name: cargo publish lychee-lib uses: actions-rs/cargo@v1 env: CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} with: command: publish args: --dry-run --manifest-path lychee-lib/Cargo.toml # Can't check lychee binary as it depends on the lib above # and `--dry-run` doesn't allow unpublished crates yet. # https://github.com/rust-lang/cargo/issues/1169 # `cargo-publish-all` is a solution but it doesn't work with # Rust edition 2021. # Therefore skip the check for now, which is probably fine # because the binary is just a small wrapper around the CLI # anyway. # # - name: cargo publish lychee # uses: actions-rs/cargo@v1 # env: # CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} # with: # command: publish # args: --dry-run --manifest-path lychee-bin/Cargo.toml publish: if: startsWith(github.ref, 'refs/tags/') needs: - test - lint - check-feature-flags - publish-check runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: cargo fetch uses: actions-rs/cargo@v1 with: command: fetch # If there was an issue with the build pipeline, the lib might # already be published but the binary not. In that case, we # want to skip over the lib publishing step. - name: Check if lychee-lib is already published id: check-release run: | VERSION=$(cargo pkgid --manifest-path lychee-lib/Cargo.toml | cut -d "#" -f2) if cargo search lychee-lib | grep -q \"$VERSION\"; then echo "Lychee-lib version $VERSION is already published. Skipping." echo "published=true" >> $GITHUB_OUTPUT else echo "published=false" >> $GITHUB_OUTPUT fi - name: cargo publish lychee-lib if: steps.check-release.outputs.published == 'false' uses: actions-rs/cargo@v1 env: CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} with: command: publish args: --manifest-path lychee-lib/Cargo.toml - name: Wait for crates.io publication run: sleep 60s shell: bash - name: cargo publish lychee uses: actions-rs/cargo@v1 env: CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} with: command: publish args: --manifest-path lychee-bin/Cargo.toml check-feature-flags: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 - name: Check that rustls-tls feature doesn't depend on OpenSSL run: test -z "$( cargo tree --package lychee --no-default-features --features rustls-tls --prefix none | sed -n '/^openssl-sys /p' )" - name: Run cargo check with default features uses: actions-rs/cargo@v1 with: command: check args: --workspace --all-targets - name: Run cargo check with all features uses: actions-rs/cargo@v1 with: command: check args: --workspace --all-targets --all-features - name: Run cargo check with rustls-tls feature uses: actions-rs/cargo@v1 with: command: check args: --workspace --all-targets --no-default-features --features rustls-tls