diff --git a/.github/workflows/_diffcalc_processor.yml b/.github/workflows/_diffcalc_processor.yml
new file mode 100644
index 0000000000..4e221d0550
--- /dev/null
+++ b/.github/workflows/_diffcalc_processor.yml
@@ -0,0 +1,228 @@
+name: "🔒diffcalc (do not use)"
+
+on:
+ workflow_call:
+ inputs:
+ id:
+ type: string
+ head-sha:
+ type: string
+ pr-url:
+ type: string
+ pr-text:
+ type: string
+ dispatch-inputs:
+ type: string
+ outputs:
+ target:
+ description: The comparison target.
+ value: ${{ jobs.generator.outputs.target }}
+ sheet:
+ description: The comparison spreadsheet.
+ value: ${{ jobs.generator.outputs.sheet }}
+ secrets:
+ DIFFCALC_GOOGLE_CREDENTIALS:
+ required: true
+
+env:
+ GENERATOR_DIR: ${{ github.workspace }}/${{ inputs.id }}
+ GENERATOR_ENV: ${{ github.workspace }}/${{ inputs.id }}/.env
+
+defaults:
+ run:
+ shell: bash -euo pipefail {0}
+
+jobs:
+ generator:
+ name: Run
+ runs-on: self-hosted
+ timeout-minutes: 720
+
+ outputs:
+ target: ${{ steps.run.outputs.target }}
+ sheet: ${{ steps.run.outputs.sheet }}
+
+ steps:
+ - name: Checkout diffcalc-sheet-generator
+ uses: actions/checkout@v4
+ with:
+ path: ${{ inputs.id }}
+ repository: 'smoogipoo/diffcalc-sheet-generator'
+
+ - name: Add base environment
+ env:
+ GOOGLE_CREDS_FILE: ${{ github.workspace }}/${{ inputs.id }}/google-credentials.json
+ VARS_JSON: ${{ (vars != null && toJSON(vars)) || '' }}
+ run: |
+ # Required by diffcalc-sheet-generator
+ cp '${{ env.GENERATOR_DIR }}/.env.sample' "${{ env.GENERATOR_ENV }}"
+
+ # Add Google credentials
+ echo '${{ secrets.DIFFCALC_GOOGLE_CREDENTIALS }}' | base64 -d > "${{ env.GOOGLE_CREDS_FILE }}"
+
+ # Add repository variables
+ echo "${VARS_JSON}" | jq -c '. | to_entries | .[]' | while read -r line; do
+ opt=$(jq -r '.key' <<< ${line})
+ val=$(jq -r '.value' <<< ${line})
+
+ if [[ "${opt}" =~ ^DIFFCALC_ ]]; then
+ optNoPrefix=$(echo "${opt}" | cut -d '_' -f2-)
+ sed -i "s;^${optNoPrefix}=.*$;${optNoPrefix}=${val};" "${{ env.GENERATOR_ENV }}"
+ fi
+ done
+
+ - name: Add HEAD environment
+ run: |
+ sed -i "s;^OSU_A=.*$;OSU_A=${{ inputs.head-sha }};" "${{ env.GENERATOR_ENV }}"
+
+ - name: Add pull-request environment
+ if: ${{ inputs.pr-url != '' }}
+ run: |
+ sed -i "s;^OSU_B=.*$;OSU_B=${{ inputs.pr-url }};" "${{ env.GENERATOR_ENV }}"
+
+ - name: Add comment environment
+ if: ${{ inputs.pr-text != '' }}
+ env:
+ PR_TEXT: ${{ inputs.pr-text }}
+ run: |
+ # Add comment environment
+ echo "${PR_TEXT}" | sed -r 's/\r$//' | { grep -E '^\w+=' || true; } | while read -r line; do
+ opt=$(echo "${line}" | cut -d '=' -f1)
+ sed -i "s;^${opt}=.*$;${line};" "${{ env.GENERATOR_ENV }}"
+ done
+
+ - name: Add dispatch environment
+ if: ${{ inputs.dispatch-inputs != '' }}
+ env:
+ DISPATCH_INPUTS_JSON: ${{ inputs.dispatch-inputs }}
+ run: |
+ function get_input() {
+ echo "${DISPATCH_INPUTS_JSON}" | jq -r ".\"$1\""
+ }
+
+ osu_a=$(get_input 'osu-a')
+ osu_b=$(get_input 'osu-b')
+ ruleset=$(get_input 'ruleset')
+ generators=$(get_input 'generators')
+ difficulty_calculator_a=$(get_input 'difficulty-calculator-a')
+ difficulty_calculator_b=$(get_input 'difficulty-calculator-b')
+ score_processor_a=$(get_input 'score-processor-a')
+ score_processor_b=$(get_input 'score-processor-b')
+ converts=$(get_input 'converts')
+ ranked_only=$(get_input 'ranked-only')
+
+ sed -i "s;^OSU_B=.*$;OSU_B=${osu_b};" "${{ env.GENERATOR_ENV }}"
+ sed -i "s/^RULESET=.*$/RULESET=${ruleset}/" "${{ env.GENERATOR_ENV }}"
+ sed -i "s/^GENERATORS=.*$/GENERATORS=${generators}/" "${{ env.GENERATOR_ENV }}"
+
+ if [[ "${osu_a}" != 'latest' ]]; then
+ sed -i "s;^OSU_A=.*$;OSU_A=${osu_a};" "${{ env.GENERATOR_ENV }}"
+ fi
+
+ if [[ "${difficulty_calculator_a}" != 'latest' ]]; then
+ sed -i "s;^DIFFICULTY_CALCULATOR_A=.*$;DIFFICULTY_CALCULATOR_A=${difficulty_calculator_a};" "${{ env.GENERATOR_ENV }}"
+ fi
+
+ if [[ "${difficulty_calculator_b}" != 'latest' ]]; then
+ sed -i "s;^DIFFICULTY_CALCULATOR_B=.*$;DIFFICULTY_CALCULATOR_B=${difficulty_calculator_b};" "${{ env.GENERATOR_ENV }}"
+ fi
+
+ if [[ "${score_processor_a}" != 'latest' ]]; then
+ sed -i "s;^SCORE_PROCESSOR_A=.*$;SCORE_PROCESSOR_A=${score_processor_a};" "${{ env.GENERATOR_ENV }}"
+ fi
+
+ if [[ "${score_processor_b}" != 'latest' ]]; then
+ sed -i "s;^SCORE_PROCESSOR_B=.*$;SCORE_PROCESSOR_B=${score_processor_b};" "${{ env.GENERATOR_ENV }}"
+ fi
+
+ if [[ "${converts}" == 'true' ]]; then
+ sed -i 's/^NO_CONVERTS=.*$/NO_CONVERTS=0/' "${{ env.GENERATOR_ENV }}"
+ else
+ sed -i 's/^NO_CONVERTS=.*$/NO_CONVERTS=1/' "${{ env.GENERATOR_ENV }}"
+ fi
+
+ if [[ "${ranked_only}" == 'true' ]]; then
+ sed -i 's/^RANKED_ONLY=.*$/RANKED_ONLY=1/' "${{ env.GENERATOR_ENV }}"
+ else
+ sed -i 's/^RANKED_ONLY=.*$/RANKED_ONLY=0/' "${{ env.GENERATOR_ENV }}"
+ fi
+
+ - name: Query latest scores
+ id: query-scores
+ run: |
+ ruleset=$(cat ${{ env.GENERATOR_ENV }} | grep -E '^RULESET=' | cut -d '=' -f2-)
+ performance_data_name=$(curl -s "https://data.ppy.sh/" | grep "performance_${ruleset}_top_1000\b" | tail -1 | awk -F "'" '{print $2}' | sed 's/\.tar\.bz2//g')
+
+ echo "TARGET_DIR=${{ env.GENERATOR_DIR }}/sql/${ruleset}" >> "${GITHUB_OUTPUT}"
+ echo "DATA_NAME=${performance_data_name}" >> "${GITHUB_OUTPUT}"
+ echo "DATA_PKG=${performance_data_name}.tar.bz2" >> "${GITHUB_OUTPUT}"
+
+ - name: Restore score cache
+ id: restore-score-cache
+ uses: maxnowack/local-cache@720e69c948191660a90aa1cf6a42fc4d2dacdf30 # v2
+ with:
+ path: ${{ steps.query-scores.outputs.DATA_PKG }}
+ key: ${{ steps.query-scores.outputs.DATA_NAME }}
+
+ - name: Download scores
+ if: steps.restore-score-cache.outputs.cache-hit != 'true'
+ run: |
+ wget -q -O "${{ steps.query-scores.outputs.DATA_PKG }}" "https://data.ppy.sh/${{ steps.query-scores.outputs.DATA_PKG }}"
+
+ - name: Extract scores
+ run: |
+ tar -I lbzip2 -xf "${{ steps.query-scores.outputs.DATA_PKG }}"
+ rm -r "${{ steps.query-scores.outputs.TARGET_DIR }}"
+ mv "${{ steps.query-scores.outputs.DATA_NAME }}" "${{ steps.query-scores.outputs.TARGET_DIR }}"
+
+ - name: Query latest beatmaps
+ id: query-beatmaps
+ run: |
+ beatmaps_data_name=$(curl -s "https://data.ppy.sh/" | grep "osu_files" | tail -1 | awk -F "'" '{print $2}' | sed 's/\.tar\.bz2//g')
+
+ echo "TARGET_DIR=${{ env.GENERATOR_DIR }}/beatmaps" >> "${GITHUB_OUTPUT}"
+ echo "DATA_NAME=${beatmaps_data_name}" >> "${GITHUB_OUTPUT}"
+ echo "DATA_PKG=${beatmaps_data_name}.tar.bz2" >> "${GITHUB_OUTPUT}"
+
+ - name: Restore beatmap cache
+ id: restore-beatmap-cache
+ uses: maxnowack/local-cache@720e69c948191660a90aa1cf6a42fc4d2dacdf30 # v2
+ with:
+ path: ${{ steps.query-beatmaps.outputs.DATA_PKG }}
+ key: ${{ steps.query-beatmaps.outputs.DATA_NAME }}
+
+ - name: Download beatmap
+ if: steps.restore-beatmap-cache.outputs.cache-hit != 'true'
+ run: |
+ wget -q -O "${{ steps.query-beatmaps.outputs.DATA_PKG }}" "https://data.ppy.sh/${{ steps.query-beatmaps.outputs.DATA_PKG }}"
+
+ - name: Extract beatmap
+ run: |
+ tar -I lbzip2 -xf "${{ steps.query-beatmaps.outputs.DATA_PKG }}"
+ rm -r "${{ steps.query-beatmaps.outputs.TARGET_DIR }}"
+ mv "${{ steps.query-beatmaps.outputs.DATA_NAME }}" "${{ steps.query-beatmaps.outputs.TARGET_DIR }}"
+
+ - name: Run
+ id: run
+ run: |
+ # Add the GitHub token. This needs to be done here because it's unique per-job.
+ sed -i 's/^GH_TOKEN=.*$/GH_TOKEN=${{ github.token }}/' "${{ env.GENERATOR_ENV }}"
+
+ cd "${{ env.GENERATOR_DIR }}"
+
+ docker compose up --build --detach
+ docker compose logs --follow &
+ docker compose wait generator
+
+ link=$(docker compose logs --tail 10 generator | grep 'http' | sed -E 's/^.*(http.*)$/\1/')
+ target=$(cat "${{ env.GENERATOR_ENV }}" | grep -E '^OSU_B=' | cut -d '=' -f2-)
+
+ echo "target=${target}" >> "${GITHUB_OUTPUT}"
+ echo "sheet=${link}" >> "${GITHUB_OUTPUT}"
+
+ - name: Shutdown
+ if: ${{ always() }}
+ run: |
+ cd "${{ env.GENERATOR_DIR }}"
+ docker compose down --volumes
+ rm -rf "${{ env.GENERATOR_DIR }}"
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index fc6e231c4b..cb45447ed5 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -88,7 +88,7 @@ jobs:
# Attempt to upload results even if test fails.
# https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#always
- name: Upload Test Results
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
if: ${{ always() }}
with:
name: osu-test-results-${{matrix.os.prettyname}}-${{matrix.threadingMode}}
diff --git a/.github/workflows/diffcalc.yml b/.github/workflows/diffcalc.yml
index 3b77a463c1..4297a88e89 100644
--- a/.github/workflows/diffcalc.yml
+++ b/.github/workflows/diffcalc.yml
@@ -103,26 +103,11 @@ permissions:
env:
EXECUTION_ID: execution-${{ github.run_id }}-${{ github.run_number }}-${{ github.run_attempt }}
+defaults:
+ run:
+ shell: bash -euo pipefail {0}
+
jobs:
- master-environment:
- name: Save master environment
- runs-on: ubuntu-latest
- outputs:
- HEAD: ${{ steps.get-head.outputs.HEAD }}
- steps:
- - name: Checkout osu
- uses: actions/checkout@v4
- with:
- ref: master
- sparse-checkout: |
- README.md
-
- - name: Get HEAD ref
- id: get-head
- run: |
- ref=$(git log -1 --format='%H')
- echo "HEAD=https://github.com/${{ github.repository }}/commit/${ref}" >> "${GITHUB_OUTPUT}"
-
check-permissions:
name: Check permissions
runs-on: ubuntu-latest
@@ -138,9 +123,23 @@ jobs:
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: [ master-environment, check-permissions ]
+ needs: check-permissions
runs-on: ubuntu-latest
if: ${{ github.event_name == 'issue_comment' && github.event.issue.pull_request }}
steps:
@@ -153,246 +152,34 @@ jobs:
*This comment will update on completion*
- directory:
- name: Prepare directory
- needs: check-permissions
- runs-on: self-hosted
- outputs:
- GENERATOR_DIR: ${{ steps.set-outputs.outputs.GENERATOR_DIR }}
- GENERATOR_ENV: ${{ steps.set-outputs.outputs.GENERATOR_ENV }}
- GOOGLE_CREDS_FILE: ${{ steps.set-outputs.outputs.GOOGLE_CREDS_FILE }}
- steps:
- - name: Checkout diffcalc-sheet-generator
- uses: actions/checkout@v4
- with:
- path: ${{ env.EXECUTION_ID }}
- repository: 'smoogipoo/diffcalc-sheet-generator'
-
- - name: Set outputs
- id: set-outputs
- run: |
- echo "GENERATOR_DIR=${{ github.workspace }}/${{ env.EXECUTION_ID }}" >> "${GITHUB_OUTPUT}"
- echo "GENERATOR_ENV=${{ github.workspace }}/${{ env.EXECUTION_ID }}/.env" >> "${GITHUB_OUTPUT}"
- echo "GOOGLE_CREDS_FILE=${{ github.workspace }}/${{ env.EXECUTION_ID }}/google-credentials.json" >> "${GITHUB_OUTPUT}"
-
- environment:
- name: Setup environment
- needs: [ master-environment, directory ]
- runs-on: self-hosted
- env:
- VARS_JSON: ${{ toJSON(vars) }}
- steps:
- - name: Add base environment
- run: |
- # Required by diffcalc-sheet-generator
- cp '${{ needs.directory.outputs.GENERATOR_DIR }}/.env.sample' "${{ needs.directory.outputs.GENERATOR_ENV }}"
-
- # Add Google credentials
- echo '${{ secrets.DIFFCALC_GOOGLE_CREDENTIALS }}' | base64 -d > "${{ needs.directory.outputs.GOOGLE_CREDS_FILE }}"
-
- # Add repository variables
- echo "${VARS_JSON}" | jq -c '. | to_entries | .[]' | while read -r line; do
- opt=$(jq -r '.key' <<< ${line})
- val=$(jq -r '.value' <<< ${line})
-
- if [[ "${opt}" =~ ^DIFFCALC_ ]]; then
- optNoPrefix=$(echo "${opt}" | cut -d '_' -f2-)
- sed -i "s;^${optNoPrefix}=.*$;${optNoPrefix}=${val};" "${{ needs.directory.outputs.GENERATOR_ENV }}"
- fi
- done
-
- - name: Add master environment
- run: |
- sed -i "s;^OSU_A=.*$;OSU_A=${{ needs.master-environment.outputs.HEAD }};" "${{ needs.directory.outputs.GENERATOR_ENV }}"
-
- - name: Add pull-request environment
- if: ${{ github.event_name == 'issue_comment' && github.event.issue.pull_request }}
- run: |
- sed -i "s;^OSU_B=.*$;OSU_B=${{ github.event.issue.pull_request.html_url }};" "${{ needs.directory.outputs.GENERATOR_ENV }}"
-
- - name: Add comment environment
- if: ${{ github.event_name == 'issue_comment' }}
- env:
- COMMENT_BODY: ${{ github.event.comment.body }}
- run: |
- # Add comment environment
- echo "$COMMENT_BODY" | sed -r 's/\r$//' | grep -E '^\w+=' | while read -r line; do
- opt=$(echo "${line}" | cut -d '=' -f1)
- sed -i "s;^${opt}=.*$;${line};" "${{ needs.directory.outputs.GENERATOR_ENV }}"
- done
-
- - name: Add dispatch environment
- if: ${{ github.event_name == 'workflow_dispatch' }}
- run: |
- sed -i 's;^OSU_B=.*$;OSU_B=${{ inputs.osu-b }};' "${{ needs.directory.outputs.GENERATOR_ENV }}"
- sed -i 's/^RULESET=.*$/RULESET=${{ inputs.ruleset }}/' "${{ needs.directory.outputs.GENERATOR_ENV }}"
- sed -i 's/^GENERATORS=.*$/GENERATORS=${{ inputs.generators }}/' "${{ needs.directory.outputs.GENERATOR_ENV }}"
-
- if [[ '${{ inputs.osu-a }}' != 'latest' ]]; then
- sed -i 's;^OSU_A=.*$;OSU_A=${{ inputs.osu-a }};' "${{ needs.directory.outputs.GENERATOR_ENV }}"
- fi
-
- if [[ '${{ inputs.difficulty-calculator-a }}' != 'latest' ]]; then
- sed -i 's;^DIFFICULTY_CALCULATOR_A=.*$;DIFFICULTY_CALCULATOR_A=${{ inputs.difficulty-calculator-a }};' "${{ needs.directory.outputs.GENERATOR_ENV }}"
- fi
-
- if [[ '${{ inputs.difficulty-calculator-b }}' != 'latest' ]]; then
- sed -i 's;^DIFFICULTY_CALCULATOR_B=.*$;DIFFICULTY_CALCULATOR_B=${{ inputs.difficulty-calculator-b }};' "${{ needs.directory.outputs.GENERATOR_ENV }}"
- fi
-
- if [[ '${{ inputs.score-processor-a }}' != 'latest' ]]; then
- sed -i 's;^SCORE_PROCESSOR_A=.*$;SCORE_PROCESSOR_A=${{ inputs.score-processor-a }};' "${{ needs.directory.outputs.GENERATOR_ENV }}"
- fi
-
- if [[ '${{ inputs.score-processor-b }}' != 'latest' ]]; then
- sed -i 's;^SCORE_PROCESSOR_B=.*$;SCORE_PROCESSOR_B=${{ inputs.score-processor-b }};' "${{ needs.directory.outputs.GENERATOR_ENV }}"
- fi
-
- if [[ '${{ inputs.converts }}' == 'true' ]]; then
- sed -i 's/^NO_CONVERTS=.*$/NO_CONVERTS=0/' "${{ needs.directory.outputs.GENERATOR_ENV }}"
- else
- sed -i 's/^NO_CONVERTS=.*$/NO_CONVERTS=1/' "${{ needs.directory.outputs.GENERATOR_ENV }}"
- fi
-
- if [[ '${{ inputs.ranked-only }}' == 'true' ]]; then
- sed -i 's/^RANKED_ONLY=.*$/RANKED_ONLY=1/' "${{ needs.directory.outputs.GENERATOR_ENV }}"
- else
- sed -i 's/^RANKED_ONLY=.*$/RANKED_ONLY=0/' "${{ needs.directory.outputs.GENERATOR_ENV }}"
- fi
-
- scores:
- name: Setup scores
- needs: [ directory, environment ]
- runs-on: self-hosted
- steps:
- - name: Query latest data
- id: query
- run: |
- ruleset=$(cat ${{ needs.directory.outputs.GENERATOR_ENV }} | grep -E '^RULESET=' | cut -d '=' -f2-)
- performance_data_name=$(curl -s "https://data.ppy.sh/" | grep "performance_${ruleset}_top_1000\b" | tail -1 | awk -F "'" '{print $2}' | sed 's/\.tar\.bz2//g')
-
- echo "TARGET_DIR=${{ needs.directory.outputs.GENERATOR_DIR }}/sql/${ruleset}" >> "${GITHUB_OUTPUT}"
- echo "DATA_NAME=${performance_data_name}" >> "${GITHUB_OUTPUT}"
- echo "DATA_PKG=${performance_data_name}.tar.bz2" >> "${GITHUB_OUTPUT}"
-
- - name: Restore cache
- id: restore-cache
- uses: maxnowack/local-cache@720e69c948191660a90aa1cf6a42fc4d2dacdf30 # v2
- with:
- path: ${{ steps.query.outputs.DATA_PKG }}
- key: ${{ steps.query.outputs.DATA_NAME }}
-
- - name: Download
- if: steps.restore-cache.outputs.cache-hit != 'true'
- run: |
- wget -q -O "${{ steps.query.outputs.DATA_PKG }}" "https://data.ppy.sh/${{ steps.query.outputs.DATA_PKG }}"
-
- - name: Extract
- run: |
- tar -I lbzip2 -xf "${{ steps.query.outputs.DATA_PKG }}"
- rm -r "${{ steps.query.outputs.TARGET_DIR }}"
- mv "${{ steps.query.outputs.DATA_NAME }}" "${{ steps.query.outputs.TARGET_DIR }}"
-
- beatmaps:
- name: Setup beatmaps
- needs: directory
- runs-on: self-hosted
- steps:
- - name: Query latest data
- id: query
- run: |
- beatmaps_data_name=$(curl -s "https://data.ppy.sh/" | grep "osu_files" | tail -1 | awk -F "'" '{print $2}' | sed 's/\.tar\.bz2//g')
-
- echo "TARGET_DIR=${{ needs.directory.outputs.GENERATOR_DIR }}/beatmaps" >> "${GITHUB_OUTPUT}"
- echo "DATA_NAME=${beatmaps_data_name}" >> "${GITHUB_OUTPUT}"
- echo "DATA_PKG=${beatmaps_data_name}.tar.bz2" >> "${GITHUB_OUTPUT}"
-
- - name: Restore cache
- id: restore-cache
- uses: maxnowack/local-cache@720e69c948191660a90aa1cf6a42fc4d2dacdf30 # v2
- with:
- path: ${{ steps.query.outputs.DATA_PKG }}
- key: ${{ steps.query.outputs.DATA_NAME }}
-
- - name: Download
- if: steps.restore-cache.outputs.cache-hit != 'true'
- run: |
- wget -q -O "${{ steps.query.outputs.DATA_PKG }}" "https://data.ppy.sh/${{ steps.query.outputs.DATA_PKG }}"
-
- - name: Extract
- run: |
- tar -I lbzip2 -xf "${{ steps.query.outputs.DATA_PKG }}"
- rm -r "${{ steps.query.outputs.TARGET_DIR }}"
- mv "${{ steps.query.outputs.DATA_NAME }}" "${{ steps.query.outputs.TARGET_DIR }}"
-
- generator:
- name: Run generator
- needs: [ directory, environment, scores, beatmaps ]
- runs-on: self-hosted
- timeout-minutes: 720
- outputs:
- TARGET: ${{ steps.run.outputs.TARGET }}
- SPREADSHEET_LINK: ${{ steps.run.outputs.SPREADSHEET_LINK }}
- steps:
- - name: Run
- id: run
- run: |
- # Add the GitHub token. This needs to be done here because it's unique per-job.
- sed -i 's/^GH_TOKEN=.*$/GH_TOKEN=${{ github.token }}/' "${{ needs.directory.outputs.GENERATOR_ENV }}"
-
- cd "${{ needs.directory.outputs.GENERATOR_DIR }}"
- docker-compose up --build generator
-
- link=$(docker-compose logs generator -n 10 | grep 'http' | sed -E 's/^.*(http.*)$/\1/')
- target=$(cat "${{ needs.directory.outputs.GENERATOR_ENV }}" | grep -E '^OSU_B=' | cut -d '=' -f2-)
-
- echo "TARGET=${target}" >> "${GITHUB_OUTPUT}"
- echo "SPREADSHEET_LINK=${link}" >> "${GITHUB_OUTPUT}"
-
- - name: Shutdown
- if: ${{ always() }}
- run: |
- cd "${{ needs.directory.outputs.GENERATOR_DIR }}"
- docker-compose down -v
-
output-cli:
- name: Output info
- needs: generator
+ name: Info
+ needs: run-diffcalc
runs-on: ubuntu-latest
steps:
- name: Output info
run: |
- echo "Target: ${{ needs.generator.outputs.TARGET }}"
- echo "Spreadsheet: ${{ needs.generator.outputs.SPREADSHEET_LINK }}"
-
- cleanup:
- name: Cleanup
- needs: [ directory, generator ]
- if: ${{ always() && needs.directory.result == 'success' }}
- runs-on: self-hosted
- steps:
- - name: Cleanup
- run: |
- rm -rf "${{ needs.directory.outputs.GENERATOR_DIR }}"
+ echo "Target: ${{ needs.run-diffcalc.outputs.target }}"
+ echo "Spreadsheet: ${{ needs.run-diffcalc.outputs.sheet }}"
update-comment:
name: Update PR comment
- needs: [ create-comment, generator ]
+ needs: [ create-comment, run-diffcalc ]
runs-on: ubuntu-latest
if: ${{ always() && needs.create-comment.result == 'success' }}
steps:
- name: Update comment on success
- if: ${{ needs.generator.result == '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.generator.outputs.TARGET }}
- Spreadsheet: ${{ needs.generator.outputs.SPREADSHEET_LINK }}
+ Target: ${{ needs.run-diffcalc.outputs.target }}
+ Spreadsheet: ${{ needs.run-diffcalc.outputs.sheet }}
- name: Update comment on failure
- if: ${{ needs.generator.result == 'failure' }}
+ if: ${{ needs.run-diffcalc.result == 'failure' }}
uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 # v2.5.0
with:
comment_tag: ${{ env.EXECUTION_ID }}
@@ -401,7 +188,7 @@ jobs:
Difficulty calculation failed: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
- name: Update comment on cancellation
- if: ${{ needs.generator.result == 'cancelled' }}
+ if: ${{ needs.run-diffcalc.result == 'cancelled' }}
uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 # v2.5.0
with:
comment_tag: ${{ env.EXECUTION_ID }}
diff --git a/.github/workflows/report-nunit.yml b/.github/workflows/report-nunit.yml
index c44f46d70a..14f0208fc8 100644
--- a/.github/workflows/report-nunit.yml
+++ b/.github/workflows/report-nunit.yml
@@ -5,33 +5,40 @@
name: Annotate CI run with test results
on:
workflow_run:
- workflows: ["Continuous Integration"]
+ workflows: [ "Continuous Integration" ]
types:
- completed
-permissions: {}
+
+permissions:
+ contents: read
+ actions: read
+ checks: write
+
jobs:
annotate:
- permissions:
- checks: write # to create checks (dorny/test-reporter)
-
name: Annotate CI run with test results
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion != 'cancelled' }}
- strategy:
- fail-fast: false
- matrix:
- os:
- - { prettyname: Windows }
- - { prettyname: macOS }
- - { prettyname: Linux }
- threadingMode: ['SingleThread', 'MultiThreaded']
timeout-minutes: 5
steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ repository: ${{ github.event.workflow_run.repository.full_name }}
+ ref: ${{ github.event.workflow_run.head_sha }}
+
+ - name: Download results
+ uses: actions/download-artifact@v4
+ with:
+ pattern: osu-test-results-*
+ merge-multiple: true
+ run-id: ${{ github.event.workflow_run.id }}
+ github-token: ${{ github.token }}
+
- name: Annotate CI run with test results
uses: dorny/test-reporter@v1.8.0
with:
- artifact: osu-test-results-${{matrix.os.prettyname}}-${{matrix.threadingMode}}
- name: Test Results (${{matrix.os.prettyname}}, ${{matrix.threadingMode}})
+ name: Results
path: "*.trx"
reporter: dotnet-trx
list-suites: 'failed'
diff --git a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/osu.Game.Rulesets.EmptyFreeform.Tests.csproj b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/osu.Game.Rulesets.EmptyFreeform.Tests.csproj
index 7d43eb2b05..f77cda1533 100644
--- a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/osu.Game.Rulesets.EmptyFreeform.Tests.csproj
+++ b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/osu.Game.Rulesets.EmptyFreeform.Tests.csproj
@@ -9,7 +9,7 @@
false
-
+
diff --git a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj
index 7dc8a1336b..47cabaddb1 100644
--- a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj
+++ b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj
@@ -9,7 +9,7 @@
false
-
+
diff --git a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/osu.Game.Rulesets.EmptyScrolling.Tests.csproj b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/osu.Game.Rulesets.EmptyScrolling.Tests.csproj
index 9c4c8217f0..a7d62291d0 100644
--- a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/osu.Game.Rulesets.EmptyScrolling.Tests.csproj
+++ b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/osu.Game.Rulesets.EmptyScrolling.Tests.csproj
@@ -9,7 +9,7 @@
false
-
+
diff --git a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj
index 7dc8a1336b..47cabaddb1 100644
--- a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj
+++ b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj
@@ -9,7 +9,7 @@
false
-
+
diff --git a/osu.Android.props b/osu.Android.props
index 7844dcc1fe..f271bdfaaf 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -10,7 +10,7 @@
true
-
+
-
+
-
+
diff --git a/osu.iOS.props b/osu.iOS.props
index 9fc7cdf453..ecb9ae2c8d 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -17,6 +17,6 @@
-all
-
+
diff --git a/osu.sln.DotSettings b/osu.sln.DotSettings
index 4a2ef97520..ccd6db354b 100644
--- a/osu.sln.DotSettings
+++ b/osu.sln.DotSettings
@@ -69,7 +69,7 @@
DO_NOT_SHOW
HINT
WARNING
- WARNING
+ HINT
WARNING
WARNING
DO_NOT_SHOW