Release workflow (laixintao/iredis)
The Release workflow from laixintao/iredis, explained and optimized by Latchkey.
CI health: D - needs work
Point runs-on at Latchkey and get caching, run de-duplication, job timeouts, self-healing for flaky steps, and up to 58% lower cost, applied automatically.
What it does
This is the Release workflow from the laixintao/iredis repository, a real project running GitHub Actions. It is shown here with attribution under its BSD-3-Clause license.
Below, Latchkey shows a faster, safer version produced by its optimization engine.
The workflow
name: Release
on:
push:
tags:
- v*
jobs:
release-pypi:
name: release-pypi
runs-on: ubuntu-latest
# FIXME
# help test shouldn't depends on this to run
services:
redis:
image: redis:5
ports:
- 6379:6379
options: --entrypoint redis-server
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v5
with:
python-version: 3.12
architecture: 'x64'
- name: Cache venv
uses: actions/cache@v4
with:
path: venv
# Look to see if there is a cache hit for the corresponding requirements file
key: ubuntu-latest-poetryenv-${{ hashFiles('poetry.lock') }}
- name: Install Dependencies
run: |
python3 -m venv venv
. venv/bin/activate
pip install -U pip
pip install poetry
poetry install
python -c "import sys; print(sys.version)"
pip list
- name: Poetry Build
run: |
. venv/bin/activate
poetry build
- name: Test Build
run: |
python3 -m venv fresh_env
. fresh_env/bin/activate
pip install dist/*.whl
iredis -h
iredis help GET
- name: Upload to Pypi
env:
PASSWORD: ${{ secrets.PYPI_TOKEN }}
run: |
. venv/bin/activate
poetry publish --username __token__ --password ${PASSWORD}
The same workflow, on Latchkey
Estimated ~20% faster on cache hits, plus fewer wasted runs and a safer supply chain. Added and changed lines are highlighted.
name: Release on: push: tags: - v* concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: release-pypi: timeout-minutes: 30 name: release-pypi runs-on: latchkey-small # FIXME # help test shouldn't depends on this to run services: redis: image: redis:5 ports: - 6379:6379 options: --entrypoint redis-server steps: - uses: actions/checkout@v2 - uses: actions/setup-python@v5 with: cache: 'pip' python-version: 3.12 architecture: 'x64' - name: Cache venv uses: actions/cache@v4 with: path: venv # Look to see if there is a cache hit for the corresponding requirements file key: ubuntu-latest-poetryenv-${{ hashFiles('poetry.lock') }} - name: Install Dependencies run: | python3 -m venv venv . venv/bin/activate pip install -U pip pip install poetry poetry install python -c "import sys; print(sys.version)" pip list - name: Poetry Build run: | . venv/bin/activate poetry build - name: Test Build run: | python3 -m venv fresh_env . fresh_env/bin/activate pip install dist/*.whl iredis -h iredis help GET - name: Upload to Pypi env: PASSWORD: ${{ secrets.PYPI_TOKEN }} run: | . venv/bin/activate poetry publish --username __token__ --password ${PASSWORD}
What changed
- Run on Latchkey managed runners with one line (
runs-on), which apply the fixes below automatically and self-heal transient failures. This example useslatchkey-small; pick the runner size that fits the job. - Cancel superseded runs when a branch or PR gets a newer push.
- Cache dependency installs on the setup step so they are served from cache.
- Add a job timeout so a hung step cannot burn hours of runner time.
What Latchkey heals here
This workflow has steps that commonly fail on transient issues (network, registries, flaky browsers). On Latchkey managed runners they are detected, retried, and self-healed instead of failing your build:
- Dependency installs
This workflow runs 1 job per trigger. On Latchkey the same minutes cost up to 58% less than GitHub-hosted, with zero queue time.