wiresmith 0.4.5

Auto-config WireGuard clients into a mesh
Documentation
name: Build/publish release

on: [push, pull_request]

jobs:
  publish:
    name: Binary ${{ matrix.target }}
    runs-on: ubuntu-latest
    outputs:
      version: ${{ steps.extract_version.outputs.version }}
    strategy:
      matrix:
        include:
          - os: ubuntu-latest
            target: x86_64-unknown-linux-musl
          - os: ubuntu-latest
            target: x86_64-unknown-linux-gnu
          - os: ubuntu-latest
            target: aarch64-unknown-linux-musl
          - os: ubuntu-latest
            target: aarch64-unknown-linux-gnu
          - os: ubuntu-latest
            target: armv7-unknown-linux-musleabihf
          - os: ubuntu-latest
            target: armv7-unknown-linux-gnueabihf
          - os: ubuntu-latest
            target: arm-unknown-linux-musleabihf
          - os: ubuntu-latest
            target: x86_64-unknown-freebsd

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

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

      - run: sudo apt update && sudo apt install musl-tools

      - name: cargo build
        uses: houseabsolute/actions-rust-cross@v0
        with:
          command: build
          args: --release --locked ${{ matrix.cargo_flags }}
          target: ${{ matrix.target }}

      - name: Upload artifact
        uses: actions/upload-artifact@v7
        with:
          name: ${{ matrix.target }}
          path: target/${{ matrix.target }}/release/wiresmith

      - name: Get version from tag
        id: extract_version
        run: |
          echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
        shell: bash

      - name: Install CHANGELOG parser
        uses: taiki-e/install-action@parse-changelog

      - name: Get CHANGELOG entry
        run: parse-changelog CHANGELOG.md ${{ steps.extract_version.outputs.version }} | tee changelog_entry
        if: startsWith(github.ref_name, 'v') && github.ref_type == 'tag'
        shell: bash

      - name: Read changelog entry from file
        id: changelog_entry
        uses: juliangruber/read-file-action@v1
        with:
          path: ./changelog_entry
        if: startsWith(github.ref_name, 'v') && github.ref_type == 'tag'

      - name: Release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: target/${{ matrix.target }}/release/wiresmith
          tag: ${{ github.ref_name }}
          asset_name: wiresmith-${{ steps.extract_version.outputs.version }}-${{ matrix.target }}
          body: ${{ steps.changelog_entry.outputs.content }}
        if: startsWith(github.ref_name, 'v') && github.ref_type == 'tag'

  container-images:
    name: Publish images
    runs-on: ubuntu-latest
    needs: publish
    # Run for tags and pushes to the default branch
    if: (startsWith(github.ref_name, 'v') && github.ref_type == 'tag') || github.event.repository.default_branch == github.ref_name

    steps:
      - name: Checkout code
        uses: actions/checkout@v6

      - name: Install qemu-user-static
        run: sudo apt update && sudo apt install qemu-user-static

      - name: Download artifact aarch64-unknown-linux-musl
        uses: actions/download-artifact@v8
        with:
          name: aarch64-unknown-linux-musl
          path: target/aarch64-unknown-linux-musl/release

      - name: Download artifact x86_64-unknown-linux-musl
        uses: actions/download-artifact@v8
        with:
          name: x86_64-unknown-linux-musl
          path: target/x86_64-unknown-linux-musl/release

      - name: Download artifact armv7-unknown-linux-musleabihf
        uses: actions/download-artifact@v8
        with:
          name: armv7-unknown-linux-musleabihf
          path: target/armv7-unknown-linux-musleabihf/release

      - name: podman login
        run: podman login --username ${{ github.actor }} --password ${{ secrets.GITHUB_TOKEN }} ghcr.io

      - name: podman build linux/arm64
        run: podman build --format docker --platform linux/arm64/v8 --manifest wiresmith -f Containerfile target/aarch64-unknown-linux-musl/release

      - name: podman build linux/amd64
        run: podman build --format docker --platform linux/amd64 --manifest wiresmith -f Containerfile target/x86_64-unknown-linux-musl/release

      - name: podman build linux/arm
        run: podman build --format docker --platform linux/arm/v7 --manifest wiresmith -f Containerfile target/armv7-unknown-linux-musleabihf/release

      - name: podman manifest push latest
        run: podman manifest push wiresmith ghcr.io/svenstaro/wiresmith:latest

      - name: podman manifest push tag version
        run: podman manifest push wiresmith ghcr.io/svenstaro/wiresmith:${{ needs.publish.outputs.version }}
        if: startsWith(github.ref_name, 'v')