# WARNING: DO NOT EDIT!
#
# This file was generated by plugin_template, and is managed by it. Please use
# './plugin-template --github pulpcore' to update this file.
#
# For more info visit https://github.com/pulp/plugin_template

---
name: Core Release Pipeline
on:
  workflow_dispatch:
    inputs:
      release:
        description: "Release tag (e.g. 3.2.1)"

defaults:
  run:
    working-directory: "pulpcore"

jobs:
  build-artifacts:
    runs-on: "ubuntu-latest"

    strategy:
      fail-fast: false

    steps:
      - uses: "actions/checkout@v4"
        with:
          fetch-depth: 0
          path: "pulpcore"

      - uses: "actions/setup-python@v4"
        with:
          python-version: "3.8"

      - name: "Install python dependencies"
        run: |
          echo ::group::PYDEPS
          pip install 'packaging~=21.3' bump2version gitpython towncrier wheel requests
          echo ::endgroup::

      - name: "Configure Git with pulpbot name and email"
        run: |
          git config --global user.name 'pulpbot'
          git config --global user.email 'pulp-infra@redhat.com'

      - name: "Setting secrets"
        run: |
          python3 .github/workflows/scripts/secrets.py "$SECRETS_CONTEXT"
        env:
          SECRETS_CONTEXT: "${{ toJson(secrets) }}"

      - name: "Create the release commit, tag it, create a post-release commit, and build plugin package"
        run: |
          python .github/workflows/scripts/release.py ${{ github.event.inputs.release }}

      - name: "Upload Package whl"
        uses: "actions/upload-artifact@v3"
        with:
          name: "plugin_package"
          path: "pulpcore/dist/"
          if-no-files-found: "error"

      - name: "Tar files"
        run: |
          tar -cvf pulpcore.tar .

      - name: "Upload Artifact"
        uses: "actions/upload-artifact@v3"
        with:
          name: "pulpcore.tar"
          path: "pulpcore/pulpcore.tar"


  build-bindings-docs:
    needs:
      - "build-artifacts"
    runs-on: "ubuntu-latest"
    # Install scripts expect TEST to be set, 'docs' is most appropriate even though we don't run tests
    env:
      TEST: "docs"

    steps:
      - uses: "actions/download-artifact@v3"
        with:
          name: "pulpcore.tar"
          path: "pulpcore/"

      - uses: "actions/checkout@v4"
        with:
          fetch-depth: 1
          repository: "pulp/pulp-openapi-generator"
          path: "pulp-openapi-generator"

      - uses: "actions/setup-python@v4"
        with:
          python-version: "3.8"
      - uses: ruby/setup-ruby@v1
        with:
          ruby-version: "2.6"

      - name: "Untar repository"
        run: |
          tar -xf pulpcore.tar

      - name: "Install python dependencies"
        run: |
          echo ::group::PYDEPS
          pip install towncrier twine wheel httpie docker netaddr boto3 ansible mkdocs
          echo "HTTPIE_CONFIG_DIR=$GITHUB_WORKSPACE/pulpcore/.ci/assets/httpie/" >> $GITHUB_ENV
          echo ::endgroup::

      # Building the bindings and docs requires accessing the OpenAPI specs endpoint, so we need to
      # setup the Pulp instance.
      - name: "Before Install"
        run: |
          .github/workflows/scripts/before_install.sh
        shell: "bash"
        env:
          PY_COLORS: "1"
          ANSIBLE_FORCE_COLOR: "1"
          GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
          GITHUB_CONTEXT: "${{ github.event.pull_request.commits_url }}"

      - name: "Install"
        run: |
          .github/workflows/scripts/install.sh
        shell: "bash"
        env:
          PY_COLORS: "1"
          ANSIBLE_FORCE_COLOR: "1"
          GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
          GITHUB_CONTEXT: "${{ github.event.pull_request.commits_url }}"

      - name: "Install Python client"
        run: |
          .github/workflows/scripts/install_python_client.sh
        shell: "bash"
      - name: "Install Ruby client"
        run: |
          .github/workflows/scripts/install_ruby_client.sh
        shell: "bash"
      - name: "Upload python client packages"
        uses: "actions/upload-artifact@v3"
        with:
          name: "python-client.tar"
          path: "pulpcore/core-python-client.tar"
          if-no-files-found: "error"

      - name: "Upload python client docs"
        uses: "actions/upload-artifact@v3"
        with:
          name: "python-client-docs.tar"
          path: "pulpcore/core-python-client-docs.tar"
          if-no-files-found: "error"
      - name: "Upload ruby client packages"
        uses: "actions/upload-artifact@v3"
        with:
          name: "ruby-client.tar"
          path: "pulpcore/core-ruby-client.tar"
          if-no-files-found: "error"
      - name: "Upload python client packages"
        uses: "actions/upload-artifact@v3"
        with:
          name: "python-client.tar"
          path: "pulpcore/file-python-client.tar"
          if-no-files-found: "error"

      - name: "Upload python client docs"
        uses: "actions/upload-artifact@v3"
        with:
          name: "python-client-docs.tar"
          path: "pulpcore/file-python-client-docs.tar"
          if-no-files-found: "error"
      - name: "Upload ruby client packages"
        uses: "actions/upload-artifact@v3"
        with:
          name: "ruby-client.tar"
          path: "pulpcore/file-ruby-client.tar"
          if-no-files-found: "error"
      - name: Build docs
        run: |
          export DJANGO_SETTINGS_MODULE=pulpcore.app.settings
          export PULP_SETTINGS=$PWD/.ci/ansible/settings/settings.py
          make -C docs/ PULP_URL="https://pulp" diagrams html
          tar -cvf docs/docs.tar docs/_build

      - name: "Upload built docs"
        uses: actions/upload-artifact@v3
        with:
          name: "docs.tar"
          path: "pulpcore/docs/docs.tar"

      - name: "Logs"
        if: always()
        run: |
          echo "Need to debug? Please check: https://github.com/marketplace/actions/debugging-with-tmate"
          http --timeout 30 --check-status --pretty format --print hb "https://pulp${PULP_API_ROOT}api/v3/status/" || true
          docker images || true
          docker ps -a || true
          docker logs pulp || true
          docker exec pulp ls -latr /etc/yum.repos.d/ || true
          docker exec pulp cat /etc/yum.repos.d/* || true
          docker exec pulp bash -c "pip3 list && pip3 install pipdeptree && pipdeptree"


  publish-tag:
    runs-on: "ubuntu-latest"
    needs:
      - "build-bindings-docs"

    env:
      GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"

    steps:
      - uses: "actions/download-artifact@v3"
        with:
          name: "pulpcore.tar"
          path: "pulpcore/"

      - name: "Untar repository"
        run: |
          tar -xf pulpcore.tar

      - name: "Configure Git with pulpbot name and email"
        run: |
          git config --global user.name 'pulpbot'
          git config --global user.email 'pulp-infra@redhat.com'

      - name: "Setting secrets"
        run: |
          python3 .github/workflows/scripts/secrets.py "$SECRETS_CONTEXT"
        env:
          SECRETS_CONTEXT: "${{ toJson(secrets) }}"

      - name: "Push branch and tag to GitHub"
        run: |
          bash .github/workflows/scripts/push_branch_and_tag_to_github.sh ${{ github.event.inputs.release }}
  publish-package:
    runs-on: "ubuntu-latest"
    needs:
      - "build-bindings-docs"
      - "publish-tag"

    env:
      GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"

    steps:
      - uses: "actions/checkout@v4"
        with:
          fetch-depth: 1
          path: "pulpcore"

      - uses: "actions/download-artifact@v3"
        with:
          name: "plugin_package"
          path: "pulpcore/dist/"

      - uses: "actions/setup-python@v4"
        with:
          python-version: "3.8"

      - name: "Install python dependencies"
        run: |
          echo ::group::PYDEPS
          pip install twine
          echo ::endgroup::

      - name: "Setting secrets"
        run: |
          python3 .github/workflows/scripts/secrets.py "$SECRETS_CONTEXT"
        env:
          SECRETS_CONTEXT: "${{ toJson(secrets) }}"

      - name: "Deploy plugin to pypi"
        run: |
          .github/workflows/scripts/publish_plugin_pypi.sh ${{ github.event.inputs.release }}
  publish-python-bindings:
    runs-on: "ubuntu-latest"
    needs:
      - "build-bindings-docs"
      - "publish-tag"
    env:
      GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"

    steps:
      - uses: "actions/checkout@v4"
        with:
          fetch-depth: 1
          path: "pulpcore"

      - name: "Download Python client"
        uses: "actions/download-artifact@v3"
        with:
          name: "python-client.tar"
          path: "pulpcore/"

      - name: "Untar python client packages"
        run: |
          tar -xvf core-python-client.tar
          tar -xvf file-python-client.tar

      - uses: "actions/setup-python@v4"
        with:
          python-version: "3.8"

      - name: "Install python dependencies"
        run: |
          echo ::group::PYDEPS
          pip install twine
          echo ::endgroup::

      - name: "Setting secrets"
        run: |
          python3 .github/workflows/scripts/secrets.py "$SECRETS_CONTEXT"
        env:
          SECRETS_CONTEXT: "${{ toJson(secrets) }}"

      - name: "Publish client to pypi"
        run: |
          bash .github/workflows/scripts/publish_client_pypi.sh ${{ github.event.inputs.release }}
  publish-ruby-bindings:
    runs-on: "ubuntu-latest"
    needs:
      - "build-bindings-docs"
      - "publish-tag"

    env:
      GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"

    steps:
      - uses: "actions/checkout@v4"
        with:
          fetch-depth: 1
          path: "pulpcore"

      - name: "Download Ruby client"
        uses: "actions/download-artifact@v3"
        with:
          name: "ruby-client.tar"
          path: "pulpcore/"

      - name: "Untar Ruby client packages"
        run: |
          tar -xvf core-ruby-client.tar
          tar -xvf file-ruby-client.tar

      - uses: ruby/setup-ruby@v1
        with:
          ruby-version: "2.6"

      - name: "Setting secrets"
        run: |
          python3 .github/workflows/scripts/secrets.py "$SECRETS_CONTEXT"
        env:
          SECRETS_CONTEXT: "${{ toJson(secrets) }}"

      - name: "Publish client to rubygems"
        run: |
          bash .github/workflows/scripts/publish_client_gem.sh ${{ github.event.inputs.release }}
  publish-docs:
    runs-on: "ubuntu-latest"
    needs:
      - "build-bindings-docs"
      - "publish-tag"

    env:
      GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"

    steps:
      - uses: "actions/checkout@v4"
        with:
          fetch-depth: 1
          path: "pulpcore"

      - uses: "actions/setup-python@v4"
        with:
          python-version: "3.8"

      - name: "Install python dependencies"
        run: |
          echo ::group::PYDEPS
          pip install 'packaging~=21.3' requests
          echo ::endgroup::

      - name: "Setting secrets"
        run: |
          python3 .github/workflows/scripts/secrets.py "$SECRETS_CONTEXT"
        env:
          SECRETS_CONTEXT: "${{ toJson(secrets) }}"

      - name: "Download built docs"
        uses: "actions/download-artifact@v3"
        with:
          name: "docs.tar"
          path: "pulpcore/"

      - name: "Download Python client docs"
        uses: "actions/download-artifact@v3"
        with:
          name: "python-client-docs.tar"
          path: "pulpcore/"

      - name: "Publish docs to pulpproject.org"
        run: |
          tar -xvf docs.tar
          .github/workflows/scripts/publish_docs.sh tag ${{ github.event.inputs.release }}

  create-gh-release:
    runs-on: "ubuntu-latest"
    needs:
      - "build-bindings-docs"
      - "publish-tag"
      - "publish-package"
      - "publish-python-bindings"
      - "publish-ruby-bindings"
      - "publish-docs"

    steps:
      - name: "Create release on GitHub"
        uses: "actions/github-script@v7"
        env:
          TAG_NAME: "${{ inputs.release }}"
        with:
          script: |
            const { TAG_NAME } = process.env;

            await github.rest.repos.createRelease({
              owner: context.repo.owner,
              repo: context.repo.repo,
              tag_name: TAG_NAME,
              make_latest: "legacy",
            });