# Main release workflow. Triggered on tag push or manual trigger.
#
# - Runs all code checks and tests
# - Verifies the app version matches the tag version.
# - Builds the installer and build, uploading them as artifacts.
# - Publishes to TestPyPI and PyPI. Both are conditional on the previous steps passing and require a manual approval.
#
# See docs/RELEASE.md for more information on the release process.

name: release

on:
  push:
    tags:
      - 'v*'
  workflow_dispatch:

jobs:
  check-version:
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v4

      - name: check python version
        uses: samuelcolvin/check-python-version@v4
        id: check-python-version
        with:
          version_file_path: invokeai/version/invokeai_version.py

  frontend-checks:
    uses: ./.github/workflows/frontend-checks.yml
    with:
      always_run: true

  frontend-tests:
    uses: ./.github/workflows/frontend-tests.yml
    with:
      always_run: true

  python-checks:
    uses: ./.github/workflows/python-checks.yml
    with:
      always_run: true

  python-tests:
    uses: ./.github/workflows/python-tests.yml
    with:
      always_run: true

  build:
    uses: ./.github/workflows/build-installer.yml

  publish-testpypi:
    runs-on: ubuntu-latest
    timeout-minutes: 5 # expected run time: <1 min
    needs:
      [
        check-version,
        frontend-checks,
        frontend-tests,
        python-checks,
        python-tests,
        build,
      ]
    environment:
      name: testpypi
      url: https://test.pypi.org/p/invokeai
    permissions:
      id-token: write
    steps:
      - name: download distribution from build job
        uses: actions/download-artifact@v4
        with:
          name: dist
          path: dist/

      - name: publish distribution to TestPyPI
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          repository-url: https://test.pypi.org/legacy/

  publish-pypi:
    runs-on: ubuntu-latest
    timeout-minutes: 5 # expected run time: <1 min
    needs:
      [
        check-version,
        frontend-checks,
        frontend-tests,
        python-checks,
        python-tests,
        build,
      ]
    environment:
      name: pypi
      url: https://pypi.org/p/invokeai
    permissions:
      id-token: write
    steps:
      - name: download distribution from build job
        uses: actions/download-artifact@v4
        with:
          name: dist
          path: dist/

      - name: publish distribution to PyPI
        uses: pypa/gh-action-pypi-publish@release/v1