name: CI/CD on: push: branches: [main, develop] tags: ['v*'] pull_request: branches: [main, develop] env: REGISTRY: nexus-registry.urpi.be IMAGE_NAME: docker-hosted/go-loose GO_VERSION: '1.27.1' jobs: build-and-test: name: Build and Test runs-on: ubuntu-latest permissions: contents: read steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} cache: true - name: Download dependencies run: go mod download - name: Build run: go build ./... - name: Run unit tests run: go test -race ./... -count=1 - name: Run vet run: go vet ./... - name: Check formatting run: | if [ "$(gofmt -l . | grep -v vendor | grep -v dist | wc -l)" -gt 0 ]; then echo "Code is not formatted:" gofmt -l . | grep -v vendor | grep -v dist exit 1 fi integration-test: name: Integration Tests runs-on: ubuntu-latest needs: build-and-test services: postgres: image: postgres:17-alpine env: POSTGRES_DB: goloose POSTGRES_USER: goloose POSTGRES_PASSWORD: goloose ports: ['5432:5432'] options: >- --health-cmd="pg_isready -U goloose -d goloose" --health-interval=5s --health-timeout=3s --health-retries=10 steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} cache: true - name: Download dependencies run: go mod download - name: Create test databases run: | sleep 5 createdb -h localhost -U goloose goloose_test || true createdb -h localhost -U goloose goloose_server_test || true createdb -h localhost -U goloose goloose_behaviour_test || true - name: Run integration tests env: GO_LOOSE_TEST_DATABASE_URL: postgres://goloose:goloose@localhost:5432/goloose_test?sslmode=disable GO_LOOSE_TEST_SERVER_DATABASE_URL: postgres://goloose:goloose@localhost:5432/goloose_server_test?sslmode=disable GO_LOOSE_BEHAVIOUR_DATABASE_URL: postgres://goloose:goloose@localhost:5432/goloose_behaviour_test?sslmode=disable run: | go test -race ./internal/store/ ./internal/server/ -count=1 GO_LOOSE_BEHAVIOUR=1 go test ./internal/behaviour/ -count=1 -v docker: name: Build and Push Docker Image runs-on: ubuntu-latest needs: [build-and-test, integration-test] if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' permissions: contents: read packages: write steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to Nexus Registry uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ secrets.NEXUS_USERNAME }} password: ${{ secrets.NEXUS_PASSWORD }} - name: Extract metadata for Docker id: meta uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | type=ref,event=branch type=ref,event=pr type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=sha - name: Build and push Docker image uses: docker/build-push-action@v5 with: context: . push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max # deploy-tst: # name: Deploy to TST # runs-on: ubuntu-latest # needs: docker # if: github.event_name == 'push' && github.ref == 'refs/heads/develop' # permissions: # contents: read # id-token: write # environment: tst # # steps: # - name: Checkout repository # uses: actions/checkout@v4 # # - name: Set up Helm # uses: azure/setup-helm@v4 # with: # version: 'v3.14.0' # # - name: Set up kubectl # uses: azure/k8s-set-context@v4 # with: # kubeconfig: ${{ secrets.KUBECONFIG_TST }} # # - name: Deploy to TST with Helm # run: | # helm upgrade --install go-loose ./deploy/helm/go-loose \ # --namespace go-loose \ # --create-namespace \ # --set image.repository=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} \ # --set image.tag=${{ github.sha }} \ # --set image.pullSecrets[0].name=nexus-registry \ # --wait --timeout 5m deploy-prd: name: Deploy to PRD runs-on: ubuntu-latest needs: docker if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') permissions: contents: read id-token: write environment: prd steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up Helm uses: azure/setup-helm@v4 with: version: 'v3.14.0' - name: Set up kubectl uses: azure/k8s-set-context@v4 with: kubeconfig: ${{ secrets.KUBECONFIG_PRD }} - name: Deploy to PRD with Helm run: | helm upgrade --install go-loose ./deploy/helm/go-loose \ --namespace go-loose \ --create-namespace \ --values ./deploy/helm/go-loose/values-prd.yaml \ --set image.repository=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} \ --set image.tag=${{ github.ref_name }} \ --wait --timeout 5m