Skip to content

Test CI

Test CI #2226

Workflow file for this run

# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
name: Test CI
on:
pull_request:
push:
branches:
- master
release:
types:
- created
schedule:
- cron: '0 15 * * *'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
DEBIAN_FRONTEND: noninteractive
jobs:
flake8:
name: Check python linting
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.8
uses: actions/setup-python@v5
with:
python-version: '3.8' # lint with minimal version supported (3.8 in 20.04)
- name: Install dependencies
run: |
echo "${{ github.event_name }}! ${{ github.event.action }}"
python -m pip install --upgrade pip
python -m pip install flake8
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Lint with flake8
run: |
flake8 src
eslint:
runs-on: ubuntu-latest
name: Check javascript linting
env:
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: 1
steps:
- uses: actions/checkout@v4
- name: Setup node
uses: actions/setup-node@v4
with:
node-version: 20
- name: Install dependencies
run: |
npm ci
- name: Lint with eslint
run: |
npm run lint
test:
name: Python Unittests
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: ['ubuntu-20.04', 'ubuntu-22.04']
include:
- os: 'ubuntu-20.04'
python-version: '3.8' # default python version in 20.04
- os: 'ubuntu-22.04'
python-version: '3.10' # default python version in 22.04
- os: 'ubuntu-24.04'
python-version: '3.12' # default python version in 22.04
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: pip
- name: Install dependencies
run: |
sudo apt-get update -q
sudo apt-get -q -y install nodejs npm ca-certificates
python -m pip install --upgrade pip setuptools wheel
pip install -r requirements.txt -U
pip install -r requirements-dev.txt
npm ci
- name: Test with coverage
run: |
cd src
coverage run ./manage.py test
coverage run -a ./manage.py test --settings screamshotter.settings.test_timeout screenshotter.tests.CaptureTestCase.test_timeout_screenshot
- name: Coverage upload
run: |
pip install codecov
cd src
codecov
build_docker_image:
name: Build docker image
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3
- name: Build Docker image
run: |
docker build -t screamshotter_ci:latest .
- name: Upload image
uses: ishworkh/[email protected]
with:
image: "screamshotter_ci:latest"
build_deb:
name: Build debian package
runs-on: ubuntu-latest
strategy:
matrix:
os: ['focal', 'jammy', 'noble']
include:
- os: focal
version: '20.04'
- os: jammy
version: '22.04'
- os: noble
version: '24.04'
env:
DISTRO: 'ubuntu:${{ matrix.os }}'
CODE: ${{ matrix.version }}
steps:
- uses: actions/checkout@v4
- name: Prepare versioning
run: |
sed -i 's/+dev/.ubuntu'$CODE'~dev'$GITHUB_RUN_ID'/' debian/changelog
sed -i 's/screamshotter (\([0-9]\+\.[0-9]\+\.[0-9]\+\)\(.*\)) RELEASED;/screamshotter (\1.ubuntu'$CODE'\2) focal;/' debian/changelog
- name: Build package
run: |
make build_deb
cp ./dpkg/*.deb /home/runner/work/screamshotter/
- name: Archive package artifact
uses: actions/upload-artifact@v4
with:
name: debian-${{ matrix.version }}
path: |
/home/runner/work/screamshotter/*.deb
e2e_docker_image:
name: Tests E2E docker
runs-on: ubuntu-latest
needs: [build_docker_image]
steps:
- name: Download image
uses: ishworkh/[email protected]
with:
image: "screamshotter_ci:latest"
- name: Launch service
run: |
docker run -d -p 8000:8000 screamshotter_ci:latest
echo "Waiting for container..."
while ! nc -z "127.0.0.1" "8000"; do
sleep 0.1
done
- name: E2E test
run: |
sleep 2
curl -d url=https://google.com http://localhost:8000 > google.png
- uses: actions/setup-python@v5
with:
python-version: 3.8
- name: Check result
run: |
pip install filetype
if filetype -f google.png |grep -q 'image/png'; then
echo "File is PNG";
exit 0;
else
echo "File is not PNG";
filetype -f google.png;
exit 1;
fi
- name: Archive result artifact
uses: actions/upload-artifact@v4
with:
name: result-docker
path: |
/home/runner/work/screamshotter/screamshotter/google.png
e2e_deb:
name: Tests E2E debian packages
runs-on: ubuntu-${{ matrix.version }}
needs: [ build_deb ]
strategy:
matrix:
version: ['20.04', '22.04', '24.04']
steps:
- uses: actions/download-artifact@v4
with:
name: debian-${{ matrix.version }}
- name: Install package
run: |
sudo apt-get install -y /home/runner/work/screamshotter/screamshotter/*.deb
- name: E2E test
run: |
curl -d url=https://google.com http://localhost:8000 > google.png
- uses: actions/setup-python@v5
with:
python-version: 3.8
- name: Check result
run: |
pip install filetype
if filetype -f google.png |grep -q 'image/png'; then
echo "File is PNG";
exit 0;
else
echo "File is not PNG";
filetype -f google.png;
exit 1;
fi
- name: Archive result artifact
uses: actions/upload-artifact@v4
with:
name: result-${{ matrix.version }}
path: |
/home/runner/work/screamshotter/screamshotter/google.png
deploy:
name: Publish (on release only)
runs-on: ubuntu-latest
needs: [ flake8, eslint, test, e2e_docker_image, e2e_deb ]
if: ${{ github.event_name == 'release' && github.event.action == 'created' }}
steps:
- name: Download 20.04 debian artifact
uses: actions/download-artifact@v4
with:
name: 'debian-20.04'
- name: Download docker image
uses: ishworkh/[email protected]
with:
image: "screamshotter_ci:latest"
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_LOGIN }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Publish Docker image (tag, v2, latest or dev)
run: |
if [[ "${{ github.ref }}" == *"dev"* ]]; then
export DOCKER_TAG=dev
else
docker tag screamshotter_ci:latest makinacorpus/screamshotter:v${{github.ref_name}}
docker push makinacorpus/screamshotter:v${{github.ref_name}}
docker tag screamshotter_ci:latest makinacorpus/screamshotter:v2
docker push makinacorpus/screamshotter:v2
export DOCKER_TAG=latest
fi
docker tag screamshotter_ci:latest makinacorpus/screamshotter:$DOCKER_TAG
docker push makinacorpus/screamshotter:$DOCKER_TAG
- name: Install SSH key
uses: shimataro/ssh-key-action@v2
with:
key: ${{ secrets.SSH_PRIVATE_KEY }}
known_hosts: ${{ secrets.SSH_KNOWN_HOSTS }}
- name: Publish debian packages
run: |
if [[ "${{ github.ref }}" == *"dev"* ]]; then
export DEB_COMPONENT=dev
else
export DEB_COMPONENT=main
fi
echo "${{ github.ref }} : Publishing as $DEB_COMPONENT package"
scp -P ${{ secrets.SSH_PORT }} -o StrictHostKeyChecking=no /home/runner/work/screamshotter/screamshotter/screamshotter_*_amd64.deb ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:/srv/packages/incoming/$DEB_COMPONENT/
if [[ "${{ github.ref }}" == *"dev"* ]]; then
ssh -p ${{ secrets.SSH_PORT }} -o StrictHostKeyChecking=no ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} make focal_dev -C /srv/packages
# ssh -p ${{ secrets.SSH_PORT }} -o StrictHostKeyChecking=no ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} make jammy_dev -C /srv/packages
else
ssh -p ${{ secrets.SSH_PORT }} -o StrictHostKeyChecking=no ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} make focal_main -C /srv/packages
# ssh -p ${{ secrets.SSH_PORT }} -o StrictHostKeyChecking=no ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} make jammy_main -C /srv/packages
fi
- name: Download 22.04 debian artifact
uses: actions/download-artifact@v4
with:
name: debian-22.04
- name: Download 24.04 debian artifact
uses: actions/download-artifact@v4
with:
name: debian-24.04
- name: Attach debian packages as release binaries
uses: skx/github-action-publish-binaries@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
args: '*.deb'