legendary-doc-site/.gitlab-ci.yml

110 lines
3 KiB
YAML

stages:
- test
- deploy_tags
- deploy
variables:
POSTGRES_PASSWORD: "postgres"
POSTGRES_USER: "postgres"
DATABASE_URL: "postgres"
MIX_ENV: "test"
DOCKER_TLS_CERTDIR: "/certs"
DOCKER_HOST: tcp://docker:2376
# fetch & clean the repo rather than completely cloning (faster)
GIT_STRATEGY: fetch
# Test stage. Runs various tests and speculatively builds docker image in
# parallel, in case the build passes.
.test_template: &test_template
stage: test
cache:
key: $CI_JOB_NAME
paths:
- _build/
- deps/
services:
- name: postgres:12
script: script/cibuild
test:
<<: *test_template
image: "elixir:1.10.4-alpine"
test_1.11.4:
<<: *test_template
image: "elixir:1.11.4-alpine"
test_1.12.1:
<<: *test_template
image: "elixir:1.12.1-alpine"
build_image_for_commit:
stage: test
image: "docker:20.10"
only:
- master
services:
- name: docker:20.10-dind
before_script:
- apk add git
- script/ci-docker-prebuild
script:
- script/ci-docker-build
# If tests pass, tag the commit and update package versions
deploy_to_tags:
stage: deploy_tags
needs: ['test', 'build_image_for_commit']
image: "node:16"
only:
- master
cache:
key:
files:
- package-lock.json
- package.json
paths:
- node_modules/
script:
- export GIT_AUTHOR_NAME=$GITLAB_USER_NAME
- export GIT_AUTHOR_EMAIL=$GITLAB_USER_EMAIL
- export GIT_COMMITTER_NAME=$GITLAB_USER_NAME
- export GIT_COMMITTER_EMAIL=$GITLAB_USER_EMAIL
- export GIT_BRANCH=$CI_COMMIT_REF_NAME
- git config user.email $GITLAB_USER_EMAIL
- git config user.name $GITLAB_USER_NAME
- npm install --no-save
- npx semantic-release --repository-url=$CI_REPOSITORY_URL
- script/generate-build-version
artifacts:
reports:
dotenv: build.env
# If the tests passed, we take the image for this SHA and tag it with the version
# and latest, so we can signal that it is ready for prod
deploy_commit_image_to_tag:
stage: deploy
needs:
- build_image_for_commit
- job: deploy_to_tags
artifacts: true
only:
- master
image: "docker:19.03.12"
services:
- name: docker:19.03.12-dind
variables:
GIT_STRATEGY: none # this job does not need the project files, only docker
parallel:
matrix:
- IMAGE_TYPE: ["", "-elixir-builder", "-asset-builder"]
script:
- echo "BUILD_VERSION is ${BUILD_VERSION}"
- docker login "https://${CI_REGISTRY}" -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD
# Run the docker pull, but retry if it doesn't work at first because layers may be
# still be loading to storage
- for i in 1 2 3 4 5; do docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA$IMAGE_TYPE && break || sleep 15; done
- docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA$IMAGE_TYPE $CI_REGISTRY_IMAGE:$BUILD_VERSION$IMAGE_TYPE
- docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA$IMAGE_TYPE $CI_REGISTRY_IMAGE:latest$IMAGE_TYPE
- docker push $CI_REGISTRY_IMAGE:$BUILD_VERSION$IMAGE_TYPE
- docker push $CI_REGISTRY_IMAGE:latest$IMAGE_TYPE