network-device 0.2.0

A strongly typed eDSL and IaC contracts for network device configuration
Documentation
name: Release

on:
  push:
    tags:
      - "v*"

concurrency:
  group: release-${{ github.ref }}
  cancel-in-progress: false

permissions:
  contents: read

env:
  CARGO_TERM_COLOR: always

jobs:
  verify:
    name: Verify release
    runs-on: ubuntu-latest
    steps:
      - name: Check out tagged source
        uses: actions/checkout@v5

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy, rustfmt

      - name: Cache Rust build
        uses: Swatinem/rust-cache@v2

      - name: Verify tag matches crate version
        shell: bash
        run: |
          tag_version="${GITHUB_REF_NAME#v}"
          crate_version="$(cargo metadata --locked --no-deps --format-version 1 | jq -r '.packages[] | select(.name == "network-device") | .version')"
          if [[ "$tag_version" != "$crate_version" ]]; then
            echo "Tag version '$tag_version' does not match crate version '$crate_version'."
            exit 1
          fi

      - name: Check formatting
        run: cargo fmt --check

      - name: Run Clippy
        run: cargo clippy --locked --all-features --all-targets -- -D warnings

      - name: Run tests
        run: cargo test --locked --all-features

      - name: Verify package
        run: cargo package --locked

  publish:
    name: Publish crate
    needs: verify
    runs-on: ubuntu-latest
    environment: release
    steps:
      - name: Check out tagged source
        uses: actions/checkout@v5

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Publish to crates.io
        run: cargo publish --locked --registry crates-io
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}

  github-release:
    name: Create GitHub release
    needs: publish
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - name: Create release
        shell: bash
        env:
          GH_TOKEN: ${{ github.token }}
        run: |
          args=("$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --verify-tag --generate-notes)
          if [[ "$GITHUB_REF_NAME" == *-* ]]; then
            args+=(--prerelease)
          fi
          gh release create "${args[@]}"