qctl 0.2.0

Control in-repo YAML work queues
Documentation
name: Publish

on:
  pull_request:
    types: [closed]
  workflow_dispatch:

permissions:
  contents: write

env:
  GIT_CONFIG_COUNT: "1"
  GIT_CONFIG_KEY_0: init.defaultBranch
  GIT_CONFIG_VALUE_0: main
  MISE_ENV: dev,release
  # A cache written off the default branch is scoped to that ref, so no
  # other run can read it back.
  CACHE_WRITE: ${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }}

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

jobs:
  crate:
    if: >-
      github.event_name == 'workflow_dispatch' ||
      (github.event.pull_request.merged &&
       github.event.pull_request.head.ref == 'version-packages')
    runs-on: ubuntu-latest
    outputs:
      has_assets: ${{ steps.plan.outputs.has_assets }}
      tag: ${{ steps.plan.outputs.tag }}
      matrix: ${{ steps.plan.outputs.matrix }}
    steps:
      - name: Check out repository
        uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
        with:
          persist-credentials: false
          ref: ${{ github.event.pull_request.merge_commit_sha || github.sha }}
          fetch-depth: 0
      - name: Set up mise
        uses: jdx/mise-action@7e36c90d9ab29c415a2384db3006f3ec8a8cc654 # v4.2.4
        with:
          version: 2026.8.2
          cache: true
          cache_save: ${{ env.CACHE_WRITE }}
      - run: mise install --locked
      - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
        with:
          shared-key: qctl-crate
          save-if: ${{ env.CACHE_WRITE }}
      - name: Plan native assets
        id: plan
        run: verctl assets --github-output "$GITHUB_OUTPUT"
      - uses: victor-software-house/verctl/actions/publish@52a7d3742bfd30c5a7144316403d7e0655341b14 # v0.1.0
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}

  assets:
    name: ${{ matrix.id }}
    needs: crate
    if: needs.crate.outputs.has_assets == 'true'
    strategy:
      fail-fast: false
      matrix: ${{ fromJson(needs.crate.outputs.matrix) }}
    runs-on: ${{ matrix.labels }}
    steps:
      - name: Check out repository
        uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
        with:
          persist-credentials: false
          ref: ${{ github.event.pull_request.merge_commit_sha || github.sha }}
          fetch-depth: 0
      - name: Set up mise
        uses: jdx/mise-action@7e36c90d9ab29c415a2384db3006f3ec8a8cc654 # v4.2.4
        with:
          version: 2026.8.2
          cache: true
          cache_save: ${{ env.CACHE_WRITE }}
      - run: mise install --locked
      - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
        with:
          shared-key: qctl-assets-${{ matrix.id }}
          save-if: ${{ env.CACHE_WRITE }}
      - uses: victor-software-house/verctl/actions/asset@52a7d3742bfd30c5a7144316403d7e0655341b14 # v0.1.0
        with:
          target: ${{ matrix.id }}
          tag: ${{ needs.crate.outputs.tag }}

  schema:
    name: schema
    needs: crate
    runs-on: ubuntu-latest
    steps:
      - name: Check out repository
        uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
        with:
          ref: ${{ github.event.pull_request.merge_commit_sha || github.sha }}
          persist-credentials: false
      - name: Attach the ledger schema
        env:
          GH_TOKEN: ${{ github.token }}
          TAG: ${{ needs.crate.outputs.tag }}
        run: gh release upload "$TAG" schema/tasks.schema.json --clobber