.go-cache:
  variables:
    GOPATH: $CI_PROJECT_DIR/.go
  before_script:
    - mkdir -p .go
  cache:
    paths:
      - .go/pkg/mod/

stages:
  - test
  - build
  - deploy

test:
  image: postgres:alpine
  variables:
    POSTGRES_PASSWORD: password
  stage: test
  extends: .go-cache
  script:
    - su -c initdb postgres
    - su -c "pg_ctl start > /dev/null" postgres
    - apk update
    - apk add build-base go
    - CGO_ENABLED=1 go test -race ./...

lint:
  image: registry.gitlab.com/gitlab-org/gitlab-build-images:golangci-lint-alpine
  stage: test
  extends: .go-cache
  script:
    # Use default .golangci.yml file from the image if one is not present in the project root.
    - "[ -e .golangci.yml ] || cp /golangci/.golangci.yml ."
    # Write the code coverage report to gl-code-quality-report.json
    # and print linting issues to stdout in the format: path/to/file:line description
    # remove `--issues-exit-code 0` or set to non-zero to fail the job if linting issues are detected
    - golangci-lint run --issues-exit-code 0 --print-issued-lines=false --out-format code-climate:gl-code-quality-report.json,line-number
  artifacts:
    when: always
    reports:
      codequality: gl-code-quality-report.json
    paths:
      - gl-code-quality-report.json

coverage:
  stage: test
  image: postgres:alpine
  variables:
    POSTGRES_PASSWORD: password
  coverage: '/\(statements\)(?:\s+)?(\d+(?:\.\d+)?%)/'
  extends: .go-cache
  script:
    - su -c initdb postgres
    - su -c "pg_ctl start > /dev/null" postgres
    - apk update
    - apk add go
    - go run gotest.tools/gotestsum@latest --junitfile report.xml --format testname -- -coverprofile=coverage.txt -covermode count ./...
    - go tool cover -func=coverage.txt
    - go run github.com/boumenot/gocover-cobertura@master < coverage.txt > coverage.xml
  artifacts:
    reports:
      junit: report.xml
      coverage_report:
        coverage_format: cobertura
        path: coverage.xml

jsonnet:
  stage: build
  image: alpine:latest
  script:
    - apk add -U jsonnet
    - jsonnet .gitlab-ci.jsonnet > generated-config.yml
  artifacts:
    paths:
      - generated-config.yml

trigger-builds:
  stage: build
  needs:
    - jsonnet
  trigger:
    include:
      - artifact: generated-config.yml
        job: jsonnet
    strategy: depend

trigger-master-deploy:
  stage: deploy
  needs:
    - trigger-builds
  image:
    name: bitnami/kubectl:latest
    entrypoint: [""]
  only:
    variables:
      - $CI_COMMIT_BRANCH == "master"
  script:
    - kubectl config get-contexts
    - kubectl config use-context gfx/gitlab-agents:gfxlabs-dev
    - kubectl rollout restart deployment gfx-pggat