Skip to content
Snippets Groups Projects
.gitlab-ci.yml 7.4 KiB
Newer Older
image: golang:1.22
Kay Effenberger's avatar
Kay Effenberger committed
stages:
  - prepare
  - test
  - build
  - deploy
  - test-build
  - release

Christian Pointner's avatar
Christian Pointner committed
variables:
  GOPATH: "$CI_PROJECT_DIR/.gopath"
  GOFLAGS: -mod=readonly
  OPENAPI_JSON: ./public/api.json
.release-rules: &release-rules
  # rule to run job on a tag-reference which has the form number.number.number (semantic versioning)
  # or number.number.number-text (semantic versioning + release-name)
  # and where a Dockerfile exists
  - if: $CI_COMMIT_TAG =~ /^\d+[.]\d+[.]\d+$/ || $CI_COMMIT_TAG =~ /^\d+[.]\d+[.]\d+[-]\S+$/
    exists:
      - Dockerfile

Kay Effenberger's avatar
Kay Effenberger committed
.feature-rules: &feature-rules
  - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feat/ || $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^fix/
    exists:
      - Dockerfile
Christian Pointner's avatar
Christian Pointner committed
    - .gopath/
    - ui/assets_vfsdata.go
Christian Pointner's avatar
Christian Pointner committed
  key: default
  policy: pull
Christian Pointner's avatar
Christian Pointner committed
prepare:
  stage: prepare
  cache:
    policy: pull-push
Christian Pointner's avatar
Christian Pointner committed
    - mkdir -p .gopath
    - export GOPATH="$CI_PROJECT_DIR/.gopath"
    - go generate ./ui
Kay Effenberger's avatar
Kay Effenberger committed
  rules: *feature-rules
    - postgres:16
  variables:
    POSTGRES_DB: "tank"
    POSTGRES_USER: "tank"
    POSTGRES_PASSWORD: "aura"
    AURA_TANK_TEST_DB_TYPE: "postgres"
    AURA_TANK_TEST_DB_HOST: "postgres"
  script:
    - go run contrib/waitfor-tcp.go postgres:5432 30
Ernesto Rico Schmidt's avatar
Ernesto Rico Schmidt committed
    - go test -v $(go list ./... | grep -v api/docs) -coverprofile=coverage.out -covermode count
    - go get github.com/boumenot/gocover-cobertura
    - go run github.com/boumenot/gocover-cobertura < coverage.out > coverage.xml
  coverage: '/^coverage: (\d+.\d+)% of statements$/'
  artifacts:
    reports:
      coverage_report:
        coverage_format: cobertura
        path: coverage.xml
Kay Effenberger's avatar
Kay Effenberger committed
  rules: *feature-rules
Christian Pointner's avatar
Christian Pointner committed
build:
    # ensure dependencies are installed before running make
    - apt-get update && apt-get install -y make
    - make build
Kay Effenberger's avatar
Kay Effenberger committed
  rules: *feature-rules
build-openapi-2-scheme:
  stage: build
  script:
    - make api-docs
Kay Effenberger's avatar
Kay Effenberger committed
  rules: *feature-rules
  artifacts:
    paths:
      - api/docs/swagger.yaml

build-openapi-3-scheme:
  stage: build
  image:
    name: openapitools/openapi-generator-cli:latest-release
  needs:
    - job: build-openapi-2-scheme
      artifacts: true
  script:
    - /usr/local/bin/docker-entrypoint.sh generate -i api/docs/swagger.yaml -o api/docs -g openapi --minimal-update
    - mkdir public
    - cp api/docs/openapi.json $OPENAPI_JSON
Kay Effenberger's avatar
Kay Effenberger committed
  rules: *feature-rules
  artifacts:
    paths:
      - $OPENAPI_JSON

deploy_spec:
  stage: deploy
  image: node:20-alpine
  before_script:
    - apk update
    - apk add nodejs npm lftp
    - npm i -g npm@latest
    - npm install swagger-ui-dist@3.52.5
  script:
    - cp -rp node_modules/swagger-ui-dist/* ./public
    - 'sed -i "s@.*url.*@url: \"api.json\",@" ./public/index.html'
    - echo "Deploying AURA Tank API Spec..."
Ernesto Rico Schmidt's avatar
Ernesto Rico Schmidt committed
    - lftp -c "set ftp:ssl-allow no; open -u $FTP_AURA_RADIO_USER,$FTP_AURA_RADIO_PWD $FTP_AURA_RADIO_HOST; mirror -Rnev ./public/ ./api.aura.radio/tank --ignore-time --parallel=10 --exclude-glob .git* --exclude .git/"
    - echo "AURA Tank API Spec successfully deployed."
  artifacts:
    paths:
      - public
    expire_in: 2 days
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      when: always
  # Use the official docker image.
  image: docker:latest
  variables:
    # the name of the image without version
    AURA_IMAGE_NAME: "autoradio/tank"
  services:
    - docker:dind
Christian Pointner's avatar
Christian Pointner committed
  cache:
    paths:
      - .docker/cache
    key: default
    policy: pull-push
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
    - |
      if [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]
        then docker build -t $AURA_IMAGE_NAME -t $CI_REGISTRY_IMAGE:main .
        docker push $CI_REGISTRY_IMAGE:main 
Kay Effenberger's avatar
Kay Effenberger committed
      else
        docker build -t $AURA_IMAGE_NAME -t $CI_REGISTRY_IMAGE:$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME .
Kay Effenberger's avatar
Kay Effenberger committed
        docker push $CI_REGISTRY_IMAGE:$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
Kay Effenberger's avatar
Kay Effenberger committed
      fi
Kay Effenberger's avatar
Kay Effenberger committed
  rules: *feature-rules
test-scheme:
  stage: test-build
  needs:
    - job: build-openapi-3-scheme
      artifacts: true
  image:
    name: schemathesis/schemathesis:stable
    entrypoint: [""]
  variables:
    POSTGRES_DB: tank
    POSTGRES_USER: tank
    POSTGRES_PASSWORD: aura
    TANK_DB_HOST: postgres
    TANK_PORT: "8040"
    # Enable per-build-network so that service aliases are also
    # usable in the service containers themselves.
    FF_NETWORK_PER_BUILD: "true"
    # https://stackoverflow.com/questions/71228282/could-not-resolve-host-when-trying-to-access-service-in-gitlab
    DOCKER_HOST: "tcp://docker:2375"
    DOCKER_TLS_CERTDIR: ""
    - name: postgres:16
    - name: $CI_REGISTRY_IMAGE:$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
      entrypoint: ["/bin/bash"]
      command:
        - '-c'
        - |
          # make sure postgres is up before starting tank
          while true; do
            timeout 0.25 cat >/dev/null 2>&1 </dev/tcp/postgres/5432
            if [ "$?" = 124 ]; then break; fi
          done
          # disable authentication
          sed '/auth:/q' /etc/aura/tank.yaml | head -n-1 >/tmp/tank.yaml
          /usr/local/bin/tank --config /tmp/tank.yaml run --listen :"$TANK_PORT"
      alias: tank
  parallel:
    matrix:
      # see https://schemathesis.readthedocs.io/en/stable/cli.html#cmdoption-schemathesis-run-c
      - CHECKS: status_code_conformance
      - CHECKS: response_headers_conformance
      - CHECKS: response_schema_conformance
  script:
    - schemathesis run -c "$CHECKS" -b http://tank:"$TANK_PORT" --hypothesis-suppress-health-check too_slow $OPENAPI_JSON
  rules: *feature-rules
Ernesto Rico Schmidt's avatar
Ernesto Rico Schmidt committed
  allow_failure: true
docker-hub-push:
  # Use the official docker image.
  image: docker:latest
  stage: release
  variables:
    # the name of the image without version
    AURA_IMAGE_NAME: "autoradio/tank"
  services:
    - docker:dind
  before_script:
    # default repo is docker.io (aka docker hub)
    - docker login -u "$DOCKER_ID" -p "$DOCKER_HUB_AUTH"
    # every commit on main branch should build image as unstable
    # else it is from a tag (enforced by gitlab-ci rules)
    # hint: tags are references independent of branches
    - |
      if [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]
        then docker build -t $AURA_IMAGE_NAME:main -t $AURA_IMAGE_NAME:main-$CI_COMMIT_SHORT_SHA .
        else docker build -t $AURA_IMAGE_NAME -t $AURA_IMAGE_NAME:$CI_COMMIT_TAG .
    # TODO: maybe isolate docker build and docker push
    - docker push "$AURA_IMAGE_NAME" --all-tags
robwa's avatar
robwa committed
  rules:
    # every commit on master/main branch should trigger a push to docker-hub as unstable without a release
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
trigger_aura_tests:
  stage: release
  needs: [docker-hub-push]
  trigger:
    project: aura/aura-tests
    branch: main
    strategy: depend
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

robwa's avatar
robwa committed
  needs:
  image: registry.gitlab.com/gitlab-org/release-cli:latest
  rules: *release-rules
  script:
    - echo "this will be a release when there is a tag, but tags should be protected to be only createable by maintainers."
  release:
    name: 'Release $CI_COMMIT_TAG'
    description: ./CHANGELOG.md
    tag_name: '$CI_COMMIT_TAG'
    ref: '$CI_COMMIT_TAG'