Skip to content

Commit

Permalink
Initial GHA rules.
Browse files Browse the repository at this point in the history
  • Loading branch information
adiroiban committed Oct 25, 2023
1 parent 39887b6 commit bbf51e5
Show file tree
Hide file tree
Showing 3 changed files with 241 additions and 38 deletions.
206 changes: 206 additions & 0 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,206 @@
# Try to get a short workflow name and a job name that start with Python
# version to make it easier to check the status inside GitHub UI.
#
# When using external actions check that the external repos are permitted via
# the GitHub configuration at https://github.com/twisted/twisted/settings/actions
#
name: CI

on:
push:
branches:
- master
tags:

pull_request:
branches: [ master ]

permissions:
contents: read

# Only have a run a single parallel for each branch.
# Runs for master are queues.
# Older runs for non-master branches are cancelled and the jobs are executed
# only for the latest push to the branch.
concurrency:
group: ${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}


defaults:
run:
shell: bash

env:
# The default values in the job generated by the matrix.
DEFAULT_PYTHON_VERSION: '3.11'

jobs:
testing:
# We can't use `env.*` in the job name, only in the steps.
name: cpython-${{ matrix.python-version }}
runs-on: 'ubuntu-latest'
strategy:
fail-fast: false
matrix:
python-version: ['3.8', '3.9', '3.10', '3.11']

steps:
- uses: actions/checkout@v3

- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: true

- name: Install dependencies
run: |
openssl version
python -m pip install --upgrade twisted coverage
- name: Test
run: |
coverage run -m twisted.trial constantly
- name: Upload coverage data
uses: actions/upload-artifact@v3
with:
name: coverage-data
path: .coverage
if-no-files-found: error # 'warn' or 'ignore' are also available.

coverage:
name: Combine & check coverage.
needs: testing
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
# Use latest Python, so it understands all syntax.
python-version: 3.11

- run: python -Im pip install --upgrade coverage[toml]

- uses: actions/download-artifact@v3
with:
name: coverage-data

- name: Combine coverage & fail if it's <100%.
run: |
python -Im coverage combine
python -Im coverage html --skip-covered --skip-empty
# Report and write to summary.
python -Im coverage report --format=markdown >> $GITHUB_STEP_SUMMARY
# Report again and fail if under 100%.
python -Im coverage report --fail-under=100
static-checks:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
with:
# Need full history for various diff checks to work.
fetch-depth: 0

- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '${{ env.DEFAULT_PYTHON_VERSION }}'

- name: Install dependencies
run: |
python -m pip install --upgrade pyflakes
- name: Run the checks
run: |
python --version
pyflakes constantly
apidocs:
name: API docs build
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: ${{ env.DEFAULT_PYTHON_VERSION }}
- name: Install dependencies
run: |
python -m pip install --upgrade pydoctor
- name: Run pydoctor
run: |
pydoctor --project-name constantly constantly
# Used for various release automation.
# This is also executed for each PR to exercise the release as much
# as possible and reduce the possibility of finding bugs in the release
# process late in the release cycle,
# The files are published only when a tag is created.
release-publish:
name: Check release and publish on twisted-* tag
runs-on: 'ubuntu-latest'
steps:
- uses: actions/checkout@v3

- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '${{ env.DEFAULT_PYTHON_VERSION }}'

- name: Build
run: |
python -m pip install --upgrade pip wheel pep517
rm -rf dist/*
python setup.py bdist_wheel sdist
- name: Files to be pushed to PyPi
run: ls -R dist/

- name: Check matched tag version and branch version - on tag
if: startsWith(github.ref, 'refs/tags/')
run: python admin/check_tag_version_match.py "${{ github.ref }}"

- name: Publish to PyPI - on tag
if: startsWith(github.ref, 'refs/tags/')
uses: pypa/gh-action-pypi-publish@a56da0b891b3dc519c7ee3284aff1fad93cc8598


# We have this job so that the PR can be blocked on a single job.
# In this way, each time a job is modified,
# we don't have to go to GitHub UI and reconfigure branch protection.
# See GitHub support answer for this hack.
# https://gist.github.com/altendky/2e3483a1f7e1ba21cc97de75db9b7d1c
all-successful:
# Is very important to force running this always, as otherwise it will be
# skipped by default.
if: always()
runs-on: ubuntu-latest
# Here should be the list of all the other jobs defined in this file.
needs:
- testing
- coverage
- apidocs
- static-checks
- release-publish
steps:
- name: Require all successes
shell: python
env:
RESULTS: ${{ toJSON(needs.*.result) }}
run: |
import json
import os
import sys
results = json.loads(os.environ["RESULTS"])
sys.exit(0 if all(result == "success" for result in results) else 1)
38 changes: 0 additions & 38 deletions .travis/build_docs.sh

This file was deleted.

35 changes: 35 additions & 0 deletions admin/check_tag_version_match.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#
# Used during the release process to make sure that we release based on a
# tag that has the same version as the current twisted.__version.
#
# Designed to be conditionally called inside GitHub Actions release job.
# Tags should use PEP440 version scheme.
#
# To be called as: admin/check_tag_version_match.py refs/tags/twisted-20.3.0
#
import sys

import pep517.meta


TAG_PREFIX = "refs/tags/"

if len(sys.argv) < 2:
print("No tag check requested.")
sys.exit(0)

branch_version = pep517.meta.load(".").version
run_version = sys.argv[1]

if not run_version.startswith(TAG_PREFIX):
print(f"Not a twisted release tag name '{run_version}.")
sys.exit(1)

run_version = run_version[len(TAG_PREFIX) :] # noqa: E203

if run_version != branch_version:
print(f"Branch is at '{branch_version}' while tag is '{run_version}'")
exit(1)

print(f"All good. Branch and tag versions match for '{branch_version}'.")
sys.exit(0)

0 comments on commit bbf51e5

Please sign in to comment.