image: node:18.0.0-buster

stages:
  - test
  - bundle
  - deploy
  - release

variables:
  API_ROOT_FILE: ./src/aura_engine_api/rest/swagger/swagger.yaml
  BUNDLED_JSON_FILE: ./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

cache:
  paths:
    - ./node_modules

check_style:
  stage: test
  before_script:
    - apt-get --quiet update
    - apt-get --quiet --yes install codespell make
    - pip install flake8
  script:
    - make lint
    - make spelling

# test_api:
#   stage: test
#   script:
#     - pip3 install tox
#     - tox

bundle_and_test:
  stage: bundle
  before_script:
    - apt-get --quiet update
    - apt-get --quiet --yes install nodejs
    - npm install -g @apidevtools/swagger-cli
  script:
    - mkdir public
    - swagger-cli bundle -t json $API_ROOT_FILE > $BUNDLED_JSON_FILE
    - swagger-cli validate $BUNDLED_JSON_FILE
  artifacts:
    paths:
      - public
    expire_in: 2 days
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      when: always

deploy_spec:
  stage: deploy
  before_script:
    - apt-get --quiet update
    - apt-get --quiet --yes install nodejs
    - npm install swagger-ui-dist@3.22.1
  script:
    - cp -rp node_modules/swagger-ui-dist/* ./public
    - 'sed -i "s@.*url.*@url: \"api.json\",@" ./public/index.html'
    - echo "Deploying AURA Engine API Spec..."
    - 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/engine --ignore-time --parallel=10 --exclude-glob .git* --exclude .git/"
    - echo "AURA Engine API Spec successfully deployed."
  artifacts:
    paths:
      - public
    expire_in: 2 days
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      when: always

docker-push:
  # Use the official docker image.
  image: docker:latest
  stage: release
  variables:
    # the name of the image without version
    AURA_IMAGE_NAME: "autoradio/engine-api"
  services:
    - docker:dind
  before_script:
    # default repo is docker.io (aka docker hub)
    - docker login -u "$DOCKER_ID" -p "$DOCKER_HUB_AUTH"
  script:
    # 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:unstable .
        else docker build -t $AURA_IMAGE_NAME -t $AURA_IMAGE_NAME:$CI_COMMIT_TAG .
      fi
    - docker push "$AURA_IMAGE_NAME" --all-tags
  rules:
    - *release-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
      exists:
        - Dockerfile

release_job:
  stage: release
  needs:
    - docker-push
  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
    tag_name: '$CI_COMMIT_TAG'
    ref: '$CI_COMMIT_TAG'

