Skip to content
Latchkey

Package Pull Requests workflow (engineer-man/piston)

The Package Pull Requests workflow from engineer-man/piston, explained and optimized by Latchkey.

C

CI health: C - fair

Point runs-on at Latchkey and get run de-duplication, job timeouts, SHA-pinned actions, self-healing for flaky steps, and up to 58% lower cost, applied automatically.

Grade your own workflow free or run it on Latchkey →
Source: engineer-man/piston.github/workflows/package-pr.yamlLicense MITView source

What it does

This is the Package Pull Requests workflow from the engineer-man/piston 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

workflow (.yml)
name: 'Package Pull Requests'

on:
    pull_request:
        types:
            - opened
            - reopened
            - synchronize
        paths:
            - 'packages/**'

jobs:
    check-pkg:
        name: Validate README
        runs-on: ubuntu-latest
        steps:
            - name: Checkout
              uses: actions/checkout@v3
            - name: Get list of changed files
              uses: lots0logs/gh-action-get-changed-files@2.1.4
              with:
                  token: ${{ secrets.GITHUB_TOKEN }}

            - name: Ensure README was updated
              run: |
                  MISSING_LINES=$(comm -23 <(jq 'if .provides then .provides[].language else .language end' -r $(find packages -name "metadata.json" ) | sed -e 's/^/`/g' -e 's/$/`,/g' | sort -u) <(awk '/# Supported Languages/{flag=1; next} /<br>/{flag=0} flag' readme.md | sort -u))

                  [[ $(echo $MISSING_LINES | wc -c) = "1" ]] && exit 0

                  echo "README has supported languages missing: "
                  comm -23 <(jq 'if .provides then .provides[].language else .language end' -r $(find packages -name "metadata.json" ) | sed -e 's/^/`/g' -e 's/$/`,/g' | sort -u) <(awk '/# Supported Languages/{flag=1; next} /<br>/{flag=0} flag' readme.md | sort -u)
                  exit 1

    build-pkg:
        name: Check that package builds
        runs-on: ubuntu-latest
        steps:
            - name: Checkout
              uses: actions/checkout@v3

            - name: Login to GitHub registry
              uses: docker/login-action@v2
              with:
                  username: ${{ github.actor }}
                  password: ${{ secrets.GITHUB_TOKEN }}
                  registry: docker.pkg.github.com

            - name: Get list of changed files
              uses: lots0logs/gh-action-get-changed-files@2.1.4
              with:
                  token: ${{ secrets.GITHUB_TOKEN }}

            - name: Build Packages
              run: |
                  PACKAGES=$(jq '.[]' -r ${HOME}/files*.json | awk -F/ '$1~/packages/ && $2 && $3{ print $2 "-" $3 }' | sort -u)
                  echo "Packages: $PACKAGES"
                  docker pull docker.pkg.github.com/engineer-man/piston/repo-builder:latest
                  docker build -t repo-builder repo
                  docker run -v "${{ github.workspace }}:/piston" repo-builder --no-server $PACKAGES
                  ls -la packages

            - name: Upload package as artifact
              uses: actions/upload-artifact@v3
              with:
                  name: packages
                  path: packages/*.pkg.tar.gz

    test-pkg:
        name: Test package
        runs-on: ubuntu-latest
        needs: build-pkg
        steps:
            - uses: actions/checkout@v3

            - uses: actions/download-artifact@v3
              with:
                  name: packages

            - name: Relocate downloaded packages
              run: mv *.pkg.tar.gz packages/

            - name: Login to GitHub registry
              uses: docker/login-action@v2
              with:
                  username: ${{ github.actor }}
                  password: ${{ secrets.GITHUB_TOKEN }}
                  registry: docker.pkg.github.com

            - name: Run tests
              run: |
                  ls -la
                  docker run -v $(pwd)'/repo:/piston/repo' -v $(pwd)'/packages:/piston/packages' -d --name repo docker.pkg.github.com/engineer-man/piston/repo-builder --no-build
                  docker pull docker.pkg.github.com/engineer-man/piston/api
                  docker build -t piston-api api
                  docker run --privileged --network container:repo -v $(pwd)'/data:/piston' -e PISTON_LOG_LEVEL=DEBUG -e 'PISTON_REPO_URL=http://localhost:8000/index' -d --name api piston-api
                  echo Waiting for API to start..
                  docker run --network container:api appropriate/curl -s --retry 10 --retry-connrefused http://localhost:2000/api/v2/runtimes

                  echo Waiting for Index to start..
                  docker run --network container:repo appropriate/curl -s --retry 999 --retry-max-time 0 --retry-connrefused http://localhost:8000/index

                  echo Adjusting index
                  sed -i 's/repo/localhost/g' repo/index

                  echo Listing Packages
                  PACKAGES_JSON=$(docker run --network container:api appropriate/curl -s http://localhost:2000/api/v2/packages)
                  echo $PACKAGES_JSON

                  echo Getting CLI ready
                  docker run  -v "$PWD/cli:/app" --entrypoint /bin/bash node:15 -c 'cd /app; npm i'

                  for package in $(jq -r '.[] | "\(.language)-\(.language_version)"' <<< "$PACKAGES_JSON")
                  do
                    echo "Testing $package"
                    PKG_PATH=$(sed 's|-|/|' <<< $package)
                    PKG_NAME=$(awk -F- '{ print $1 }' <<< $package)
                    PKG_VERSION=$(awk -F- '{ print $2 }' <<< $package)

                    echo "Installing..."
                    docker run --network container:api appropriate/curl -sXPOST http://localhost:2000/api/v2/packages -H "Content-Type: application/json" -d "{\"language\":\"$PKG_NAME\",\"version\":\"$PKG_VERSION\"}"

                    TEST_SCRIPTS=packages/$PKG_PATH/test.*
                    echo "Tests: $TEST_SCRIPTS"

                    for tscript in $TEST_SCRIPTS
                    do
                      TEST_RUNTIME=$(awk -F. '{print $2}' <<< $(basename $tscript))
                      echo Running $tscript with runtime=$TEST_RUNTIME
                      docker run --network container:api -v "$PWD/cli:/app" -v "$PWD/$(dirname $tscript):/pkg" node:15 /app/index.js run $TEST_RUNTIME -l $PKG_VERSION /pkg/$(basename $tscript) > test_output
                      cat test_output
                      grep "OK" test_output
                    done
                  done

            - name: Dump logs
              if: ${{ always() }}
              run: |
                  docker logs api
                  docker logs repo

The same workflow, on Latchkey

Removes redundant runs and caps runaway jobs. Added and changed lines are highlighted.

name: 'Package Pull Requests'
 
on:
    pull_request:
        types:
            - opened
            - reopened
            - synchronize
        paths:
            - 'packages/**'
 
concurrency:
    group: ${{ github.workflow }}-${{ github.ref }}
    cancel-in-progress: true
 
jobs:
    check-pkg:
        timeout-minutes: 30
        name: Validate README
        runs-on: latchkey-small
        steps:
            - name: Checkout
              uses: actions/checkout@v3
            - name: Get list of changed files
              uses: lots0logs/gh-action-get-changed-files@2.1.4
              with:
                  token: ${{ secrets.GITHUB_TOKEN }}
 
            - name: Ensure README was updated
              run: |
                  MISSING_LINES=$(comm -23 <(jq 'if .provides then .provides[].language else .language end' -r $(find packages -name "metadata.json" ) | sed -e 's/^/`/g' -e 's/$/`,/g' | sort -u) <(awk '/# Supported Languages/{flag=1; next} /<br>/{flag=0} flag' readme.md | sort -u))
 
                  [[ $(echo $MISSING_LINES | wc -c) = "1" ]] && exit 0
 
                  echo "README has supported languages missing: "
                  comm -23 <(jq 'if .provides then .provides[].language else .language end' -r $(find packages -name "metadata.json" ) | sed -e 's/^/`/g' -e 's/$/`,/g' | sort -u) <(awk '/# Supported Languages/{flag=1; next} /<br>/{flag=0} flag' readme.md | sort -u)
                  exit 1
 
    build-pkg:
        timeout-minutes: 30
        name: Check that package builds
        runs-on: latchkey-small
        steps:
            - name: Checkout
              uses: actions/checkout@v3
 
            - name: Login to GitHub registry
              uses: docker/login-action@v2
              with:
                  username: ${{ github.actor }}
                  password: ${{ secrets.GITHUB_TOKEN }}
                  registry: docker.pkg.github.com
 
            - name: Get list of changed files
              uses: lots0logs/gh-action-get-changed-files@2.1.4
              with:
                  token: ${{ secrets.GITHUB_TOKEN }}
 
            - name: Build Packages
              run: |
                  PACKAGES=$(jq '.[]' -r ${HOME}/files*.json | awk -F/ '$1~/packages/ && $2 && $3{ print $2 "-" $3 }' | sort -u)
                  echo "Packages: $PACKAGES"
                  docker pull docker.pkg.github.com/engineer-man/piston/repo-builder:latest
                  docker build -t repo-builder repo
                  docker run -v "${{ github.workspace }}:/piston" repo-builder --no-server $PACKAGES
                  ls -la packages
 
            - name: Upload package as artifact
              uses: actions/upload-artifact@v3
              with:
                  name: packages
                  path: packages/*.pkg.tar.gz
 
    test-pkg:
        timeout-minutes: 30
        name: Test package
        runs-on: latchkey-small
        needs: build-pkg
        steps:
            - uses: actions/checkout@v3
 
            - uses: actions/download-artifact@v3
              with:
                  name: packages
 
            - name: Relocate downloaded packages
              run: mv *.pkg.tar.gz packages/
 
            - name: Login to GitHub registry
              uses: docker/login-action@v2
              with:
                  username: ${{ github.actor }}
                  password: ${{ secrets.GITHUB_TOKEN }}
                  registry: docker.pkg.github.com
 
            - name: Run tests
              run: |
                  ls -la
                  docker run -v $(pwd)'/repo:/piston/repo' -v $(pwd)'/packages:/piston/packages' -d --name repo docker.pkg.github.com/engineer-man/piston/repo-builder --no-build
                  docker pull docker.pkg.github.com/engineer-man/piston/api
                  docker build -t piston-api api
                  docker run --privileged --network container:repo -v $(pwd)'/data:/piston' -e PISTON_LOG_LEVEL=DEBUG -e 'PISTON_REPO_URL=http://localhost:8000/index' -d --name api piston-api
                  echo Waiting for API to start..
                  docker run --network container:api appropriate/curl -s --retry 10 --retry-connrefused http://localhost:2000/api/v2/runtimes
 
                  echo Waiting for Index to start..
                  docker run --network container:repo appropriate/curl -s --retry 999 --retry-max-time 0 --retry-connrefused http://localhost:8000/index
 
                  echo Adjusting index
                  sed -i 's/repo/localhost/g' repo/index
 
                  echo Listing Packages
                  PACKAGES_JSON=$(docker run --network container:api appropriate/curl -s http://localhost:2000/api/v2/packages)
                  echo $PACKAGES_JSON
 
                  echo Getting CLI ready
                  docker run  -v "$PWD/cli:/app" --entrypoint /bin/bash node:15 -c 'cd /app; npm i'
 
                  for package in $(jq -r '.[] | "\(.language)-\(.language_version)"' <<< "$PACKAGES_JSON")
                  do
                    echo "Testing $package"
                    PKG_PATH=$(sed 's|-|/|' <<< $package)
                    PKG_NAME=$(awk -F- '{ print $1 }' <<< $package)
                    PKG_VERSION=$(awk -F- '{ print $2 }' <<< $package)
 
                    echo "Installing..."
                    docker run --network container:api appropriate/curl -sXPOST http://localhost:2000/api/v2/packages -H "Content-Type: application/json" -d "{\"language\":\"$PKG_NAME\",\"version\":\"$PKG_VERSION\"}"
 
                    TEST_SCRIPTS=packages/$PKG_PATH/test.*
                    echo "Tests: $TEST_SCRIPTS"
 
                    for tscript in $TEST_SCRIPTS
                    do
                      TEST_RUNTIME=$(awk -F. '{print $2}' <<< $(basename $tscript))
                      echo Running $tscript with runtime=$TEST_RUNTIME
                      docker run --network container:api -v "$PWD/cli:/app" -v "$PWD/$(dirname $tscript):/pkg" node:15 /app/index.js run $TEST_RUNTIME -l $PKG_VERSION /pkg/$(basename $tscript) > test_output
                      cat test_output
                      grep "OK" test_output
                    done
                  done
 
            - name: Dump logs
              if: ${{ always() }}
              run: |
                  docker logs api
                  docker logs repo
 

What changed

2 third-party actions are referenced by a movable tag. Pin them to the commit SHA (Latchkey resolves and applies this automatically) so a repointed tag cannot change what runs.

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:

This workflow runs 3 jobs per trigger. On Latchkey the same minutes cost up to 58% less than GitHub-hosted, with zero queue time.

Actions used in this workflow