Merge pull request #1395 from meejah/4133.packaging-disaster-zone #185
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CI | |
on: | |
push: | |
branches: | |
- "master" | |
pull_request: | |
# At the start of each workflow run, GitHub creates a unique | |
# GITHUB_TOKEN secret to use in the workflow. It is a good idea for | |
# this GITHUB_TOKEN to have the minimum of permissions. See: | |
# | |
# - https://docs.github.com/en/actions/security-guides/automatic-token-authentication | |
# - https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions | |
# | |
permissions: | |
contents: read | |
# Control to what degree jobs in this workflow will run concurrently with | |
# other instances of themselves. | |
# | |
# https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions#concurrency | |
concurrency: | |
# We want every revision on master to run the workflow completely. | |
# "head_ref" is not set for the "push" event but it is set for the | |
# "pull_request" event. If it is set then it is the name of the branch and | |
# we can use it to make sure each branch has only one active workflow at a | |
# time. If it is not set then we can compute a unique string that gives | |
# every master/push workflow its own group. | |
group: "${{ github.head_ref || format('{0}-{1}', github.run_number, github.run_attempt) }}" | |
# Then, we say that if a new workflow wants to start in the same group as a | |
# running workflow, the running workflow should be cancelled. | |
cancel-in-progress: true | |
env: | |
# Tell Hypothesis which configuration we want it to use. | |
TAHOE_LAFS_HYPOTHESIS_PROFILE: "ci" | |
jobs: | |
coverage: | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- os: macos-14 | |
python-version: "3.12" | |
# We only support PyPy on Linux at the moment. | |
- os: ubuntu-22.04 | |
python-version: "pypy-3.9" | |
- os: ubuntu-22.04 | |
python-version: "3.12" | |
- os: windows-2022 | |
python-version: "3.12" | |
steps: | |
# See https://github.com/actions/checkout. A fetch-depth of 0 | |
# fetches all tags and branches. | |
- name: Check out Tahoe-LAFS sources | |
uses: actions/checkout@v3 | |
with: | |
fetch-depth: 0 | |
- name: Set up Python ${{ matrix.python-version }} | |
uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ matrix.python-version }} | |
cache: 'pip' # caching pip dependencies | |
- name: Install Python packages | |
run: | | |
pip install --upgrade tox tox-gh-actions | |
pip list | |
- name: Display tool versions | |
run: python misc/build_helpers/show-tool-versions.py | |
- name: Run tox for corresponding Python version | |
if: ${{ !contains(matrix.os, 'windows') }} | |
run: python -m tox | |
# On Windows, a non-blocking pipe might respond (when emulating Unix-y | |
# API) with ENOSPC to indicate buffer full. Trial doesn't handle this | |
# well, so it breaks test runs. To attempt to solve this, we pipe the | |
# output through passthrough.py that will hopefully be able to do the right | |
# thing by using Windows APIs. | |
- name: Run tox for corresponding Python version | |
if: ${{ contains(matrix.os, 'windows') }} | |
run: | | |
pip install twisted pywin32 | |
python -m tox | python misc/windows-enospc/passthrough.py | |
- name: Upload eliot.log | |
uses: actions/upload-artifact@v4 | |
with: | |
name: "eliot-${{ matrix.os }}-python-${{ matrix.python-version }}.log" | |
path: eliot.log | |
- name: Upload trial log | |
uses: actions/upload-artifact@v4 | |
with: | |
name: "test-${{ matrix.os }}-python-${{ matrix.python-version }}.log" | |
path: _trial_temp/test.log | |
# Upload this job's coverage data to Coveralls. While there is a GitHub | |
# Action for this, as of Jan 2021 it does not support Python coverage | |
# files - only lcov files. Therefore, we use coveralls-python, the | |
# coveralls.io-supplied Python reporter, for this. | |
- name: "Report Coverage to Coveralls" | |
run: | | |
pip3 install --upgrade coveralls==3.0.1 | |
python3 -m coveralls | |
env: | |
# Some magic value required for some magic reason. | |
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" | |
# Help coveralls identify our project. | |
COVERALLS_REPO_TOKEN: "JPf16rLB7T2yjgATIxFzTsEgMdN1UNq6o" | |
# Every source of coverage reports needs a unique "flag name". | |
# Construct one by smashing a few variables from the matrix together | |
# here. | |
COVERALLS_FLAG_NAME: "run-${{ matrix.os }}-${{ matrix.python-version }}" | |
# Mark the data as just one piece of many because we have more than | |
# one instance of this job (Windows, macOS) which collects and | |
# reports coverage. This is necessary to cause Coveralls to merge | |
# multiple coverage results into a single report. Note the merge | |
# only happens when we "finish" a particular build, as identified by | |
# its "build_num" (aka "service_number"). | |
COVERALLS_PARALLEL: true | |
# Tell Coveralls that we're done reporting coverage data. Since we're using | |
# the "parallel" mode where more than one coverage data file is merged into | |
# a single report, we have to tell Coveralls when we've uploaded all of the | |
# data files. This does it. We make sure it runs last by making it depend | |
# on *all* of the coverage-collecting jobs. | |
# | |
# See notes about parallel builds on GitHub Actions at | |
# https://coveralls-python.readthedocs.io/en/latest/usage/configuration.html | |
finish-coverage-report: | |
needs: | |
- "coverage" | |
runs-on: "ubuntu-22.04" | |
container: "python:3-slim" | |
steps: | |
- name: "Indicate completion to coveralls.io" | |
run: | | |
pip3 install --upgrade coveralls==3.0.1 | |
python3 -m coveralls --finish | |
env: | |
# Some magic value required for some magic reason. | |
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" | |
integration: | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: | |
# 22.04 has some issue with Tor at the moment: | |
# https://tahoe-lafs.org/trac/tahoe-lafs/ticket/3943 | |
- ubuntu-20.04 | |
- macos-14 | |
- windows-2022 | |
python-version: | |
- "3.11" | |
force-foolscap: | |
- false | |
include: | |
- os: ubuntu-20.04 | |
python-version: "3.12" | |
force-foolscap: true | |
steps: | |
- name: Install Tor [Ubuntu] | |
if: ${{ contains(matrix.os, 'ubuntu') }} | |
run: sudo apt install tor | |
# TODO: See https://tahoe-lafs.org/trac/tahoe-lafs/ticket/3744. | |
# We have to use an older version of Tor for running integration | |
# tests on macOS. | |
- name: Install Tor [macOS, ${{ matrix.python-version }} ] | |
if: ${{ contains(matrix.os, 'macos') }} | |
run: | | |
brew install tor | |
- name: Install Tor [Windows] | |
if: matrix.os == 'windows-2022' | |
uses: crazy-max/ghaction-chocolatey@v2 | |
with: | |
args: install tor | |
- name: Check out Tahoe-LAFS sources | |
uses: actions/checkout@v3 | |
with: | |
fetch-depth: 0 | |
- name: Set up Python ${{ matrix.python-version }} | |
uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ matrix.python-version }} | |
cache: 'pip' # caching pip dependencies | |
- name: Install Python packages | |
run: | | |
pip install --upgrade tox | |
pip list | |
- name: Display tool versions | |
run: python misc/build_helpers/show-tool-versions.py | |
- name: Run "Python 3 integration tests" | |
if: "${{ !matrix.force-foolscap }}" | |
env: | |
# On macOS this is necessary to ensure unix socket paths for tor | |
# aren't too long. On Windows tox won't pass it through so it has no | |
# effect. On Linux it doesn't make a difference one way or another. | |
TMPDIR: "/tmp" | |
run: | | |
tox -e integration | |
- name: Run "Python 3 integration tests (force Foolscap)" | |
if: "${{ matrix.force-foolscap }}" | |
env: | |
# On macOS this is necessary to ensure unix socket paths for tor | |
# aren't too long. On Windows tox won't pass it through so it has no | |
# effect. On Linux it doesn't make a difference one way or another. | |
TMPDIR: "/tmp" | |
run: | | |
tox -e integration -- --force-foolscap integration/ | |
- name: Upload eliot.log in case of failure | |
uses: actions/upload-artifact@v4 | |
if: failure() | |
with: | |
name: "integration.eliot-${{ matrix.os }}-python-${{ matrix.python-version }}.json" | |
path: integration.eliot.json | |
packaging: | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: | |
- macos-14 | |
- windows-2022 | |
- ubuntu-22.04 | |
python-version: | |
- 3.9 | |
steps: | |
- name: Check out Tahoe-LAFS sources | |
uses: actions/checkout@v3 | |
with: | |
fetch-depth: 0 | |
- name: Set up Python ${{ matrix.python-version }} | |
uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ matrix.python-version }} | |
cache: 'pip' # caching pip dependencies | |
- name: Install Python packages | |
run: | | |
pip install --upgrade tox | |
pip list | |
- name: Display tool versions | |
run: python misc/build_helpers/show-tool-versions.py | |
- name: Run "tox -e pyinstaller" | |
run: tox -e pyinstaller | |
# This step is to ensure there are no packaging/import errors. | |
- name: Test PyInstaller executable | |
run: dist/Tahoe-LAFS/tahoe --version | |
- name: Upload PyInstaller package | |
uses: actions/upload-artifact@v4 | |
with: | |
name: Tahoe-LAFS-${{ matrix.os }}-Python-${{ matrix.python-version }} | |
path: dist/Tahoe-LAFS-*-*.* |