dnsync 0.2.2

DNS Sync and Control with MCP
Documentation
name: Build Binary and Release

on:
  push:
    tags:
      - "[vV]?[0-9]+.[0-9]+.[0-9]+*"

permissions:
  contents: read

env:
  CARGO_TERM_COLOR: always

jobs:
  test:
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
        with:
          persist-credentials: false
      - uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
      - uses: Swatinem/rust-cache@42dc69e1aa15d09112580998cf2ef0119e2e91ae # v2
        with:
          shared-key: linux-host
          cache-on-failure: true

      - name: Test
        run: cargo test --locked --all-features --all-targets

  create-release:
    needs: test
    runs-on: ubuntu-24.04
    permissions:
      contents: write
    outputs:
      release-ref: ${{ steps.release-version.outputs.release-ref }}
      release-version: ${{ steps.release-version.outputs.version }}
    steps:
      - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5

      - id: release-version
        name: Normalize release tag
        shell: bash
        run: |
          version="${GITHUB_REF_NAME#[vV]}"
          release_tag="v${version}"
          release_ref="refs/tags/${release_tag}"

          echo "version=${version}" >> "$GITHUB_OUTPUT"
          echo "release-tag=${release_tag}" >> "$GITHUB_OUTPUT"
          echo "release-ref=${release_ref}" >> "$GITHUB_OUTPUT"

          if [[ "${GITHUB_REF_NAME}" != "${release_tag}" ]]; then
            git tag "${release_tag}" "${GITHUB_SHA}"
            git push origin "${release_ref}"
          fi

      - uses: taiki-e/create-gh-release-action@eba8ea96c86cca8a37f1b56e94b4d13301fba651 # v1
        with:
          ref: ${{ steps.release-version.outputs.release-ref }}
          changelog: CHANGELOG.md
          allow-missing-changelog: true
          title: ${{ steps.release-version.outputs.release-tag }}
          prefix: "[vV]?"
          token: ${{ secrets.GITHUB_TOKEN }}

  build-and-upload:
    needs: create-release
    permissions:
      contents: write
    strategy:
      fail-fast: false
      matrix:
        include:
          - target: x86_64-unknown-linux-gnu
            os: ubuntu-24.04
          - target: x86_64-unknown-linux-musl
            os: ubuntu-24.04
          - target: x86_64-apple-darwin
            os: macos-15
          - target: aarch64-apple-darwin
            os: macos-15
          - target: x86_64-pc-windows-msvc
            os: windows-2025

    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
        with:
          persist-credentials: false
      - uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
        with:
          targets: ${{ matrix.target }}
      - uses: Swatinem/rust-cache@42dc69e1aa15d09112580998cf2ef0119e2e91ae # v2
        with:
          shared-key: release-${{ runner.os }}-${{ matrix.target }}
          cache-on-failure: true

      - name: Install musl-tools
        if: matrix.target == 'x86_64-unknown-linux-musl'
        run: sudo apt-get update && sudo apt-get install -y musl-tools

      - uses: taiki-e/upload-rust-binary-action@f0d45ae91ee7b8ee928de7a9d04d893a08bcbec6 # v1
        with:
          bin: dns
          ref: ${{ needs.create-release.outputs.release-ref }}
          target: ${{ matrix.target }}
          all-features: true
          locked: true
          archive: dnsync-$target
          tar: all
          zip: none
          token: ${{ secrets.GITHUB_TOKEN }}

  publish-crate:
    needs: build-and-upload
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
        with:
          persist-credentials: false
      - uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
      - uses: Swatinem/rust-cache@42dc69e1aa15d09112580998cf2ef0119e2e91ae # v2
        with:
          shared-key: linux-host
          cache-on-failure: true

      - name: Publish to crates.io
        run: cargo publish --locked --token ${{ secrets.CRATES_IO_TOKEN }}