Skip to content

Implement Poetry build system (mainly so we don't have to commit dynamically generated front end bundles to git) #3204

Implement Poetry build system (mainly so we don't have to commit dynamically generated front end bundles to git)

Implement Poetry build system (mainly so we don't have to commit dynamically generated front end bundles to git) #3204

Workflow file for this run

name: Tests
on: [push, pull_request]
permissions:
contents: read
jobs:
tests:
name: ${{ matrix.name }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- {name: Windows, python: '3.12', os: windows-latest, tox: fail_fast_test_main}
# - {name: Mac, python: '3.12', os: macos-latest, tox: fail_fast_test_main}
- { name: "ruff", python: "3.11", os: ubuntu-latest, tox: "ruff" }
- { name: "mypy", python: "3.10", os: ubuntu-latest, tox: "mypy" }
# run some integration tests and abort immediately if they fail, for faster feedback
- { name: "Linux", python: "3.12", os: ubuntu-latest, tox: fail_fast_test_main }
- { name: "3.12", python: "3.12", os: ubuntu-latest, tox: py312 }
- { name: "3.11", python: "3.11", os: ubuntu-latest, tox: py311 }
- { name: "3.10", python: "3.10", os: ubuntu-latest, tox: py310 }
- { name: "3.9", python: "3.9", os: ubuntu-latest, tox: py39 }
steps:
# - name: Install and configure Poetry
# uses: snok/install-poetry@v1
# with:
# virtualenvs-create: true
# virtualenvs-in-project: true
# - name: Set up cache
# uses: actions/cache@v3
# id: cached-poetry-dependencies
# with:
# path: .venv
# key: venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('pyproject.toml') }}
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python }}
- name: Install poetry
run: |
python -m pip install poetry
- name: Configure poetry
run: |
python -m poetry config virtualenvs.in-project true
- name: Cache the virtualenv
uses: actions/cache@v2
with:
path: ./.venv
key: ${{ runner.os }}-venv-${{ hashFiles('pyproject.toml') }}
- name: Install poetry plugin
run: python -m poetry self add "poetry-dynamic-versioning[plugin]"
- name: Install dependencies
run: |
python -m poetry install --no-root --with dev,test
- name: set full Python version in PY env var
# See https://pre-commit.com/#github-actions-example
run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV
- name: Set Node.js 18.x
uses: actions/setup-node@v3
with:
node-version: 18.x
- name: Install Yarn
run: npm install -g yarn
- run: poetry run tox -e ${{ matrix.tox }}
lint_typecheck_test_webui:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set Node.js 18.x
uses: actions/setup-node@v3
with:
node-version: 18.x
- uses: borales/actions-yarn@v3
with:
cmd: webui:install
- uses: borales/actions-yarn@v3
with:
cmd: webui:build
- uses: borales/actions-yarn@v3
with:
cmd: webui:test
- uses: borales/actions-yarn@v3
with:
cmd: webui:lint
- uses: borales/actions-yarn@v3
with:
cmd: webui:type-check
verify_docker_build:
name: Always - Docker verify, push to tag 'master' if on master
runs-on: ubuntu-latest
if: github.event_name != 'pull_request' # PR build doesnt get proper version, so dont try to build it
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- uses: docker/login-action@v1
if: github.repository_owner == 'locustio'
with:
username: locustbuild
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: build and publish image
id: docker_build
uses: docker/build-push-action@v5
with:
build-args: |
BUILDKIT_CONTEXT_KEEP_GIT_DIR=1
context: .
file: ./Dockerfile
platforms: linux/amd64,linux/arm64
push: ${{ github.ref == 'refs/heads/master' && github.repository_owner == 'locustio' }}
tags: locustio/locust:master
docker_tagged:
name: Tagged - Docker push to tag based on git tag. Also push 'latest' if on master
needs: tests
runs-on: ubuntu-latest
if: startsWith(github.event.ref, 'refs/tags') && github.repository_owner == 'locustio'
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- run: echo "TAG=${GITHUB_REF#refs/*/}" | tee -a $GITHUB_ENV
- run: echo "BRANCH=$(git branch -a --contains ${{ env.TAG }} | grep -v HEAD | cut -d '/' -f3)" | tee -a $GITHUB_ENV
- uses: docker/login-action@v1
with:
username: locustbuild
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: build and publish image
id: docker_build
uses: docker/build-push-action@v5
with:
build-args: |
BUILDKIT_CONTEXT_KEEP_GIT_DIR=1
context: .
file: ./Dockerfile
platforms: linux/amd64,linux/arm64
push: true
tags: locustio/locust:${{ env.TAG }}${{ ( env.BRANCH == 'master' && ',locustio/locust:latest') || '' }}
publish:
name: PyPI - Publish if this is a tagged commit
needs: [verify_docker_build, tests]
if: startsWith(github.event.ref, 'refs/tags') && github.repository_owner == 'locustio'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.x"
- name: Install dependencies
run: |
python -m pip install --upgrade pip poetry
python -m poetry config virtualenvs.create false
python -m poetry self add "poetry-dynamic-versioning[plugin]"
- name: Build + set TAG env var for later use
run: |
python -m poetry build
echo "TAG=${GITHUB_REF#refs/*/}" | tee -a $GITHUB_ENV
- name: Publish tagged version to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
user: __token__
password: ${{ secrets.PYPI_API_TOKEN }}
skip_existing: true
# The following is disabled because it has stopped working.
# - name: Tweet on release
# uses: infraway/[email protected]
# with:
# status: "New release: ${{ env.TAG }} https://github.com/locustio/locust/releases/tag/${{ env.TAG }}"
# api_key: ${{ secrets.TWITTER_API_CONSUMER_KEY }}
# api_key_secret: ${{ secrets.TWITTER_API_CONSUMER_SECRET }}
# access_token: ${{ secrets.TWITTER_API_ACCESS_TOKEN_KEY }}
# access_token_secret: ${{ secrets.TWITTER_API_ACCESS_TOKEN_SECRET }}
publish_prerelease:
name: PyPI - Publish prerelease on merge commit on master
needs: tests
if: github.ref == 'refs/heads/master' && github.repository_owner == 'locustio'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.x"
- run: git rev-parse HEAD^2 2>/dev/null >/dev/null || echo NOT_MERGE_COMMIT=1 | tee -a $GITHUB_ENV
- name: Install dependencies
if: ${{ env.NOT_MERGE_COMMIT == '' }}
run: |
python -m pip install --upgrade pip poetry
python -m poetry config virtualenvs.create false
python -m poetry self add "poetry-dynamic-versioning[plugin]"
- name: Build
if: ${{ env.NOT_MERGE_COMMIT == '' }}
run: |
python -m poetry build
- name: Publish prerelease version to PyPI
if: ${{ env.NOT_MERGE_COMMIT == '' }}
uses: pypa/gh-action-pypi-publish@release/v1
with:
user: __token__
password: ${{ secrets.PYPI_API_TOKEN }}
skip_existing: true