# NOTE: This workflow name is referenced by other workflows: # - server-ci-artifacts.yml # - server-ci-report.yml # - sentry.yaml # If you rename this workflow, be sure to update those workflows as well. name: Server CI on: push: branches: - master - release-* pull_request: paths: - "server/**" - "e2e-tests/**" - ".github/workflows/server-ci.yml" - ".github/workflows/server-test-template.yml" - ".github/workflows/mmctl-test-template.yml" - "!server/build/Dockerfile.buildenv" - "!server/build/Dockerfile.buildenv-fips" concurrency: group: ${{ github.event_name == 'pull_request' && format('{0}-{1}', github.workflow, github.ref) || github.run_id }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: go: name: Compute Go Version runs-on: ubuntu-22.04 outputs: version: ${{ steps.calculate.outputs.GO_VERSION }} steps: - name: Checkout mattermost project uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Calculate version id: calculate working-directory: server/ run: echo GO_VERSION=$(cat .go-version) >> "${GITHUB_OUTPUT}" check-mocks: name: Check mocks needs: go runs-on: ubuntu-22.04 container: mattermost/mattermost-build-server:${{ needs.go.outputs.version }} defaults: run: working-directory: server steps: - name: Checkout mattermost project uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Run setup-go-work run: make setup-go-work - name: Generate mocks run: make mocks - name: Check mocks run: if [[ -n $(git status --porcelain) ]]; then echo "Please update the mocks using `make mocks`"; exit 1; fi check-go-mod-tidy: name: Check go mod tidy needs: go runs-on: ubuntu-22.04 container: mattermost/mattermost-build-server:${{ needs.go.outputs.version }} defaults: run: working-directory: server steps: - name: Checkout mattermost project uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Run setup-go-work run: make setup-go-work - name: Run go mod tidy run: make modules-tidy - name: Check modules run: if [[ -n $(git status --porcelain) ]]; then echo "Please tidy up the Go modules using make modules-tidy"; git diff; exit 1; fi check-style: name: check-style needs: go runs-on: ubuntu-22.04 container: mattermost/mattermost-build-server:${{ needs.go.outputs.version }} defaults: run: working-directory: server env: GOFLAGS: -buildvcs=false # TODO: work around "error obtaining VCS status: exit status 128" in a container steps: - name: Checkout mattermost project uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Run setup-go-work run: make setup-go-work - name: Run golangci run: make check-style check-gen-serialized: name: Check serialization methods for hot structs needs: go runs-on: ubuntu-22.04 container: mattermost/mattermost-build-server:${{ needs.go.outputs.version }} defaults: run: working-directory: server steps: - name: Checkout mattermost project uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Run setup-go-work run: make setup-go-work - name: Run make-gen-serialized run: make gen-serialized - name: Check serialized run: if [[ -n $(git status --porcelain) ]]; then echo "Please update the serialized files using 'make gen-serialized'"; exit 1; fi check-mattermost-vet-api: name: Vet API needs: go runs-on: ubuntu-22.04 container: mattermost/mattermost-build-server:${{ needs.go.outputs.version }} defaults: run: working-directory: server steps: - name: Checkout mattermost project uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Run setup-go-work run: make setup-go-work - name: Run mattermost-vet-api run: make vet-api check-migrations: name: Check migration files needs: go runs-on: ubuntu-22.04 container: mattermost/mattermost-build-server:${{ needs.go.outputs.version }} defaults: run: working-directory: server steps: - name: Checkout mattermost project uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Extract migrations files run: make migrations-extract - name: Check migration files run: if [[ -n $(git status --porcelain) ]]; then echo "Please update the migrations using make migrations-extract"; exit 1; fi check-email-templates: name: Generate email templates needs: go runs-on: ubuntu-22.04 container: mattermost/mattermost-build-server:${{ needs.go.outputs.version }} defaults: run: working-directory: server steps: - name: Checkout mattermost project uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Generate email templates run: | npm install -g mjml@4.9.0 make build-templates - name: Check generated email templates run: if [[ -n $(git status --porcelain) ]]; then echo "Please update the email templates using `make build-templates`"; exit 1; fi check-store-layers: name: Check store layers needs: go runs-on: ubuntu-22.04 container: mattermost/mattermost-build-server:${{ needs.go.outputs.version }} defaults: run: working-directory: server steps: - name: Checkout mattermost project uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Run setup-go-work run: make setup-go-work - name: Generate store layers run: make store-layers - name: Check generated code run: if [[ -n $(git status --porcelain) ]]; then echo "Please update the store layers using make store-layers"; exit 1; fi check-mmctl-docs: name: Check mmctl docs needs: go runs-on: ubuntu-22.04 container: mattermost/mattermost-build-server:${{ needs.go.outputs.version }} defaults: run: working-directory: server steps: - name: Checkout mattermost-server uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Run setup-go-work run: make setup-go-work - name: Check docs run: | echo "Making sure docs are updated" make mmctl-docs if [[ -n $(git status --porcelain) ]]; then echo "Please update the mmctl docs using make mmctl-docs"; exit 1; fi test-postgres-binary: if: github.event_name == 'push' # Only run postgres binary tests on master/release pushes: odds are low this regresses, so save the cycles for pull requests. name: Postgres with binary parameters needs: go uses: ./.github/workflows/server-test-template.yml secrets: inherit with: name: Postgres with binary parameters datasource: postgres://mmuser:mostest@postgres:5432/mattermost_test?sslmode=disable&connect_timeout=10&binary_parameters=yes drivername: postgres logsartifact: postgres-binary-server-test-logs go-version: ${{ needs.go.outputs.version }} fips-enabled: false test-postgres-normal: name: Postgres needs: go uses: ./.github/workflows/server-test-template.yml secrets: inherit with: name: Postgres datasource: postgres://mmuser:mostest@postgres:5432/mattermost_test?sslmode=disable&connect_timeout=10 drivername: postgres logsartifact: postgres-server-test-logs go-version: ${{ needs.go.outputs.version }} fips-enabled: false test-postgres-normal-fips: # Skip FIPS testing for forks, which won't have docker login credentials. if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository name: Postgres (FIPS) needs: go uses: ./.github/workflows/server-test-template.yml secrets: inherit with: name: Postgres datasource: postgres://mmuser:mostest@postgres:5432/mattermost_test?sslmode=disable&connect_timeout=10 drivername: postgres logsartifact: postgres-server-test-logs go-version: ${{ needs.go.outputs.version }} fips-enabled: true test-coverage: name: Generate Test Coverage # Disabled: Running out of memory and causing spurious failures. # Old condition: ${{ github.event_name != 'pull_request' || !startsWith(github.event.pull_request.base.ref, 'release-') }} if: false needs: go uses: ./.github/workflows/server-test-template.yml secrets: inherit with: name: Generate Test Coverage datasource: postgres://mmuser:mostest@postgres:5432/mattermost_test?sslmode=disable&connect_timeout=10 drivername: postgres logsartifact: coverage-server-test-logs fullyparallel: true enablecoverage: true go-version: ${{ needs.go.outputs.version }} test-mmctl: name: Run mmctl tests needs: go uses: ./.github/workflows/mmctl-test-template.yml secrets: inherit with: name: mmctl datasource: postgres://mmuser:mostest@postgres:5432/mattermost_test?sslmode=disable&connect_timeout=10 drivername: postgres logsartifact: mmctl-test-logs go-version: ${{ needs.go.outputs.version }} fips-enabled: false test-mmctl-fips: name: Run mmctl tests (FIPS) # Skip FIPS testing for forks, which won't have docker login credentials. if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository needs: go uses: ./.github/workflows/mmctl-test-template.yml secrets: inherit with: name: mmctl datasource: postgres://mmuser:mostest@postgres:5432/mattermost_test?sslmode=disable&connect_timeout=10 drivername: postgres logsartifact: mmctl-test-logs go-version: ${{ needs.go.outputs.version }} fips-enabled: true build-mattermost-server: name: Build mattermost server app needs: go runs-on: ubuntu-22.04 container: mattermost/mattermost-build-server:${{ needs.go.outputs.version }} defaults: run: working-directory: server env: GOFLAGS: -buildvcs=false # TODO: work around "error obtaining VCS status: exit status 128" in a container BUILD_NUMBER: "${GITHUB_HEAD_REF}-${GITHUB_RUN_ID}" FIPS_ENABLED: false steps: - name: Checkout mattermost project uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Run setup-go-work run: make setup-go-work - name: Build run: | make config-reset make build-cmd make package - name: Persist dist artifacts uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: server-dist-artifact path: server/dist/ if-no-files-found: error compression-level: 0 retention-days: 2 - name: Persist build artifacts uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: server-build-artifact path: server/build/ retention-days: 2