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 -Pversion=$CI_PIPELINE_IID - docker cp $PACKAGE_CONTAINER_NAME:/usr/src/cre/build/libs/ColorRecipesExplorer-$CI_PIPELINE_IID.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 -v $CONFIG_VOLUME:/usr/bin/cre/config -e spring_profiles_active=$SPRING_PROFILES $CI_REGISTRY_IMAGE_BACKEND"