Enhance CI with macOS binary build and release #323
This file contains hidden or 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] | |
| tags: | |
| - 'v*' | |
| workflow_dispatch: | |
| inputs: | |
| image: | |
| description: "Which image to build? (cpp=C++ engine, cpu=PyTorch CPU, cuda=PyTorch CUDA, all=all three)" | |
| required: true | |
| type: choice | |
| options: | |
| - cpp | |
| - cpu | |
| - cuda | |
| - all | |
| push_image: | |
| description: "Push to ghcr.io?" | |
| required: true | |
| default: "true" | |
| type: choice | |
| options: ["true", "false"] | |
| env: | |
| REGISTRY: ghcr.io | |
| jobs: | |
| file-integrity: | |
| name: File integrity | |
| if: github.event_name == 'push' | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Check required files exist | |
| run: | | |
| files=( | |
| "main.cpp" | |
| "engine/main.py" | |
| "requirements.txt" | |
| ) | |
| failed=0 | |
| for f in "${files[@]}"; do | |
| if [ -f "$f" ]; then | |
| echo "PASS: $f" | |
| else | |
| echo "FAIL: $f -- MISSING" | |
| failed=1 | |
| fi | |
| done | |
| exit $failed | |
| lint-python: | |
| name: Python lint | |
| if: github.event_name == 'push' | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Lint engine/ (ruff) | |
| uses: chartboost/ruff-action@v1 | |
| with: | |
| args: "check engine/ --ignore E501 --exit-zero" | |
| build-binary-linux: | |
| name: Binary (ubuntu-latest) | |
| if: github.event_name == 'push' | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Install g++ | |
| run: sudo apt-get update && sudo apt-get install -y g++ | |
| - name: Compile main.cpp | |
| run: | | |
| g++ -std=c++17 -O3 \ | |
| -I. -Iinclude \ | |
| -o quadtrix main.cpp | |
| - name: Smoke test | |
| run: ./quadtrix --help || true | |
| - name: Upload binary | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: quadtrix-linux-amd64 | |
| path: quadtrix | |
| retention-days: 7 | |
| build-binary-macos: | |
| name: Binary (macos-14) | |
| if: github.event_name == 'push' | |
| runs-on: macos-14 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Compile main.cpp | |
| run: | | |
| g++ -std=c++17 -O3 \ | |
| -I. -Iinclude \ | |
| -o quadtrix main.cpp | |
| - name: Smoke test | |
| run: ./quadtrix --help || true | |
| - name: Package binary | |
| run: tar -czf quadtrix-macos-arm64.tar.gz quadtrix | |
| - name: Upload binary | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: quadtrix-macos-arm64 | |
| path: quadtrix-macos-arm64.tar.gz | |
| retention-days: 7 | |
| release: | |
| name: Publish release | |
| if: startsWith(github.ref, 'refs/tags/v') | |
| needs: [build-binary-linux, build-binary-macos] | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| steps: | |
| - name: Download all artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: dist/ | |
| - name: Publish GitHub release | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| files: | | |
| dist/quadtrix-linux-amd64/quadtrix | |
| dist/quadtrix-macos-arm64/quadtrix-macos-arm64.tar.gz | |
| build-cpp-image: | |
| name: "Build -- cpp (C++ engine - linux/amd64 + arm64)" | |
| if: ${{ github.event_name == 'workflow_dispatch' && (inputs.image == 'cpp' || inputs.image == 'all') }} | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| packages: write | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: docker/setup-qemu-action@v3 | |
| - uses: docker/setup-buildx-action@v3 | |
| - name: Set lowercase image prefix | |
| run: echo "IMAGE_PREFIX=ghcr.io/${GITHUB_REPOSITORY_OWNER,,}/quadtrix" >> $GITHUB_ENV | |
| - name: Login to GHCR | |
| if: ${{ inputs.push_image == 'true' }} | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: ${{ env.REGISTRY }} | |
| username: ${{ github.actor }} | |
| password: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Extract metadata | |
| id: meta | |
| uses: docker/metadata-action@v5 | |
| with: | |
| images: ${{ env.IMAGE_PREFIX }}-cpp | |
| tags: | | |
| type=ref,event=branch | |
| type=sha,prefix=sha- | |
| type=raw,value=latest,enable={{is_default_branch}} | |
| - name: Build & push | |
| uses: docker/build-push-action@v6 | |
| with: | |
| context: . | |
| file: .devops/Dockerfile.cpp | |
| platforms: linux/amd64,linux/arm64 | |
| push: ${{ inputs.push_image == 'true' }} | |
| tags: ${{ steps.meta.outputs.tags }} | |
| labels: ${{ steps.meta.outputs.labels }} | |
| cache-from: type=gha,scope=cpp | |
| cache-to: type=gha,mode=max,scope=cpp | |
| build-cpu-image: | |
| name: "Build -- cpu (PyTorch CPU - linux/amd64 + arm64)" | |
| if: ${{ github.event_name == 'workflow_dispatch' && (inputs.image == 'cpu' || inputs.image == 'all') }} | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| packages: write | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: docker/setup-qemu-action@v3 | |
| - uses: docker/setup-buildx-action@v3 | |
| - name: Set lowercase image prefix | |
| run: echo "IMAGE_PREFIX=ghcr.io/${GITHUB_REPOSITORY_OWNER,,}/quadtrix" >> $GITHUB_ENV | |
| - name: Login to GHCR | |
| if: ${{ inputs.push_image == 'true' }} | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: ${{ env.REGISTRY }} | |
| username: ${{ github.actor }} | |
| password: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Extract metadata | |
| id: meta | |
| uses: docker/metadata-action@v5 | |
| with: | |
| images: ${{ env.IMAGE_PREFIX }}-cpu | |
| tags: | | |
| type=ref,event=branch | |
| type=sha,prefix=sha- | |
| type=raw,value=latest,enable={{is_default_branch}} | |
| - name: Build & push | |
| uses: docker/build-push-action@v6 | |
| with: | |
| context: . | |
| file: .devops/Dockerfile | |
| platforms: linux/amd64,linux/arm64 | |
| push: ${{ inputs.push_image == 'true' }} | |
| tags: ${{ steps.meta.outputs.tags }} | |
| labels: ${{ steps.meta.outputs.labels }} | |
| cache-from: type=gha,scope=cpu | |
| cache-to: type=gha,mode=max,scope=cpu | |
| build-cuda-image: | |
| name: "Build -- cuda (PyTorch CUDA - linux/amd64 only)" | |
| if: ${{ github.event_name == 'workflow_dispatch' && (inputs.image == 'cuda' || inputs.image == 'all') }} | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| packages: write | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: docker/setup-buildx-action@v3 | |
| - name: Set lowercase image prefix | |
| run: echo "IMAGE_PREFIX=ghcr.io/${GITHUB_REPOSITORY_OWNER,,}/quadtrix" >> $GITHUB_ENV | |
| - name: Login to GHCR | |
| if: ${{ inputs.push_image == 'true' }} | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: ${{ env.REGISTRY }} | |
| username: ${{ github.actor }} | |
| password: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Extract metadata | |
| id: meta | |
| uses: docker/metadata-action@v5 | |
| with: | |
| images: ${{ env.IMAGE_PREFIX }}-cuda | |
| tags: | | |
| type=ref,event=branch | |
| type=sha,prefix=sha- | |
| type=raw,value=latest,enable={{is_default_branch}} | |
| - name: Build & push | |
| uses: docker/build-push-action@v6 | |
| with: | |
| context: . | |
| file: .devops/Dockerfile.backend | |
| platforms: linux/amd64 | |
| push: ${{ inputs.push_image == 'true' }} | |
| tags: ${{ steps.meta.outputs.tags }} | |
| labels: ${{ steps.meta.outputs.labels }} | |
| cache-from: type=gha,scope=cuda | |
| cache-to: type=gha,mode=max,scope=cuda |