# ## 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) 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.