variables: CI_REGISTRY_IMAGE_GRADLE: "$CI_REGISTRY_IMAGE:latest-backend-gradle" CI_REGISTRY_IMAGE_NG: "$CI_REGISTRY_IMAGE:latest-frontend-ng" CI_REGISTRY_IMAGE_BACKEND: "$CI_REGISTRY_IMAGE:latest-backend" CI_REGISTRY_IMAGE_FRONTEND: "$CI_REGISTRY_IMAGE:latest-frontend" before_script: - docker info - docker login -u $CI_USERNAME -p $CI_ACCESS_TOKEN $CI_REGISTRY stages: - build - test - package - deploy build-backend: 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 build-frontend: stage: build script: - docker pull $CI_REGISTRY_IMAGE_NG || true - docker build --cache-from $CI_REGISTRY_IMAGE_NG -f ng.Dockerfile -t $CI_REGISTRY_IMAGE_NG --build-arg JDK_VERSION=$JDK_VERSION --build-arg GRADLE_VERSION=$GRADLE_VERSION . - docker push $CI_REGISTRY_IMAGE_NG test-backend: stage: test needs: ['build-backend'] variables: TEST_CONTAINER_NAME: "cre_backend_gradle_tests" script: - docker run --name $TEST_CONTAINER_NAME --rm $CI_REGISTRY_IMAGE_GRADLE gradle test package-backend: stage: package needs: ['test-backend'] variables: PACKAGE_CONTAINER_NAME: "cre_backend_package" ARTIFACT_NAME: "ColorRecipesExplorer-$CI_PIPELINE_IID" script: - docker run --name $PACKAGE_CONTAINER_NAME $CI_REGISTRY_IMAGE_GRADLE gradle buildBackend - docker cp $PACKAGE_CONTAINER_NAME:/usr/src/cre/dist/backend/ColorRecipesExplorer.jar $ARTIFACT_NAME.jar - docker rm $PACKAGE_CONTAINER_NAME - docker build -t $CI_REGISTRY_IMAGE_BACKEND -f backend.Dockerfile --build-arg PORT=$BACKEND_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 artifacts: paths: - ColorRecipesExplorer-$CI_PIPELINE_IID.jar expire_in: 1 week package-frontend: stage: package needs: ['build-frontend'] variables: PACKAGE_CONTAINER_NAME: "cre_frontend_package" ARTIFACT_NAME: "ColorRecipesExplorer-$CI_PIPELINE_IID-ng" before_script: - apk update - apk add --no-cache zip - mkdir dist script: - docker run --name $PACKAGE_CONTAINER_NAME $CI_REGISTRY_IMAGE_NG gradle buildFrontend - docker cp $PACKAGE_CONTAINER_NAME:/usr/src/cre/dist/frontend/ dist/ - zip -r $ARTIFACT_NAME.zip dist/ - docker build -t $CI_REGISTRY_IMAGE_FRONTEND -f frontend.Dockerfile --build-arg PORT=$FRONTEND_PORT --build-arg ARTIFACT_NAME=$ARTIFACT_NAME . - docker push $CI_REGISTRY_IMAGE_FRONTEND after_script: - docker stop $PACKAGE_CONTAINER_NAME || true - docker rm $PACKAGE_CONTAINER_NAME || true artifacts: paths: - $ARTIFACT_NAME.zip expire_in: 1 week .before_deploy: &before_deploy 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' - ssh -p $DEPLOYMENT_SERVER_SSH_PORT $DEPLOYMENT_SERVER_USERNAME@$DEPLOYMENT_SERVER "docker stop $DEPLOYED_CONTAINER_NAME || true && docker rm $DEPLOYED_CONTAINER_NAME || true" deploy-backend: stage: deploy image: alpine:latest needs: ['package-backend'] variables: DEPLOYED_CONTAINER_NAME: "cre_backend" <<: *before_deploy script: - ssh -p $DEPLOYMENT_SERVER_SSH_PORT $DEPLOYMENT_SERVER_USERNAME@$DEPLOYMENT_SERVER "docker login -u $CI_USERNAME -p $CI_ACCESS_TOKEN $CI_REGISTRY && docker pull $CI_REGISTRY_IMAGE_BACKEND" - ssh -p $DEPLOYMENT_SERVER_SSH_PORT $DEPLOYMENT_SERVER_USERNAME@$DEPLOYMENT_SERVER "docker run -d -p $BACKEND_PORT:$BACKEND_PORT --name=$DEPLOYED_CONTAINER_NAME -e spring_profiles_active=$BACKEND_PROFILES -e spring_datasource_username=$DB_USERNAME -e spring_datasource_password=$DB_PASSWORD -e spring_datasource_url=$DB_URL $CI_REGISTRY_IMAGE_BACKEND" deploy-frontend: stage: deploy image: alpine:latest needs: ['package-frontend'] variables: DEPLOYED_CONTAINER_NAME: "cre_frontend" <<: *before_deploy script: - ssh -p $DEPLOYMENT_SERVER_SSH_PORT $DEPLOYMENT_SERVER_USERNAME@$DEPLOYMENT_SERVER "docker login -u $CI_USERNAME -p $CI_ACCESS_TOKEN $CI_REGISTRY && docker pull $CI_REGISTRY_IMAGE_FRONTEND" - ssh -p $DEPLOYMENT_SERVER_SSH_PORT $DEPLOYMENT_SERVER_USERNAME@$DEPLOYMENT_SERVER "docker run -d -p $FRONTEND_PORT:$FRONTEND_PORT --name=$DEPLOYED_CONTAINER_NAME $CI_REGISTRY_IMAGE_FRONTEND"