image: alpine:latest # Only run pipelines for pushes on branches workflow: rules: - if: $CI_COMMIT_BRANCH # We can't do variable substitution in a job and then also use that computed # variable in the Environment URL of the same job, so we have to do the # substitution in an earlier stage. All of this variable substitution is only # required for projects in sub-groups because GitLab doesn't have a predefined # variable that contains the project namespace relative to the root namespace. # # For example, if the project path is "/group/subgroup-1" then we need just the # "/subgroup-1" portion because that is used in the Environment URL path, while # the "/group" root namespace is used as the subdomain. setup: stage: .pre tags: - docker script: - echo "ROOT_RELATIVE_NAMESPACE=${CI_PROJECT_NAMESPACE#$CI_PROJECT_ROOT_NAMESPACE}" >> build.env artifacts: reports: dotenv: build.env # We can't deploy multiple different variants of GitLab Pages sites (e.g. one # per branch), so we use this workaround instead. GitLab has a special browsable # URL for job artifacts on public projects, and we can create an Environment # that points to that URL so it's easy for devs to know what the current # Environment URL for their branch is. .deploy: stage: deploy tags: - docker before_script: - echo $CI_ENVIRONMENT_URL - echo $ROOT_RELATIVE_NAMESPACE - test "$ROOT_RELATIVE_NAMESPACE" == "${CI_PROJECT_NAMESPACE#$CI_PROJECT_ROOT_NAMESPACE}" || { echo "ROOT_RELATIVE_NAMESPACE is not set correctly" ; exit 1 ; } script: - find src/ -type f -name '*.html' -exec sed -i -e "s|%%BRANCH%%|${CI_COMMIT_BRANCH}|g" -e "s|%%COMMIT_SHA%%|${CI_COMMIT_SHORT_SHA}|g" -e "s|%%COMMIT_TIMESTAMP%%|${CI_COMMIT_TIMESTAMP}|g" -e "s|%%JOB_ID%%|${CI_JOB_ID}|g" -e "s|%%JOB_TIMESTAMP%%|${CI_JOB_STARTED_AT}|g" -e "s|%%JOB_URL%%|${CI_JOB_URL}|g" -e "s|%%PROJECT_PATH%%|${CI_PROJECT_PATH}|g" -e "s|%%PROJECT_TITLE%%|${CI_PROJECT_TITLE}|g" -e "s|%%PROJECT_URL%%|${CI_PROJECT_URL}|g" {} + - mv src public artifacts: paths: - public/ # Deploy a review environment for any push to a branch that is not the default # branch review: extends: .deploy rules: - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH environment: name: "review $CI_COMMIT_BRANCH" url: "https://${CI_PROJECT_ROOT_NAMESPACE}.${CI_PAGES_DOMAIN}/-${ROOT_RELATIVE_NAMESPACE}/${CI_PROJECT_NAME}/-/jobs/$CI_JOB_ID/artifacts/public/index.html" # Deploy to GitLab Pages for pushes on the default branch pages: extends: .deploy rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Purge all of this site's URLs from the Cloudflare cache create-purge-json: stage: deploy rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH needs: ['pages'] tags: - docker script: - |- echo -en "{\n \"files\": [" > purge.json # Add the index-less homepage, with and without trailing slash echo -en "\n \"$CI_PAGES_URL\"" >> purge.json echo -en ",\n \"$CI_PAGES_URL/\"" >> purge.json # Add all the directories, with and without trailing slash for d in $(find public/* -type d); do echo -en ",\n \"$CI_PAGES_URL/${d#public/}\"" >> purge.json echo -en ",\n \"$CI_PAGES_URL/${d#public/}/\"" >> purge.json done # Add all the non-HTML files, with and without trailing slash for f in $(find public -type f -not -iname '*.html'); do echo -en ",\n \"$CI_PAGES_URL/${f#public/}\"" >> purge.json echo -en ",\n \"$CI_PAGES_URL/${f#public/}/\"" >> purge.json done # Add all the HTML files, with and without trailing slash. First with file # extension, then without for f in $(find public -type f -iname '*.html'); do echo -en ",\n \"$CI_PAGES_URL/${f#public/}\"" >> purge.json echo -en ",\n \"$CI_PAGES_URL/${f#public/}/\"" >> purge.json f="${f%.html}" echo -en ",\n \"$CI_PAGES_URL/${f#public/}\"" >> purge.json echo -en ",\n \"$CI_PAGES_URL/${f#public/}/\"" >> purge.json done echo -e "\n ]\n}" >> purge.json - cat purge.json artifacts: paths: - purge.json trigger-cache-purge: stage: .post rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH trigger: include: purge-cache.gitlab-ci.yml variables: PARENT_PIPELINE_ID: $CI_PIPELINE_ID # vi: set ts=2 sw=2 et ft=yaml: