concurrency:
  group: "create-release-${{ github.sha }}"
env:
  BUILD_ARTIFACTS_BUCKET: "loki-build-artifacts"
  IMAGE_PREFIX: "grafana"
  PUBLISH_TO_GCS: false
  RELEASE_LIB_REF: "main"
  RELEASE_REPO: "grafana/loki"
  USE_GITHUB_APP_TOKEN: true
jobs:
  createRelease:
    if: "${{ fromJSON(needs.shouldRelease.outputs.shouldRelease) }}"
    needs:
    - "shouldRelease"
    outputs:
      draft: "${{ steps.check_release.outputs.draft }}"
      exists: "${{ steps.check_release.outputs.exists }}"
      isLatest: "${{ needs.shouldRelease.outputs.isLatest }}"
      name: "${{ needs.shouldRelease.outputs.name }}"
      sha: "${{ needs.shouldRelease.outputs.sha }}"
    runs-on: "ubuntu-latest"
    steps:
    - name: "pull code to release"
      uses: "actions/checkout@v4"
      with:
        path: "release"
        repository: "${{ env.RELEASE_REPO }}"
    - name: "pull release library code"
      uses: "actions/checkout@v4"
      with:
        path: "lib"
        ref: "${{ env.RELEASE_LIB_REF }}"
        repository: "grafana/loki-release"
    - name: "setup node"
      uses: "actions/setup-node@v4"
      with:
        node-version: 20
    - name: "auth gcs"
      uses: "google-github-actions/auth@v2"
      with:
        credentials_json: "${{ secrets.GCS_SERVICE_ACCOUNT_KEY }}"
    - name: "Set up Cloud SDK"
      uses: "google-github-actions/setup-gcloud@v2"
      with:
        version: ">= 452.0.0"
    - id: "get_github_app_token"
      if: "${{ fromJSON(env.USE_GITHUB_APP_TOKEN) }}"
      name: "get github app token"
      uses: "actions/create-github-app-token@v1"
      with:
        app-id: "${{ secrets.APP_ID }}"
        owner: "${{ github.repository_owner }}"
        private-key: "${{ secrets.APP_PRIVATE_KEY }}"
    - id: "github_app_token"
      name: "set github token"
      run: |
        if [[ "${USE_GITHUB_APP_TOKEN}" == "true" ]]; then
          echo "token=${{ steps.get_github_app_token.outputs.token }}" >> $GITHUB_OUTPUT
        else
          echo "token=${{ secrets.GH_TOKEN }}" >> $GITHUB_OUTPUT
        fi
    - name: "download binaries"
      run: |
        echo "downloading binaries to $(pwd)/dist"
        gsutil cp -r gs://${BUILD_ARTIFACTS_BUCKET}/${{ needs.shouldRelease.outputs.sha }}/dist .
      working-directory: "release"
    - env:
        GH_TOKEN: "${{ steps.github_app_token.outputs.token }}"
      id: "check_release"
      name: "check if release exists"
      run: |
        set +e
        isDraft="$(gh release view --json="isDraft" --jq=".isDraft" ${{ needs.shouldRelease.outputs.name }} 2>&1)"
        set -e
        if [[ "$isDraft" == "release not found" ]]; then
          echo "exists=false" >> $GITHUB_OUTPUT
        else
          echo "exists=true" >> $GITHUB_OUTPUT
        fi
        
        if [[ "$isDraft" == "true" ]]; then
          echo "draft=true" >> $GITHUB_OUTPUT
        fi
      working-directory: "release"
    - id: "release"
      if: "${{ !fromJSON(steps.check_release.outputs.exists) }}"
      name: "create release"
      run: |
        npm install
        npm exec -- release-please github-release \
          --draft \
          --release-type simple \
          --repo-url "${{ env.RELEASE_REPO }}" \
          --target-branch "${{ needs.shouldRelease.outputs.branch }}" \
          --token "${{ steps.github_app_token.outputs.token }}" \
          --shas-to-tag "${{ needs.shouldRelease.outputs.prNumber }}:${{ needs.shouldRelease.outputs.sha }}"
      working-directory: "lib"
    - env:
        GH_TOKEN: "${{ steps.github_app_token.outputs.token }}"
      id: "upload"
      name: "upload artifacts"
      run: |
        gh release upload --clobber ${{ needs.shouldRelease.outputs.name }} dist/*
      working-directory: "release"
    - if: "${{ fromJSON(env.PUBLISH_TO_GCS) }}"
      name: "release artifacts"
      uses: "google-github-actions/upload-cloud-storage@v2"
      with:
        destination: "${{ env.PUBLISH_BUCKET }}"
        parent: false
        path: "release/dist"
        process_gcloudignore: false
  publishDockerPlugins:
    needs:
    - "createRelease"
    runs-on: "ubuntu-latest"
    steps:
    - name: "pull release library code"
      uses: "actions/checkout@v4"
      with:
        path: "lib"
        ref: "${{ env.RELEASE_LIB_REF }}"
        repository: "grafana/loki-release"
    - name: "pull code to release"
      uses: "actions/checkout@v4"
      with:
        path: "release"
        repository: "${{ env.RELEASE_REPO }}"
    - name: "auth gcs"
      uses: "google-github-actions/auth@v2"
      with:
        credentials_json: "${{ secrets.GCS_SERVICE_ACCOUNT_KEY }}"
    - name: "Set up Cloud SDK"
      uses: "google-github-actions/setup-gcloud@v2"
      with:
        version: ">= 452.0.0"
    - name: "Set up QEMU"
      uses: "docker/setup-qemu-action@v3"
    - name: "set up docker buildx"
      uses: "docker/setup-buildx-action@v3"
    - name: "Login to DockerHub (from vault)"
      uses: "grafana/shared-workflows/actions/dockerhub-login@main"
    - name: "download and prepare plugins"
      run: |
        echo "downloading images to $(pwd)/plugins"
        gsutil cp -r gs://${BUILD_ARTIFACTS_BUCKET}/${{ needs.createRelease.outputs.sha }}/plugins .
        mkdir -p "release/clients/cmd/docker-driver"
    - name: "publish docker driver"
      uses: "./lib/actions/push-images"
      with:
        buildDir: "release/clients/cmd/docker-driver"
        imageDir: "plugins"
        imagePrefix: "${{ env.IMAGE_PREFIX }}"
        isPlugin: true
  publishImages:
    needs:
    - "createRelease"
    runs-on: "ubuntu-latest"
    steps:
    - name: "pull release library code"
      uses: "actions/checkout@v4"
      with:
        path: "lib"
        ref: "${{ env.RELEASE_LIB_REF }}"
        repository: "grafana/loki-release"
    - name: "auth gcs"
      uses: "google-github-actions/auth@v2"
      with:
        credentials_json: "${{ secrets.GCS_SERVICE_ACCOUNT_KEY }}"
    - name: "Set up Cloud SDK"
      uses: "google-github-actions/setup-gcloud@v2"
      with:
        version: ">= 452.0.0"
    - name: "Set up QEMU"
      uses: "docker/setup-qemu-action@v3"
    - name: "set up docker buildx"
      uses: "docker/setup-buildx-action@v3"
    - name: "Login to DockerHub (from vault)"
      uses: "grafana/shared-workflows/actions/dockerhub-login@main"
    - name: "download images"
      run: |
        echo "downloading images to $(pwd)/images"
        gsutil cp -r gs://${BUILD_ARTIFACTS_BUCKET}/${{ needs.createRelease.outputs.sha }}/images .
    - name: "publish docker images"
      uses: "./lib/actions/push-images"
      with:
        imageDir: "images"
        imagePrefix: "${{ env.IMAGE_PREFIX }}"
  publishRelease:
    needs:
    - "createRelease"
    - "publishImages"
    - "publishDockerPlugins"
    runs-on: "ubuntu-latest"
    steps:
    - name: "pull code to release"
      uses: "actions/checkout@v4"
      with:
        path: "release"
        repository: "${{ env.RELEASE_REPO }}"
    - id: "get_github_app_token"
      if: "${{ fromJSON(env.USE_GITHUB_APP_TOKEN) }}"
      name: "get github app token"
      uses: "actions/create-github-app-token@v1"
      with:
        app-id: "${{ secrets.APP_ID }}"
        owner: "${{ github.repository_owner }}"
        private-key: "${{ secrets.APP_PRIVATE_KEY }}"
    - id: "github_app_token"
      name: "set github token"
      run: |
        if [[ "${USE_GITHUB_APP_TOKEN}" == "true" ]]; then
          echo "token=${{ steps.get_github_app_token.outputs.token }}" >> $GITHUB_OUTPUT
        else
          echo "token=${{ secrets.GH_TOKEN }}" >> $GITHUB_OUTPUT
        fi
    - env:
        GH_TOKEN: "${{ steps.github_app_token.outputs.token }}"
      if: "${{ !fromJSON(needs.createRelease.outputs.exists) || (needs.createRelease.outputs.draft && fromJSON(needs.createRelease.outputs.draft)) }}"
      name: "publish release"
      run: |
        gh release edit ${{ needs.createRelease.outputs.name }} --draft=false --latest=${{ needs.createRelease.outputs.isLatest }}
      working-directory: "release"
  shouldRelease:
    outputs:
      branch: "${{ steps.extract_branch.outputs.branch }}"
      isLatest: "${{ steps.should_release.outputs.isLatest }}"
      name: "${{ steps.should_release.outputs.name }}"
      prNumber: "${{ steps.should_release.outputs.prNumber }}"
      sha: "${{ steps.should_release.outputs.sha }}"
      shouldRelease: "${{ steps.should_release.outputs.shouldRelease }}"
    runs-on: "ubuntu-latest"
    steps:
    - name: "pull code to release"
      uses: "actions/checkout@v4"
      with:
        path: "release"
        repository: "${{ env.RELEASE_REPO }}"
    - name: "pull release library code"
      uses: "actions/checkout@v4"
      with:
        path: "lib"
        ref: "${{ env.RELEASE_LIB_REF }}"
        repository: "grafana/loki-release"
    - id: "extract_branch"
      name: "extract branch name"
      run: |
        echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_OUTPUT
      working-directory: "release"
    - id: "should_release"
      name: "should a release be created?"
      uses: "./lib/actions/should-release"
      with:
        baseBranch: "${{ steps.extract_branch.outputs.branch }}"
name: "create release"
"on":
  push:
    branches:
    - "release-[0-9]+.[0-9]+.x"
    - "k[0-9]+"
    - "main"
permissions:
  contents: "write"
  id-token: "write"
  pull-requests: "write"