name: Go on: push: branches: - main - 'release/**' paths: - '**.go' - 'go.mod' - '.golangci.yml' - '.github/workflows/go.yml' pull_request: paths: - '**.go' - 'go.mod' - '.golangci.yml' - '.github/workflows/go.yml' env: GOPROXY: "https://proxy.golang.org" permissions: contents: read jobs: lint: permissions: contents: read # for actions/checkout to fetch code pull-requests: read # for golangci/golangci-lint-action to fetch pull requests name: Lint runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 - name: Install Go uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version: 1.25.x - name: Install Task uses: arduino/setup-task@b91d5d2c96a56797b48ac1e0e89220bf64044611 # v2.0.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Check Go module tidiness and generated files shell: bash run: | go mod tidy task generate STATUS=$(git status --porcelain) if [ ! -z "$STATUS" ]; then echo "Unstaged files:" echo $STATUS echo "Run 'go mod tidy' or 'task generate' commit them" exit 1 fi - name: Run golangci-lint uses: golangci/golangci-lint-action@9fae48acfc02a90574d7c304a1758ef9895495fa # v7.0.1 with: version: latest args: --timeout=30m test: name: Test strategy: matrix: go-version: [ 1.25.x ] platform: [ ubuntu-latest, macos-latest ] runs-on: ${{ matrix.platform }} steps: - name: Checkout code uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 - name: Install Go uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version: ${{ matrix.go-version }} - name: Run tests with coverage run: | go test -shuffle=on -v -race -coverprofile=coverage -covermode=atomic -json ./... > test-report.json go install github.com/mfridman/tparse@latest tparse -all -file=test-report.json - name: Send email on failure uses: unknwon/send-email-on-failure@89339a1bc93f4ad1d30f3b7e4911fcba985c9adb # v1 if: ${{ failure() && github.event_name == 'push' && github.ref == 'refs/heads/main' }} with: smtp_username: ${{ secrets.SMTP_USERNAME }} smtp_password: ${{ secrets.SMTP_PASSWORD }} # Running tests with race detection consumes too much memory on Windows, # see https://github.com/golang/go/issues/46099 for details. test-windows: name: Test Windows strategy: matrix: go-version: [ 1.25.x ] platform: [ windows-latest ] runs-on: ${{ matrix.platform }} steps: - name: Checkout code uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 - name: Install Go uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version: ${{ matrix.go-version }} - name: Run tests with coverage run: go test -shuffle=on -v -coverprofile=coverage -covermode=atomic ./... - name: Send email on failure uses: unknwon/send-email-on-failure@89339a1bc93f4ad1d30f3b7e4911fcba985c9adb # v1 if: ${{ failure() && github.event_name == 'push' && github.ref == 'refs/heads/main' }} with: smtp_username: ${{ secrets.SMTP_USERNAME }} smtp_password: ${{ secrets.SMTP_PASSWORD }} postgres: name: Postgres strategy: matrix: go-version: [ 1.25.x ] platform: [ ubuntu-latest ] runs-on: ${{ matrix.platform }} services: postgres: image: postgres:9.6 env: POSTGRES_PASSWORD: postgres options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 5432:5432 steps: - name: Checkout code uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 - name: Install Go uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version: ${{ matrix.go-version }} - name: Run tests with coverage run: | go test -shuffle=on -v -race -coverprofile=coverage -covermode=atomic -json ./internal/database/... > test-report.json go install github.com/mfridman/tparse@latest tparse -all -file=test-report.json env: GOGS_DATABASE_TYPE: postgres PGPORT: 5432 PGHOST: localhost PGUSER: postgres PGPASSWORD: postgres PGSSLMODE: disable mysql: name: MySQL strategy: matrix: go-version: [ 1.25.x ] platform: [ ubuntu-22.04 ] # Use the lowest version possible for backwards compatibility runs-on: ${{ matrix.platform }} steps: - name: Start MySQL server run: sudo systemctl start mysql - name: Checkout code uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 - name: Install Go uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version: ${{ matrix.go-version }} - name: Run tests with coverage run: | go test -shuffle=on -v -race -coverprofile=coverage -covermode=atomic -json ./internal/database/... > test-report.json go install github.com/mfridman/tparse@latest tparse -all -file=test-report.json env: GOGS_DATABASE_TYPE: mysql MYSQL_USER: root MYSQL_PASSWORD: root MYSQL_HOST: localhost MYSQL_PORT: 3306