68 lines
2.6 KiB
YAML
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()
|