CI workflow (wolffcatskyy/crowdsec-blocklist-import)
The CI workflow from wolffcatskyy/crowdsec-blocklist-import, 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 CI workflow from the wolffcatskyy/crowdsec-blocklist-import repository, a real project running GitHub Actions. It is shown here with attribution under its MIT license.
Below, Latchkey shows a faster, safer version produced by its optimization engine.
The workflow
name: CI
on:
push:
branches: [main]
tags:
- 'v*.*.*'
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install pytest flake8
- name: Run pytest
run: |
python -m pytest test_blocklist_import.py -v
- name: Check Python syntax
run: |
python -m py_compile blocklist_import.py
- name: Lint with flake8
run: |
flake8 blocklist_import.py --max-line-length 120 --ignore E501,W503
release:
name: Create GitHub Release
needs: test
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/v')
permissions:
contents: write
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Extract changelog for this version
id: changelog
run: |
TAG="${GITHUB_REF#refs/tags/}"
VER="${TAG#v}"
if [ -f CHANGELOG.md ]; then
# Extract the section between this tag and the previous one
NOTES=$(awk "/^## \[?${VER}\]?|^## ${VER}/{found=1; next} found && /^## /{exit} found{print}" CHANGELOG.md)
if [ -z "$NOTES" ]; then
NOTES="Release ${TAG}"
fi
else
NOTES="Release ${TAG}"
fi
# Write to a file to safely handle multi-line content
echo "$NOTES" > release_notes.txt
- name: Create GitHub Release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
TAG="${GITHUB_REF#refs/tags/}"
gh release create "$TAG" \
--title "Release $TAG" \
--notes-file release_notes.txt
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: CI on: push: branches: [main] tags: - 'v*.*.*' pull_request: branches: [main] concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: test: timeout-minutes: 30 runs-on: latchkey-small steps: - name: Checkout uses: actions/checkout@v4 - name: Set up Python 3.11 uses: actions/setup-python@v5 with: cache: 'pip' python-version: '3.11' - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt pip install pytest flake8 - name: Run pytest run: | python -m pytest test_blocklist_import.py -v - name: Check Python syntax run: | python -m py_compile blocklist_import.py - name: Lint with flake8 run: | flake8 blocklist_import.py --max-line-length 120 --ignore E501,W503 release: timeout-minutes: 30 name: Create GitHub Release needs: test runs-on: latchkey-small if: startsWith(github.ref, 'refs/tags/v') permissions: contents: write steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Extract changelog for this version id: changelog run: | TAG="${GITHUB_REF#refs/tags/}" VER="${TAG#v}" if [ -f CHANGELOG.md ]; then # Extract the section between this tag and the previous one NOTES=$(awk "/^## \[?${VER}\]?|^## ${VER}/{found=1; next} found && /^## /{exit} found{print}" CHANGELOG.md) if [ -z "$NOTES" ]; then NOTES="Release ${TAG}" fi else NOTES="Release ${TAG}" fi # Write to a file to safely handle multi-line content echo "$NOTES" > release_notes.txt - name: Create GitHub Release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | TAG="${GITHUB_REF#refs/tags/}" gh release create "$TAG" \ --title "Release $TAG" \ --notes-file release_notes.txt
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 2 jobs per trigger. On Latchkey the same minutes cost up to 58% less than GitHub-hosted, with zero queue time.