Skip to content
Latchkey

Release Python Connector workflow (binance/binance-connector-python)

The Release Python Connector workflow from binance/binance-connector-python, explained and optimized by Latchkey.

C

CI health: C - fair

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

Grade your own workflow free or run it on Latchkey →
Source: binance/binance-connector-python.github/workflows/release.yamlLicense MITView source

What it does

This is the Release Python Connector workflow from the binance/binance-connector-python 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: Release Python Connector

on:
  push:
    branches:
      - master
  workflow_dispatch:

jobs:
  detect-clients:
    runs-on: ubuntu-latest
    outputs:
      clients: ${{ steps.detect.outputs.clients }}
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Detect all clients
        id: detect
        run: |
          ALL_CLIENTS=$(ls -d clients/*/ | xargs -n 1 basename | jq -R -s -c 'split("\n")[:-1] + ["common"]')
          echo "Detected clients: $ALL_CLIENTS"
          echo "clients=$ALL_CLIENTS" >> $GITHUB_ENV
          echo "::set-output name=clients::$ALL_CLIENTS"

  release:
    needs: detect-clients
    runs-on: ubuntu-latest
    strategy:
      max-parallel: 2
      matrix:
        client: ${{ fromJson(needs.detect-clients.outputs.clients) }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 2

      - name: Compare versions
        id: version
        run: |
          if [ "${{ matrix.client }}" == "common" ]; then
            cd common
            old_version=$(git show HEAD^:${{ matrix.client }}/pyproject.toml | grep '^version' | head -1 | sed -E 's/version = "(.*)"/\1/')
          else
            cd clients/${{ matrix.client }}
            old_version=$(git show HEAD^:clients/${{ matrix.client }}/pyproject.toml | grep '^version' | head -1 | sed -E 's/version = "(.*)"/\1/')
          fi

          new_version=$(grep '^version' pyproject.toml | head -1 | sed -E 's/version = "(.*)"/\1/')

          if [ "$old_version" = "$new_version" ]; then
            echo "release_needed=false" >> $GITHUB_OUTPUT
          else
            echo "release_needed=true" >> $GITHUB_OUTPUT
          fi

      - name: Set working directory path
        if: steps.version.outputs.release_needed == 'true'
        id: path
        run: echo "dir=$([[ '${{ matrix.client }}' == 'common' ]] && echo 'common' || echo 'clients/${{ matrix.client }}')" >> $GITHUB_OUTPUT

      - name: Install dependencies
        if: steps.version.outputs.release_needed == 'true'
        working-directory: ${{ steps.path.outputs.dir }}
        run: |
          curl -sSL https://install.python-poetry.org | python3 -
          echo "$HOME/.local/bin" >> $GITHUB_PATH

      - name: Configure Poetry
        if: steps.version.outputs.release_needed == 'true'
        working-directory: ${{ steps.path.outputs.dir }}
        run: |
          poetry install
          if [ "${{ matrix.client }}" == "common" ]; then
            poetry config pypi-token.pypi ${{ secrets.PYPI_COMMON_TOKEN }}
          else
            poetry config pypi-token.pypi ${{ secrets.PYPI_CLIENTS_TOKEN }}
          fi

      - name: Build (release)
        if: steps.version.outputs.release_needed == 'true'
        working-directory: ${{ steps.path.outputs.dir }}
        run: poetry build

      - name: Publish to pypi
        if: steps.version.outputs.release_needed == 'true'
        working-directory: ${{ steps.path.outputs.dir }}
        run: poetry publish

The same workflow, on Latchkey

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

name: Release Python Connector
 
on:
  push:
    branches:
      - master
  workflow_dispatch:
 
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
 
jobs:
  detect-clients:
    timeout-minutes: 30
    runs-on: latchkey-small
    outputs:
      clients: ${{ steps.detect.outputs.clients }}
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
 
      - name: Detect all clients
        id: detect
        run: |
          ALL_CLIENTS=$(ls -d clients/*/ | xargs -n 1 basename | jq -R -s -c 'split("\n")[:-1] + ["common"]')
          echo "Detected clients: $ALL_CLIENTS"
          echo "clients=$ALL_CLIENTS" >> $GITHUB_ENV
          echo "::set-output name=clients::$ALL_CLIENTS"
 
  release:
    timeout-minutes: 30
    needs: detect-clients
    runs-on: latchkey-small
    strategy:
      max-parallel: 2
      matrix:
        client: ${{ fromJson(needs.detect-clients.outputs.clients) }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 2
 
      - name: Compare versions
        id: version
        run: |
          if [ "${{ matrix.client }}" == "common" ]; then
            cd common
            old_version=$(git show HEAD^:${{ matrix.client }}/pyproject.toml | grep '^version' | head -1 | sed -E 's/version = "(.*)"/\1/')
          else
            cd clients/${{ matrix.client }}
            old_version=$(git show HEAD^:clients/${{ matrix.client }}/pyproject.toml | grep '^version' | head -1 | sed -E 's/version = "(.*)"/\1/')
          fi
 
          new_version=$(grep '^version' pyproject.toml | head -1 | sed -E 's/version = "(.*)"/\1/')
 
          if [ "$old_version" = "$new_version" ]; then
            echo "release_needed=false" >> $GITHUB_OUTPUT
          else
            echo "release_needed=true" >> $GITHUB_OUTPUT
          fi
 
      - name: Set working directory path
        if: steps.version.outputs.release_needed == 'true'
        id: path
        run: echo "dir=$([[ '${{ matrix.client }}' == 'common' ]] && echo 'common' || echo 'clients/${{ matrix.client }}')" >> $GITHUB_OUTPUT
 
      - name: Install dependencies
        if: steps.version.outputs.release_needed == 'true'
        working-directory: ${{ steps.path.outputs.dir }}
        run: |
          curl -sSL https://install.python-poetry.org | python3 -
          echo "$HOME/.local/bin" >> $GITHUB_PATH
 
      - name: Configure Poetry
        if: steps.version.outputs.release_needed == 'true'
        working-directory: ${{ steps.path.outputs.dir }}
        run: |
          poetry install
          if [ "${{ matrix.client }}" == "common" ]; then
            poetry config pypi-token.pypi ${{ secrets.PYPI_COMMON_TOKEN }}
          else
            poetry config pypi-token.pypi ${{ secrets.PYPI_CLIENTS_TOKEN }}
          fi
 
      - name: Build (release)
        if: steps.version.outputs.release_needed == 'true'
        working-directory: ${{ steps.path.outputs.dir }}
        run: poetry build
 
      - name: Publish to pypi
        if: steps.version.outputs.release_needed == 'true'
        working-directory: ${{ steps.path.outputs.dir }}
        run: poetry publish
 

What changed

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 2 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