Automatic comment trigger #14258
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# ## Description | |
# | |
# Uses [diffcalc-sheet-generator](https://github.com/smoogipoo/diffcalc-sheet-generator) to run two builds of osu and generate an SR/PP/Score comparison spreadsheet. | |
# | |
# ## Requirements | |
# | |
# Self-hosted runner with installed: | |
# - `docker >= 20.10.16` | |
# - `docker-compose >= 2.5.1` | |
# - `lbzip2` | |
# - `jq` | |
# | |
# ## Usage | |
# | |
# The workflow can be run in two ways: | |
# 1. Via workflow dispatch. | |
# 2. By an owner of the repository posting a pull request or issue comment containing `!diffcalc`. | |
# For pull requests, the workflow will assume the pull request as the target to compare against (i.e. the `OSU_B` variable). | |
# Any lines in the comment of the form `KEY=VALUE` are treated as variables for the generator. | |
# | |
# ## Google Service Account | |
# | |
# Spreadsheets are uploaded to a Google Service Account, and exposed with read-only permissions to the wider audience. | |
# | |
# 1. Create a project at https://console.cloud.google.com | |
# 2. Enable the `Google Sheets` and `Google Drive` APIs. | |
# 3. Create a Service Account | |
# 4. Generate a key in the JSON format. | |
# 5. Encode the key as base64 and store as an **actions secret** with name **`DIFFCALC_GOOGLE_CREDENTIALS`** | |
# | |
# ## Environment variables | |
# | |
# The default environment may be configured via **actions variables**. | |
# | |
# Refer to [the sample environment](https://github.com/smoogipoo/diffcalc-sheet-generator/blob/master/.env.sample), and prefix each variable with `DIFFCALC_` (e.g. `DIFFCALC_THREADS`, `DIFFCALC_INNODB_BUFFER_SIZE`, etc...). | |
name: Run difficulty calculation comparison | |
run-name: "${{ github.event_name == 'workflow_dispatch' && format('Manual run: {0}', inputs.osu-b) || 'Automatic comment trigger' }}" | |
on: | |
issue_comment: | |
types: [ created ] | |
workflow_dispatch: | |
inputs: | |
osu-b: | |
description: "The target build of ppy/osu" | |
type: string | |
required: true | |
ruleset: | |
description: "The ruleset to process" | |
type: choice | |
required: true | |
options: | |
- osu | |
- taiko | |
- catch | |
- mania | |
converts: | |
description: "Include converted beatmaps" | |
type: boolean | |
required: false | |
default: true | |
ranked-only: | |
description: "Only ranked beatmaps" | |
type: boolean | |
required: false | |
default: true | |
generators: | |
description: "Comma-separated list of generators (available: [sr, pp, score])" | |
type: string | |
required: false | |
default: 'pp,sr' | |
osu-a: | |
description: "The source build of ppy/osu" | |
type: string | |
required: false | |
default: 'latest' | |
difficulty-calculator-a: | |
description: "The source build of ppy/osu-difficulty-calculator" | |
type: string | |
required: false | |
default: 'latest' | |
difficulty-calculator-b: | |
description: "The target build of ppy/osu-difficulty-calculator" | |
type: string | |
required: false | |
default: 'latest' | |
score-processor-a: | |
description: "The source build of ppy/osu-queue-score-statistics" | |
type: string | |
required: false | |
default: 'latest' | |
score-processor-b: | |
description: "The target build of ppy/osu-queue-score-statistics" | |
type: string | |
required: false | |
default: 'latest' | |
permissions: | |
pull-requests: write | |
env: | |
EXECUTION_ID: execution-${{ github.run_id }}-${{ github.run_number }}-${{ github.run_attempt }} | |
defaults: | |
run: | |
shell: bash -euo pipefail {0} | |
jobs: | |
check-permissions: | |
name: Check permissions | |
runs-on: ubuntu-latest | |
if: ${{ github.event_name == 'workflow_dispatch' || contains(github.event.comment.body, '!diffcalc') }} | |
steps: | |
- name: Check permissions | |
run: | | |
ALLOWED_USERS=(smoogipoo peppy bdach frenzibyte tsunyoku stanriders) | |
for i in "${ALLOWED_USERS[@]}"; do | |
if [[ "${{ github.actor }}" == "$i" ]]; then | |
exit 0 | |
fi | |
done | |
exit 1 | |
run-diffcalc: | |
name: Run spreadsheet generator | |
needs: check-permissions | |
uses: ./.github/workflows/_diffcalc_processor.yml | |
with: | |
# Can't reference env... Why GitHub, WHY? | |
id: execution-${{ github.run_id }}-${{ github.run_number }}-${{ github.run_attempt }} | |
head-sha: https://github.com/${{ github.repository }}/commit/${{ github.event.pull_request.head.sha || github.sha }} | |
pr-url: ${{ github.event.issue.pull_request.html_url || '' }} | |
pr-text: ${{ github.event.comment.body || '' }} | |
dispatch-inputs: ${{ (github.event.type == 'workflow_dispatch' && toJSON(inputs)) || '' }} | |
secrets: | |
DIFFCALC_GOOGLE_CREDENTIALS: ${{ secrets.DIFFCALC_GOOGLE_CREDENTIALS }} | |
create-comment: | |
name: Create PR comment | |
needs: check-permissions | |
runs-on: ubuntu-latest | |
if: ${{ github.event_name == 'issue_comment' && github.event.issue.pull_request }} | |
steps: | |
- name: Create comment | |
uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 # v2.5.0 | |
with: | |
comment_tag: ${{ env.EXECUTION_ID }} | |
message: | | |
Difficulty calculation queued -- please wait! (${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) | |
*This comment will update on completion* | |
output-cli: | |
name: Info | |
needs: run-diffcalc | |
runs-on: ubuntu-latest | |
steps: | |
- name: Output info | |
run: | | |
echo "Target: ${{ needs.run-diffcalc.outputs.target }}" | |
echo "Spreadsheet: ${{ needs.run-diffcalc.outputs.sheet }}" | |
update-comment: | |
name: Update PR comment | |
needs: [ create-comment, run-diffcalc ] | |
runs-on: ubuntu-latest | |
if: ${{ always() && needs.create-comment.result == 'success' }} | |
steps: | |
- name: Update comment on success | |
if: ${{ needs.run-diffcalc.result == 'success' }} | |
uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 # v2.5.0 | |
with: | |
comment_tag: ${{ env.EXECUTION_ID }} | |
mode: recreate | |
message: | | |
Target: ${{ needs.run-diffcalc.outputs.target }} | |
Spreadsheet: ${{ needs.run-diffcalc.outputs.sheet }} | |
- name: Update comment on failure | |
if: ${{ needs.run-diffcalc.result == 'failure' }} | |
uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 # v2.5.0 | |
with: | |
comment_tag: ${{ env.EXECUTION_ID }} | |
mode: recreate | |
message: | | |
Difficulty calculation failed: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} | |
- name: Update comment on cancellation | |
if: ${{ needs.run-diffcalc.result == 'cancelled' }} | |
uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 # v2.5.0 | |
with: | |
comment_tag: ${{ env.EXECUTION_ID }} | |
mode: delete | |
message: '.' # Appears to be required by this action for non-error status code. |