variables:
  CI_REGISTRY_IMAGE_GRADLE: "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME-gradle"
  CI_REGISTRY_IMAGE_BACKEND: "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME"

before_script:
  - docker info
  - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY

stages:
  - build
  - test
  - package
  - deploy

.only-master:
  only:
    - master

build:
  stage: build
  script:
    - docker pull $CI_REGISTRY_IMAGE_GRADLE || true
    - docker build --cache-from $CI_REGISTRY_IMAGE_GRADLE -f gradle.Dockerfile -t $CI_REGISTRY_IMAGE_GRADLE --build-arg JDK_VERSION=$JDK_VERSION --build-arg GRADLE_VERSION=$GRADLE_VERSION .
    - docker push $CI_REGISTRY_IMAGE_GRADLE

test:
  stage: test
  needs: [ 'build' ]
  variables:
    TEST_CONTAINER_NAME: "cre_backend_gradle_tests-$CI_COMMIT_REF_NAME"
  script:
    - docker rm $TEST_CONTAINER_NAME || true
    - docker run --name $TEST_CONTAINER_NAME $CI_REGISTRY_IMAGE_GRADLE gradle test
  after_script:
    - mkdir test-results && docker cp $TEST_CONTAINER_NAME:/usr/src/cre/build/test-results/test/ test-results
    - docker rm $TEST_CONTAINER_NAME || true
  artifacts:
    when: always
    reports:
      junit: test-results/test/TEST-*.xml

package:
  stage: package
  needs: [ 'test' ]
  extends: .only-master
  variables:
    PACKAGE_CONTAINER_NAME: "cre_backend_package-$CI_COMMIT_REF_NAME"
    ARTIFACT_NAME: "ColorRecipesExplorer-backend-$CI_PIPELINE_IID"
  script:
    - docker rm $PACKAGE_CONTAINER_NAME || true
    - docker run --name $PACKAGE_CONTAINER_NAME $CI_REGISTRY_IMAGE_GRADLE gradle bootJar
    - docker cp $PACKAGE_CONTAINER_NAME:/usr/src/cre/build/libs/ColorRecipesExplorer.jar $ARTIFACT_NAME.jar
    - docker build -t $CI_REGISTRY_IMAGE_BACKEND --build-arg JDK_VERSION=$JDK_VERSION --build-arg PORT=$PORT --build-arg ARTIFACT_NAME=$ARTIFACT_NAME .
    - docker push $CI_REGISTRY_IMAGE_BACKEND
  after_script:
    - docker stop $PACKAGE_CONTAINER_NAME || true
    - docker rm $PACKAGE_CONTAINER_NAME || true
    - docker image remove $CI_REGISTRY_IMAGE_GRADLE || true # Remove the gradle image from the runner so it doesn't pollute the runner's image registry
  artifacts:
    paths:
      - $ARTIFACT_NAME.jar
    expire_in: 1 week

deploy:
  stage: deploy
  image: alpine:latest
  needs: [ 'package' ]
  extends: .only-master
  variables:
    DEPLOYED_CONTAINER_NAME: "cre_backend-$CI_COMMIT_REF_NAME"
  before_script:
    - apk update
    - apk add --no-cache openssh-client
    - mkdir -p ~/.ssh
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
    - chmod 700 ~/.ssh/id_rsa
    - eval $(ssh-agent -s)
    - ssh-add ~/.ssh/id_rsa
    - ssh-keyscan -p $DEPLOYMENT_SERVER_SSH_PORT -H $DEPLOYMENT_SERVER >> ~/.ssh/known_hosts
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
  script:
    - ssh -p $DEPLOYMENT_SERVER_SSH_PORT $DEPLOYMENT_SERVER_USERNAME@$DEPLOYMENT_SERVER "docker stop $DEPLOYED_CONTAINER_NAME || true && docker rm $DEPLOYED_CONTAINER_NAME || true"
    - ssh -p $DEPLOYMENT_SERVER_SSH_PORT $DEPLOYMENT_SERVER_USERNAME@$DEPLOYMENT_SERVER "docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY && docker pull $CI_REGISTRY_IMAGE_BACKEND"
    - ssh -p $DEPLOYMENT_SERVER_SSH_PORT $DEPLOYMENT_SERVER_USERNAME@$DEPLOYMENT_SERVER "docker run -d -p $PORT:$PORT --name=$DEPLOYED_CONTAINER_NAME -v $DATA_VOLUME:/usr/bin/cre/data -e spring_profiles_active=$SPRING_PROFILES -e spring_datasource_username=$DB_USERNAME -e spring_datasource_password=$DB_PASSWORD -e spring_datasource_url=$DB_URL -e databaseupdater_username=$DB_UPDATE_USERNAME -e databaseupdater_password=$DB_UPDATE_PASSWORD $CI_REGISTRY_IMAGE_BACKEND"