Merge pull request #1333 from colobot/dev-gh-actions

Use colobot-lint from GitHub Actions rather than Jenkins and fix linter on PRs from forks
fix-quicksave-sim-speed-crash
krzys_h 2020-07-20 21:42:13 +02:00 committed by GitHub
commit f1d6787b08
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 70 additions and 21 deletions

View File

@ -13,16 +13,61 @@ jobs:
steps: steps:
- name: Download Colobot dependencies - name: Download Colobot dependencies
run: sudo apt-get update && sudo apt-get install -y --no-install-recommends build-essential cmake libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev libsndfile1-dev libvorbis-dev libogg-dev libpng-dev libglew-dev libopenal-dev libboost-dev libboost-system-dev libboost-filesystem-dev libboost-regex-dev libphysfs-dev gettext git po4a vorbis-tools librsvg2-bin xmlstarlet run: sudo apt-get update && sudo apt-get install -y --no-install-recommends build-essential cmake libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev libsndfile1-dev libvorbis-dev libogg-dev libpng-dev libglew-dev libopenal-dev libboost-dev libboost-system-dev libboost-filesystem-dev libboost-regex-dev libphysfs-dev gettext git po4a vorbis-tools librsvg2-bin xmlstarlet
# TODO: migrate colobot-lint to GitHub Actions - name: Download colobot-lint dependencies
run: sudo apt-get install -y --no-install-recommends clang-3.6 libtinyxml2.6.2v5
- run: pip install requests
- run: mkdir -p /tmp/colobot-lint
- name: Download colobot-lint - name: Download colobot-lint
working-directory: /tmp/colobot-lint
shell: python
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
REPO_NAME: colobot/colobot-lint
BRANCH_NAME: master
ARTIFACT_NAME: colobot-lint
run: | run: |
sudo apt-get install -y --no-install-recommends clang-3.6 libtinyxml2.6.2v5 import os
mkdir -p /tmp/colobot-lint import requests
cd /tmp/colobot-lint
wget -O colobot-lint.zip "https://compiled.colobot.info/job/colobot/job/colobot-lint/job/dev/lastSuccessfulBuild/artifact/*zip*/archive.zip"
# How there can be no builtin action to download the latest artifact from another repo?!
s = requests.Session()
s.headers.update({
'Authorization': 'token ' + os.environ['GITHUB_TOKEN'],
'Accept': 'application/vnd.github.v3+json'
})
r = s.get("https://api.github.com/repos/" + os.environ['REPO_NAME'] + "/actions/runs", params={'branch': os.environ['BRANCH_NAME'], 'event': 'push', 'status': 'success'})
r.raise_for_status()
# Querying for "dev" returns all branches that have "dev" anywhere in the name... is that a GitHub bug or intended behaviour?
runs = list(filter(lambda x: x['head_branch'] == os.environ['BRANCH_NAME'], r.json()['workflow_runs']))
if len(runs) == 0:
raise Exception('No valid run found')
run = runs[0]
print("Using colobot-lint from run #{} ({}) for commit {}".format(run['run_number'], run['id'], run['head_sha']))
r = s.get(run['artifacts_url'])
r.raise_for_status()
artifacts = list(filter(lambda x: x['name'] == os.environ['ARTIFACT_NAME'], r.json()['artifacts']))
if len(artifacts) != 1:
raise Exception('Artifact not found')
artifact = artifacts[0]
print(artifact['archive_download_url'])
r = s.get(artifact['archive_download_url'], stream=True)
r.raise_for_status()
with open(os.environ['ARTIFACT_NAME'] + '.zip', 'wb') as f:
for block in r.iter_content(1024):
f.write(block)
print("Download finished")
- name: Unpack colobot-lint
working-directory: /tmp/colobot-lint
run: |
# Unzip the archive # Unzip the archive
unzip ./colobot-lint.zip mkdir archive; cd archive
unzip ../colobot-lint.zip
cd ..
# Workaround for Clang not finding system headers # Workaround for Clang not finding system headers
mkdir ./bin mkdir ./bin
mv ./archive/build/colobot-lint ./bin/ mv ./archive/build/colobot-lint ./bin/
@ -73,11 +118,11 @@ jobs:
with: with:
name: HTML results name: HTML results
path: build/html_report path: build/html_report
- run: pip install requests
- name: Send linter results to GitHub - name: Send linter results to GitHub
shell: python shell: python
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ACTUALLY_SEND: ${{ github.event.type != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
run: | run: |
import os import os
import sys import sys
@ -185,21 +230,25 @@ jobs:
summary = 'colobot-lint found {} issues'.format(len(annotations)) summary = 'colobot-lint found {} issues'.format(len(annotations))
all_ok = len(annotations) == 0 all_ok = len(annotations) == 0
print('Conclusion: {}'.format(summary))
# Annotations have to be sent in batches of 50 if os.environ['ACTUALLY_SEND'] != "true":
first = True print('Skip uploading the results as annotations because tokens from forks are readonly and there seems to be no way to do it. Blame GitHub Actions devs.')
while first or len(annotations) > 0: else:
first = False # Annotations have to be sent in batches of 50
to_send = annotations[:50] first = True
annotations = annotations[50:] while first or len(annotations) > 0:
data = { first = False
'output': { to_send = annotations[:50]
'title': summary, annotations = annotations[50:]
'summary': summary, data = {
'annotations': to_send 'output': {
'title': summary,
'summary': summary,
'annotations': to_send
}
} }
} r = s.patch(check_run['url'], json=data)
r = s.patch(check_run['url'], json=data) r.raise_for_status()
r.raise_for_status()
sys.exit(0 if all_ok else 1) sys.exit(0 if all_ok else 1)