aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/.github/workflows/ci.yml
blob: 8d4766065cacc952bcb963d7eb934f7bb1cd7f47 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
name: CI

on:
  push:
  workflow_dispatch:

jobs:
  lint:
    runs-on: ubuntu-latest
    name: Linting
    continue-on-error: ${{ github.ref != 'refs/heads/master' }}
    steps:
      - name: Checkout
        uses: actions/checkout@v7
      - name: Set up clang-format
        uses: egor-tensin/setup-clang@v2
        with:
          # To use the latest clang-format features:
          version: 22
      - name: Run clang-format
        uses: egor-tensin/clang-format@v1
        with:
          version: 22
      - name: Set up Python
        uses: actions/setup-python@v7
        with:
          python-version: '3.x'
      - name: Run black
        uses: psf/black@stable

  build:
    strategy:
      matrix:
        toolset: [gcc, vs2022, vs2026]
        platform: [x64, x86]
        configuration: [Debug, Release]
        include:
          - boost-version: 1.81.0
          - {toolset: gcc, os: ubuntu-latest}
          - {toolset: vs2022, os: windows-2022}
          # Boost supports VS 2026 starting with version 1.91, I think?
          - {toolset: vs2026, os: windows-2025, boost-version: 1.91.0}
        exclude:
          # 32-bit Linux builds, meh.
          - {toolset: gcc, platform: x86}
    runs-on: '${{ matrix.os }}'
    name: 'Build: ${{ matrix.toolset }} / ${{ matrix.platform }} / ${{ matrix.configuration }}'
    env:
      TOOLSET: '${{ matrix.toolset }}'
      PLATFORM: '${{ matrix.platform }}'
      CONFIGURATION: '${{ matrix.configuration }}'
      BOOST_VERSION: '${{ matrix.boost-version }}'
      CMAKE_FLAGS: --cmake-arg=-DMATH_SERVER_TESTS=ON
    defaults:
      run:
        shell: pwsh
    steps:
      - name: Checkout
        uses: actions/checkout@v7
        with:
          submodules: recursive
      - name: Set up Python
        uses: actions/setup-python@v7
        with:
          python-version: '3.x'
      - name: Cache Boost
        uses: actions/cache@v6
        with:
          path: './build/boost_*.tar.gz'
          key: 'boost_${{ env.BOOST_VERSION }}'
      - name: Build Boost
        run: make deps
      - name: Build
        run: make install
      - name: Upload binaries
        uses: actions/upload-artifact@v7
        with:
          name: 'math-server-${{ matrix.toolset }}-${{ matrix.platform }}-${{ matrix.configuration }}'
          path: './build/install/'
          if-no-files-found: error
      - name: Test
        run: make test

  publish:
    needs: [lint]
    strategy:
      matrix:
        project: [client, server]
    runs-on: ubuntu-latest
    name: 'Docker: publish math-${{ matrix.project }}'
    steps:
      - name: Checkout
        uses: actions/checkout@v7
        with:
          submodules: recursive
      # https://github.com/docker/metadata-action#semver
      - id: meta
        name: Docker Hub metadata
        uses: docker/metadata-action@v6
        with:
          images: '${{ secrets.DOCKERHUB_USERNAME }}/math-${{ matrix.project }}'
          flavor: |
            latest=auto
          tags: |
            type=ref,event=branch
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}
            type=semver,pattern={{major}}
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v4
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v4
      - id: params
        name: Push? Which platforms?
        # Building for ARM for every commit in master is too time-consuming.
        run: |
          if [ '${{ github.ref }}' = 'refs/heads/master' ]; then
              echo 'push=true' >> "$GITHUB_OUTPUT"
              echo 'platforms=amd64' >> "$GITHUB_OUTPUT"
          elif ${{ startsWith(github.ref, 'refs/tags/') }}; then
              echo 'push=true' >> "$GITHUB_OUTPUT"
              echo 'platforms=amd64,armhf,arm64' >> "$GITHUB_OUTPUT"
          else
              echo 'push=false' >> "$GITHUB_OUTPUT"
              echo 'platforms=amd64' >> "$GITHUB_OUTPUT"
          fi
      - name: Login to Docker Hub
        # https://github.com/orgs/community/discussions/163013
        if: steps.params.outputs.push == 'true'
        uses: docker/login-action@v4
        with:
          username: '${{ secrets.DOCKERHUB_USERNAME }}'
          password: '${{ secrets.DOCKERHUB_TOKEN }}'
      - name: 'Publish math-${{ matrix.project }}'
        uses: docker/build-push-action@v7
        with:
          # Without context, .dockerignore is not respected?
          # https://stackoverflow.com/a/74552407/514684
          context: .
          file: '${{ matrix.project }}/Dockerfile'
          labels: '${{ steps.meta.outputs.labels }}'
          platforms: '${{ steps.params.outputs.platforms }}'
          push: '${{ steps.params.outputs.push }}'
          tags: '${{ steps.meta.outputs.tags }}'