image: php variables: DOCKER_DRIVER: overlay2 TEST_IMAGE: ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_NAME} RELEASE_IMAGE: ${CI_REGISTRY_IMAGE}:latest MYSQL_DATABASE: engelsystem MYSQL_USER: engel MYSQL_PASSWORD: engelsystem MYSQL_HOST: mariadb MYSQL_RANDOM_ROOT_PASSWORD: "yes" DOCROOT: /var/www/ stages: - build - test - release - deploy .docker_template: &docker_definition image: docker:18 services: - docker:18-dind tags: - dind before_script: - docker login -u gitlab-ci-token -p "${CI_JOB_TOKEN}" "${CI_REGISTRY}" build-image.nginx: <<: *docker_definition stage: build artifacts: name: "${CI_JOB_NAME}_${CI_JOB_ID}_assets" expire_in: 1 day paths: - ./public/assets - ./yarn.lock script: - docker build --pull -t "${TEST_IMAGE}-nginx" -f contrib/nginx/Dockerfile . - docker push "${TEST_IMAGE}-nginx" - instance=$(docker create "${TEST_IMAGE}-nginx") - docker cp "${instance}:/var/www/public/assets" public/ - docker cp "${instance}:/var/www/yarn.lock" . - docker rm "${instance}" build-image: <<: *docker_definition stage: build script: - apk -q add git - VERSION="$(git describe --abbrev=0 --tags)-${CI_COMMIT_REF_NAME}+${CI_PIPELINE_ID}.${CI_COMMIT_SHORT_SHA}" - docker build --pull --build-arg VERSION="${VERSION}" -t "${TEST_IMAGE}" -f contrib/Dockerfile . - docker push "${TEST_IMAGE}" test: image: ${TEST_IMAGE} stage: test services: - mariadb:10.2 artifacts: name: "${CI_JOB_NAME}_${CI_JOB_ID}" expire_in: 1 week when: always paths: - ./coverage/ - ./unittests.xml reports: junit: ./unittests.xml coverage: '/^\s*Lines:\s*(\d+(?:\.\d+)?%)/' before_script: - apk add ${PHPIZE_DEPS} && pecl install xdebug && docker-php-ext-enable xdebug - curl -sS https://getcomposer.org/installer | php -- --no-ansi --install-dir /usr/local/bin/ --filename composer - cp -R tests/ phpunit.xml "${DOCROOT}" - HOMEDIR=$(pwd) - cd "${DOCROOT}" - composer --no-ansi install - ./bin/migrate script: - vendor/bin/phpunit -v --colors=never --coverage-text --coverage-html "${HOMEDIR}/coverage/" --log-junit "${HOMEDIR}/unittests.xml" - bin/migrate down release-image: <<: *docker_definition stage: release script: - docker pull "${TEST_IMAGE}" - docker tag "${TEST_IMAGE}" "${RELEASE_IMAGE}" - docker push "${RELEASE_IMAGE}" only: - master release-image.nginx: <<: *docker_definition stage: release script: - docker pull "${TEST_IMAGE}-nginx" - docker tag "${TEST_IMAGE}-nginx" "${RELEASE_IMAGE}-nginx" - docker push "${RELEASE_IMAGE}-nginx" only: - master .deploy_template: &deploy_definition stage: deploy image: ${TEST_IMAGE} before_script: - apk add bash rsync openssh-client .deploy_template_script: # Configure SSH - &deploy_template_script |- mkdir -p ~/.ssh echo "${SSH_PRIVATE_KEY}" | sed -e 's/\r//g' > ~/.ssh/id_ed25519 chmod 600 ~/.ssh/id_ed25519 cd "${DOCROOT}" build-release-file: <<: *deploy_definition stage: deploy artifacts: name: "release_${CI_COMMIT_REF_SLUG}_${CI_JOB_ID}_${CI_COMMIT_SHA}" expire_in: 1 week paths: - ./release/ script: - rsync -vAax "${DOCROOT}" "${DOCROOT}/.babelrc" "${DOCROOT}/.browserslistrc" release/ - rsync -vAax public/assets release/public/ - rsync -vAax yarn.lock release/ deploy-staging: <<: *deploy_definition environment: name: staging only: - master script: # Check if deployment variables where set - |- if [ -z "${SSH_PRIVATE_KEY}" ] || [ -z "${STAGING_REMOTE}" ] || [ -z "${STAGING_REMOTE_PATH}" ]; then echo "Skipping deployment"; exit fi - *deploy_template_script # Deploy to server - ./bin/deploy.sh -r "${STAGING_REMOTE}" -p "${STAGING_REMOTE_PATH}" -i "${CI_JOB_ID}-${CI_COMMIT_SHA}" deploy-production: <<: *deploy_definition environment: name: production when: manual only: - master script: # Check if deployment variables where set - |- if [ -z "${SSH_PRIVATE_KEY}" ] || [ -z "${PRODUCTION_REMOTE}" ] || [ -z "${PRODUCTION_REMOTE_PATH}" ]; then echo "Skipping deployment"; exit fi - *deploy_template_script # Deploy to server - ./bin/deploy.sh -r "${PRODUCTION_REMOTE}" -p "${PRODUCTION_REMOTE_PATH}" -i "${CI_JOB_ID}-${CI_COMMIT_SHA}"