From aaf6a6a0301b81260bb1360668aae9a940339182 Mon Sep 17 00:00:00 2001 From: Antoine Martin Date: Mon, 24 Jun 2024 11:46:16 -0400 Subject: [PATCH] gitlab-ci: add test preview feature --- .gitlab-ci.yml | 90 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 72 insertions(+), 18 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a50cd76..7447951 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,25 +1,79 @@ -before_script: - - sudo apk add git ikiwiki po4a perl-yaml-tiny +workflow: + rules: # disable tag pipelines and duplicate MR pipelines + - if: $CI_COMMIT_BRANCH -test: - stage: test - script: - - ikiwiki --setup ikiwiki.setup - - ln -s index.en.html public/index.html - rules: - - if: $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH - tags: - - knit +variables: + MAIN_BRANCH_PATH: "." + EPHEMERAL_BRANCHES_PATH: preview # subpath to ephemeral branches content for preview pages: - stage: deploy + stage: build + cache: + key: gitlab-pages + paths: [public] + before_script: + - sudo apk add git ikiwiki po4a perl-yaml-tiny tree + # CURRENT_CONTENT_PATH is defined in rules, different between main branch and ephemeral branches + - mkdir -p public/$CURRENT_CONTENT_PATH && ls public/$CURRENT_CONTENT_PATH/.. + - | # create ephermetal branched path if not existent + if [ ! -d "public/$EPHEMERAL_BRANCHES_PATH" ]; then + mkdir -p public/$EPHEMERAL_BRANCHES_PATH + fi + - | # avoid deleting main branch content when cache has been erased + if [ "$CI_COMMIT_BRANCH" != "$CI_DEFAULT_BRANCH" ] && [ ! -f public/$MAIN_BRANCH_PATH/index.html ]; then + echo -e "💥\e[91;1m Unable to retrieve $CI_DEFAULT_BRANCH generated files from cache ; please regenerate $CI_DEFAULT_BRANCH files first\e[0m" + exit 1 + fi + - rm -rf public/$CURRENT_CONTENT_PATH || true # remove last version of current branch script: - - ikiwiki --setup ikiwiki.setup - - ln -s index.en.html public/index.html - artifacts: - paths: - - public + - ikiwiki --setup ikiwiki.setup + - | # create symbolic link to index.en.html if public/index.html does not exist + if [ ! -L "public/index.html" ]; then + ln -s index.en.html public/index.html + fi + - | + if [ -z "$CURRENT_CONTENT_PATH" ]; then + mv public output + mkdir -p public + mv public public/$CURRENT_CONTENT_PATH + fi + - cd public/$EPHEMERAL_BRANCHES_PATH + - tree -d -H '.' -L 1 --noreport --charset utf-8 -T "Versions" -o index.html # generate a root HTML listing all previews for easier access + environment: + name: pages/$CI_COMMIT_BRANCH + action: start + url: $CI_PAGES_URL/$CURRENT_CONTENT_PATH + on_stop: pages-clean-preview rules: - - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH + # 'main branch' is exposed at GitLab Pages root + - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + variables: + CURRENT_CONTENT_PATH: $MAIN_BRANCH_PATH + # other (short-lived) branches generation are exposed in 'EPHEMERAL_BRANCHES_PATH/branch-name-sanitized' sub path + - variables: + CURRENT_CONTENT_PATH: $EPHEMERAL_BRANCHES_PATH/$CI_COMMIT_REF_SLUG + artifacts: + paths: [public] + expire_in: 1h + tags: + - knit + +pages-clean-preview: + stage: build + cache: + key: gitlab-pages + paths: [public] + variables: + GIT_STRATEGY: none # git files not available after branch deletion + FOLDER_TO_DELETE: $EPHEMERAL_BRANCHES_PATH/$CI_COMMIT_REF_SLUG # an indirection to allow arbitrary deletion when launching this job + script: + - rm -rf public/$FOLDER_TO_DELETE + environment: + name: pages/$CI_COMMIT_BRANCH + action: stop + rules: + - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH + when: manual + allow_failure: true tags: - knit