colobot/.github/workflows/lint_upload_results.yml

68 lines
2.6 KiB
YAML

name: Linter upload results
# Upload linter results after succesful linter run
# This is done in a separate workflow to safely use the read-write GitHub token
# See https://securitylab.github.com/research/github-actions-preventing-pwn-requests
on:
workflow_run:
workflows: ["Linter"]
types:
- completed
jobs:
lint_upload:
runs-on: ubuntu-16.04
steps:
- run: pip install requests
- name: Download linter results
uses: dawidd6/action-download-artifact@v2
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
workflow: lint.yml
run_id: ${{ github.event.workflow_run.id }}
name: JSON results
path: results
- name: Send linter results to GitHub
shell: python
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RUN_ID: ${{ github.event.workflow_run.id }}
run: |
import os
import json
import requests
# Load the results from the lint job artifact
with open("results/stable_annotations.json", "r") as f:
annotations = json.load(f)
summary = 'colobot-lint found {} issues'.format(len(annotations))
# None of the available actions seem to do what I want, they all do stupid things like adding another check... let's just do it manually
# GitHub also doesn't seem to provide you with the check suite or check run ID, so we have to get it from the action ID via the API
s = requests.Session()
s.headers.update({
'Authorization': 'token ' + os.environ['GITHUB_TOKEN'],
'Accept': 'application/vnd.github.antiope-preview+json' # Annotations are still technically a preview feature of the API
})
action_run = s.get(os.environ['GITHUB_API_URL'] + "/repos/" + os.environ['GITHUB_REPOSITORY'] + "/actions/runs/" + os.environ['RUN_ID']).json()
check_suite = s.get(action_run['check_suite_url']).json()
check_suite_runs = s.get(check_suite['check_runs_url']).json()
check_run = check_suite_runs['check_runs'][0] # NOTE: This assumes that the 'lint' job is the first one in the workflow. You could find it by name if you really wanted.
# Annotations have to be sent in batches of 50
first = True
while first or len(annotations) > 0:
first = False
to_send = annotations[:50]
annotations = annotations[50:]
data = {
'output': {
'title': summary,
'summary': summary,
'annotations': to_send
}
}
r = s.patch(check_run['url'], json=data)
r.raise_for_status()