ci: cache poetry env #730
Workflow file for this run
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 | |
- renovate/* | |
- dev/* | |
tags: | |
- v* | |
pull_request: | |
branches: | |
- master | |
- v0.8.x | |
jobs: | |
test: | |
runs-on: ubuntu-22.04 | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: '3.10' | |
#----------------------------------------# | |
# Install & configure Poetry # | |
#----------------------------------------# | |
- name: Load cached Poetry Binary | |
id: cached-poetry-binary | |
uses: actions/cache@v3 | |
with: | |
path: ~/.local | |
key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-1.6.1 | |
- name: Install Poetry | |
uses: snok/install-poetry@v1 | |
with: | |
version: "1.6.1" | |
virtualenvs-create: true | |
virtualenvs-in-project: true | |
#----------------------------------------------# | |
# Load cached venv if cache exists # | |
#----------------------------------------------# | |
- name: Load cached venv | |
id: cached-poetry-dependencies | |
uses: actions/cache@v3 | |
with: | |
path: .venv | |
key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }} | |
# Restore cache with this prefix if not exact match with key | |
# Note cache-hit returns false in this case, so the below step will run | |
restore-keys: | | |
venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}- | |
#----------------------------------------------------------# | |
# Install dependencies if cache does not exist # | |
#----------------------------------------------------------# | |
- name: Install dependencies | |
if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' | |
shell: bash | |
run: poetry install --no-interaction --no-root --all-extras | |
- name: Install root | |
run: poetry run pip install -e . --no-deps | |
- run: poetry run pytest --cov=ampel | |
mypy: | |
runs-on: ubuntu-22.04 | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: '3.10' | |
- name: Install dependencies (with all extras) | |
run: | | |
python -m pip install --upgrade poetry | |
poetry install --all-extras | |
- run: poetry run mypy -p ampel | |
check_version: | |
name: Tag version bump | |
runs-on: ubuntu-22.04 | |
# run only on pushes, not PRs | |
if: ${{ github.event_name == 'push' && github.base_ref == null }} | |
needs: [test, mypy] | |
outputs: | |
should_publish: ${{ steps.check.outputs.result }} | |
steps: | |
- uses: actions/setup-node@v3 | |
with: | |
node-version: 14 | |
- run: npm install [email protected] | |
- name: Ensure tag for version bump | |
id: check | |
uses: actions/github-script@v6 | |
with: | |
script: | | |
const toml = require('toml') | |
async function getVersion(ref) { | |
try { | |
response = await github.rest.repos.getContent({ | |
repo: context.repo.repo, | |
owner: context.repo.owner, | |
path: 'pyproject.toml', | |
ref: ref | |
}); | |
return toml.parse(Buffer.from(response.data.content, 'base64').toString()) | |
.tool | |
.poetry | |
.version; | |
} catch (exc) { | |
if (exc.name == 'HttpError' && exc.status == 404) { | |
return null; | |
} else { | |
throw exc; | |
} | |
} | |
} | |
after = await getVersion(context.payload.after); | |
ref = `refs/tags/v${after}` | |
is_main = context.payload.ref === `refs/heads/${context.payload.repository.default_branch}` | |
// a tag matching the version was just pushed | |
let release = context.payload.ref == ref; | |
if (release) { | |
console.log(`Tag v${after} pushed (${context.sha})`); | |
} | |
// the version on the default branch changed; create a tag | |
if (!release && is_main) { | |
before = await getVersion(context.payload.before); | |
if (before !== after) { | |
console.log(`Version bumped: ${before} -> ${after}`); | |
try { | |
await github.rest.git.createRef({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
ref, | |
sha: context.sha | |
}); | |
console.log(`Tag v${after} created (${context.sha})`); | |
release = true; | |
} catch (exc) { | |
// tag already existed | |
if (exc.name == 'HttpError' && exc.status == 422) { | |
console.log(`Skipping publish (tag v${after} already exists)`); | |
release = false; | |
} else { | |
throw exc; | |
} | |
} | |
} else { | |
console.log(`Skipping publish (version is still ${before})`); | |
} | |
} else if (!is_main) { | |
console.log(`Skipping publish (push to ${context.payload.ref} != refs/heads/${context.payload.repository.default_branch})`); | |
} | |
return release; | |
pypi: | |
name: Publish to PyPI | |
runs-on: ubuntu-22.04 | |
needs: [check_version] | |
# NB: outputs are always strings; explicitly parse to get a boolean | |
if: ${{ fromJSON(needs.check_version.outputs.should_publish) }} | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: '3.10' | |
- name: Install poetry | |
run: | | |
python -m pip install --upgrade poetry | |
- name: Publish | |
run: | | |
poetry publish -n --build | |
env: | |
POETRY_PYPI_TOKEN_PYPI: ${{ secrets.PYPI_API_TOKEN }} |