ci: add Docker build and test to CI pipeline #14
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: Build and Test | |
| on: | |
| push: | |
| branches: [ main, 'release/**' ] | |
| pull_request: | |
| branches: [ main ] | |
| jobs: | |
| build-linux: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Install dependencies | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y gcc make zlib1g-dev | |
| - name: Build nauty | |
| run: | | |
| curl -L -o nauty2_9_3.tar.gz https://users.cecs.anu.edu.au/~bdm/nauty/nauty2_9_3.tar.gz | |
| tar xzf nauty2_9_3.tar.gz | |
| cd nauty2_9_3 | |
| ./configure && make | |
| - name: Build surge | |
| working-directory: src | |
| run: | | |
| make surge \ | |
| NAUTY=${{ github.workspace }}/nauty2_9_3 \ | |
| NAUTYLIB=${{ github.workspace }}/nauty2_9_3 \ | |
| CCOPT="-O3" | |
| - name: Test surge | |
| working-directory: src | |
| run: | | |
| ./surge -help 2>&1 | head -3 | |
| ./surge -u C6H6 | |
| ./surge -u C4H10 | |
| - name: Cross-platform verification tests | |
| working-directory: src | |
| run: | | |
| { | |
| echo "=== surge -u C6H6 ===" | |
| ./surge -u C6H6 2>&1 | |
| echo "=== surge -u C4H10 ===" | |
| ./surge -u C4H10 2>&1 | |
| echo "=== surge -u C3H8 ===" | |
| ./surge -u C3H8 2>&1 | |
| echo "=== surge -u C7H8 ===" | |
| ./surge -u C7H8 2>&1 | |
| echo "=== surge -u C2H6O ===" | |
| ./surge -u C2H6O 2>&1 | |
| echo "=== surge -u C10H16O ===" | |
| ./surge -u C10H16O 2>&1 | |
| echo "=== surge -S C4H10 ===" | |
| ./surge -S C4H10 | sort | |
| echo "=== surge -S C2H6O ===" | |
| ./surge -S C2H6O | sort | |
| echo "=== surge -u C7H12O2N2 ===" | |
| ./surge -u C7H12O2N2 2>&1 | |
| echo "=== surge -u -R C10H8 ===" | |
| ./surge -u -R C10H8 2>&1 | |
| } > ../test-results.txt | |
| cat ../test-results.txt | |
| - name: Upload test results | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: test-results-linux-x86_64 | |
| path: test-results.txt | |
| - name: Build canonsdf | |
| working-directory: src | |
| run: | | |
| make canonsdf \ | |
| NAUTY=${{ github.workspace }}/nauty2_9_3 \ | |
| NAUTYLIB=${{ github.workspace }}/nauty2_9_3 \ | |
| CCOPT="-O3" | |
| - name: Upload Linux binary | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: surge-linux-x86_64 | |
| path: src/surge | |
| build-macos: | |
| strategy: | |
| matrix: | |
| include: | |
| - os: macos-14 | |
| arch: arm64 | |
| - os: macos-15 | |
| arch: arm64-m15 | |
| runs-on: ${{ matrix.os }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Install nauty | |
| run: brew install nauty | |
| - name: Create nauty library symlink | |
| run: | | |
| NAUTY_LIB=$(brew --prefix nauty)/lib | |
| ln -sf "$NAUTY_LIB/libnautyL1.a" "$NAUTY_LIB/nautyL1.a" | |
| - name: Build surge | |
| working-directory: src | |
| run: | | |
| make surge \ | |
| NAUTY=$(brew --prefix nauty)/include/nauty \ | |
| NAUTYLIB=$(brew --prefix nauty)/lib \ | |
| CCOPT="-O3" | |
| - name: Test surge | |
| working-directory: src | |
| run: | | |
| ./surge -help 2>&1 | head -3 | |
| ./surge -u C6H6 | |
| ./surge -u C4H10 | |
| - name: Cross-platform verification tests | |
| working-directory: src | |
| run: | | |
| { | |
| echo "=== surge -u C6H6 ===" | |
| ./surge -u C6H6 2>&1 | |
| echo "=== surge -u C4H10 ===" | |
| ./surge -u C4H10 2>&1 | |
| echo "=== surge -u C3H8 ===" | |
| ./surge -u C3H8 2>&1 | |
| echo "=== surge -u C7H8 ===" | |
| ./surge -u C7H8 2>&1 | |
| echo "=== surge -u C2H6O ===" | |
| ./surge -u C2H6O 2>&1 | |
| echo "=== surge -u C10H16O ===" | |
| ./surge -u C10H16O 2>&1 | |
| echo "=== surge -S C4H10 ===" | |
| ./surge -S C4H10 | sort | |
| echo "=== surge -S C2H6O ===" | |
| ./surge -S C2H6O | sort | |
| echo "=== surge -u C7H12O2N2 ===" | |
| ./surge -u C7H12O2N2 2>&1 | |
| echo "=== surge -u -R C10H8 ===" | |
| ./surge -u -R C10H8 2>&1 | |
| } > ../test-results.txt | |
| cat ../test-results.txt | |
| - name: Upload test results | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: test-results-macos-${{ matrix.arch }} | |
| path: test-results.txt | |
| - name: Upload macOS binary | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: surge-macos-${{ matrix.arch }} | |
| path: src/surge | |
| build-windows: | |
| runs-on: windows-latest | |
| defaults: | |
| run: | |
| shell: msys2 {0} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: msys2/setup-msys2@v2 | |
| with: | |
| msystem: UCRT64 | |
| install: >- | |
| mingw-w64-ucrt-x86_64-gcc | |
| make | |
| mingw-w64-ucrt-x86_64-zlib | |
| curl | |
| tar | |
| - name: Build nauty | |
| run: | | |
| curl -L -o nauty2_9_3.tar.gz https://users.cecs.anu.edu.au/~bdm/nauty/nauty2_9_3.tar.gz | |
| tar xzf nauty2_9_3.tar.gz | |
| cd nauty2_9_3 | |
| ./configure && make | |
| - name: Build surge | |
| working-directory: src | |
| run: | | |
| make surge \ | |
| NAUTY=$(cygpath -u "$GITHUB_WORKSPACE")/nauty2_9_3 \ | |
| NAUTYLIB=$(cygpath -u "$GITHUB_WORKSPACE")/nauty2_9_3 \ | |
| CCOPT="-O3" | |
| - name: Test surge | |
| working-directory: src | |
| run: | | |
| ./surge.exe -help 2>&1 | head -3 | |
| ./surge.exe -u C6H6 | |
| ./surge.exe -u C4H10 | |
| - name: Cross-platform verification tests | |
| working-directory: src | |
| run: | | |
| { | |
| echo "=== surge -u C6H6 ===" | |
| ./surge.exe -u C6H6 2>&1 | |
| echo "=== surge -u C4H10 ===" | |
| ./surge.exe -u C4H10 2>&1 | |
| echo "=== surge -u C3H8 ===" | |
| ./surge.exe -u C3H8 2>&1 | |
| echo "=== surge -u C7H8 ===" | |
| ./surge.exe -u C7H8 2>&1 | |
| echo "=== surge -u C2H6O ===" | |
| ./surge.exe -u C2H6O 2>&1 | |
| echo "=== surge -u C10H16O ===" | |
| ./surge.exe -u C10H16O 2>&1 | |
| echo "=== surge -S C4H10 ===" | |
| ./surge.exe -S C4H10 | sort | |
| echo "=== surge -S C2H6O ===" | |
| ./surge.exe -S C2H6O | sort | |
| echo "=== surge -u C7H12O2N2 ===" | |
| ./surge -u C7H12O2N2 2>&1 | |
| echo "=== surge -u -R C10H8 ===" | |
| ./surge.exe -u -R C10H8 2>&1 | |
| } > ../test-results.txt | |
| cat ../test-results.txt | |
| - name: Upload test results | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: test-results-windows-x86_64 | |
| path: test-results.txt | |
| - name: Upload Windows binary | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: surge-windows-x86_64 | |
| path: src/surge.exe | |
| verify-consistency: | |
| needs: [build-linux, build-macos, build-windows] | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Download all test results | |
| uses: actions/download-artifact@v4 | |
| with: | |
| pattern: test-results-* | |
| path: results | |
| - name: Normalize and compare results across platforms | |
| run: | | |
| echo "=== Downloaded test results ===" | |
| ls -la results/*/test-results.txt | |
| # Normalize all results: strip \r, remove timing info | |
| for f in results/*/test-results.txt; do | |
| sed -i 's/\r$//' "$f" | |
| sed -i 's/ in [0-9]*\.[0-9]* sec/ in X sec/g' "$f" | |
| done | |
| # Use Linux as the reference | |
| reference="results/test-results-linux-x86_64/test-results.txt" | |
| echo "" | |
| echo "=== Reference results (Linux x86_64) ===" | |
| cat "$reference" | |
| failed=0 | |
| for result in results/*/test-results.txt; do | |
| platform=$(basename $(dirname "$result")) | |
| if [ "$result" = "$reference" ]; then | |
| continue | |
| fi | |
| echo "" | |
| echo "=== Comparing $platform against reference ===" | |
| if diff -u "$reference" "$result"; then | |
| echo "PASS: $platform matches reference" | |
| else | |
| echo "FAIL: $platform differs from reference!" | |
| failed=1 | |
| fi | |
| done | |
| if [ $failed -eq 1 ]; then | |
| echo "" | |
| echo "FAILURE: Cross-platform results are inconsistent!" | |
| exit 1 | |
| else | |
| echo "" | |
| echo "SUCCESS: All platforms produce identical results" | |
| fi | |
| build-docker: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Build Docker image | |
| run: docker build -t surge:test . | |
| - name: Test Docker image | |
| run: | | |
| docker run --rm surge:test -u C6H6 | |
| docker run --rm surge:test -S C3H8 | |
| - name: Check image size | |
| run: docker images surge:test --format "{{.Size}}" |