diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ea9d4ea2ee86c3ce6193a9576bd7333a37815afc..492009b76630610c115e2365104f1cd039fbdf10 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -6,6 +6,8 @@ variables: DOCKER_TLS_CERTDIR: DOCKER_DRIVER: overlay2 + PROJECT_NAME: DojoExerciseChecker + VERSION_DEV_SUFFIX: '-dev' GITLAB_API_PROJECT_URL: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID} @@ -15,12 +17,24 @@ variables: PROJECT_FOLDER: ExerciseChecker + PACKAGE_REGISTRY_URL: "${GITLAB_API_PROJECT_URL}/packages/generic/${PROJECT_NAME}" + + WIKI_FOLDER: Wiki + .get_version: script: - IS_DEV=$([[ $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH ]] && echo false || echo true) - VERSION=$(jq -r .version $PROJECT_FOLDER/package.json)$([[ $IS_DEV == true ]] && echo $VERSION_DEV_SUFFIX || echo '') + +.get_packages_url: + script: + # Wiki + - WIKI_ARCHIVE_NAME="${PROJECT_NAME}_Wiki_${VERSION}.tar.xz" + - PACKAGE_URL_WIKI="${PACKAGE_REGISTRY_URL}_Wiki/${VERSION}/${WIKI_ARCHIVE_NAME}" + + .init_dind_script: script: # Install dependencies @@ -28,20 +42,25 @@ variables: - apk add git - apk add jq - apk add curl + # Init docker buildx - docker login -u $DOCKER_REGISTRY_USER -p $DOCKER_REGISTRY_PASSWORD $DOCKER_REGISTRY - docker buildx create --use + # Get version from package.json - !reference [.get_version, script] - CONTAINER_IMAGE=$DOCKER_REGISTRY_IMAGE:$VERSION + .build_script: script: - !reference [ .init_dind_script, script ] - mkdir -p $ARTIFACTS_FOLDER + # Download secure files - curl --silent "https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/download-secure-files/-/raw/main/installer" | sh - mv .secure_files/env_$VERSION $PROJECT_FOLDER/.env + # Need to build for each platform separately because of multi-stage builds (docker buildx don't use cache same way as docker build) - > platform_array=$(echo $DOCKER_PLATFORMS | tr "," "\n"); @@ -50,20 +69,40 @@ variables: docker buildx build --pull --platform $platform --file $DOCKERFILE --tag $CONTAINER_IMAGE . done + .clean_release: script: # Delete release if it already exists - 'curl --request DELETE --header "JOB-TOKEN: $CI_JOB_TOKEN" "${GITLAB_API_PROJECT_URL}/releases/${VERSION}"' + # Delete tag if it already exists (use private-token because job-token don't have permission to delete tags) - 'curl --request DELETE --header "PRIVATE-TOKEN: $GITLAB_PROJECT_ACCESS_TOKEN" "${GITLAB_API_PROJECT_URL}/repository/tags/${VERSION}"' + + +.clean_packages: + script: + # Get all packages of the project + - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" "${GITLAB_API_PROJECT_URL}/packages" > gitlabPackages.json' + + # Filter and select packages to delete (based on version) + - packagesToDelete=`jq -r '.[] | select(.version=="'${VERSION}'") | ._links.delete_api_path' gitlabPackages.json` + + # Delete packages by calling Gitlab API + - > + for deletePath in $packagesToDelete; do + echo "Deleting package at path : ${deletePath}" + curl --request DELETE --header "JOB-TOKEN: $CI_JOB_TOKEN" "${deletePath}" + done stages: - test - build - clean + - upload - release + test:build: stage: test tags: @@ -77,6 +116,7 @@ test:build: rules: - if: '$CI_COMMIT_TAG =~ "/^$/" && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_COMMIT_BRANCH !~ /^v[0-9]+(\.[0-9]+)*$/' + build:version: stage: build tags: @@ -87,11 +127,13 @@ build:version: - docker:dind script: - !reference [ .build_script, script ] + # Here docker buildx can use cached images created in previous step - docker buildx build --platform $DOCKER_PLATFORMS --file $DOCKERFILE --push --tag $CONTAINER_IMAGE . rules: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /^v[0-9]+(\.[0-9]+)*$/' + clean:release: stage: clean tags: @@ -103,6 +145,19 @@ clean:release: rules: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /^v[0-9]+(\.[0-9]+)*$/' + +clean:packages: + stage: clean + tags: + - gitlab_clean + image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest + script: + - !reference [.get_version, script] + - !reference [.clean_packages, script] + rules: + - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /^v[0-9]+(\.[0-9]+)*$/' + + clean:dev:release: stage: clean tags: @@ -115,6 +170,20 @@ clean:dev:release: rules: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' + +clean:dev:packages: + stage: clean + tags: + - gitlab_clean + image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest + script: + - !reference [.get_version, script] + - VERSION="${VERSION}${VERSION_DEV_SUFFIX}" + - !reference [.clean_packages, script] + rules: + - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' + + clean:dev:dockerhub: stage: clean tags: @@ -126,6 +195,7 @@ clean:dev:dockerhub: script: - !reference [.init_dind_script, script] - VERSION="${VERSION}${VERSION_DEV_SUFFIX}" + # Remove dev tag ## Login to dockerhub (get JWT token) - GET_TOKEN_DATA=$(jq --null-input --arg username "$DOCKER_REGISTRY_USER" --arg password "$DOCKER_REGISTRY_PASSWORD" '{"username":$username,"password":$password}') @@ -134,11 +204,36 @@ clean:dev:dockerhub: --header "Content-Type: application/json" \ --header "JOB-TOKEN: $CI_JOB_TOKEN" \ "https://hub.docker.com/v2/users/login/" | jq -r .token` + ## Delete tag - 'curl --header "Authorization: JWT ${TOKEN}" --request DELETE "https://hub.docker.com/v2/repositories/${DOCKER_REGISTRY_IMAGE}/tags/${VERSION}/"' rules: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' + +upload:packages:wiki: + stage: upload + tags: + - gitlab_package + image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest + script: + # Install dependencies + - apk update + - apk add xz + + - !reference [.get_version, script] + - !reference [.get_packages_url, script] + + # Create archive + - WIKI_ARCHIVE_PATH="${ARTIFACTS_FOLDER}/${WIKI_ARCHIVE_NAME}" + - tar -v -c -C "${CI_PROJECT_DIR}/${WIKI_FOLDER}" -J -f "${WIKI_ARCHIVE_PATH}" . # Ubuntu: tar --verbose --create --cd wiki-test-2 --xz --file file.tar.bz2 + + # Send package + - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${WIKI_ARCHIVE_PATH} "${PACKAGE_URL_WIKI}";' + rules: + - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /^v[0-9]+(\.[0-9]+)*$/' + + release:dockerhub:latest: stage: release tags: @@ -149,11 +244,60 @@ release:dockerhub:latest: - docker:dind script: - !reference [.init_dind_script, script] + # Push latest tag - docker buildx imagetools create $CONTAINER_IMAGE --tag $DOCKER_REGISTRY_IMAGE:latest rules: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' + +release:wiki: + stage: release + tags: + - release + image: alpine:latest + script: + - !reference [.get_version, script] + + - apk update + - apk add git + + # Define URL for the wiki in terms of project-agnostic predefined variables + - WIKI_URL="${CI_SERVER_PROTOCOL}://project_${CI_PROJECT_ID}_bot:${GITLAB_PROJECT_ACCESS_TOKEN}@${CI_SERVER_HOST}:${CI_SERVER_PORT}/${CI_PROJECT_PATH}.wiki.git" + + # Clone this project's wiki under /tmp + - rm -rf "/tmp/${CI_PROJECT_NAME}.wiki" + - cd /tmp + - git clone "${WIKI_URL}" + + # Enter the cloned repo + - cd "${CI_PROJECT_NAME}.wiki" + + # Update the file + - mv .git/ ../ + - rm -rf ./* + - mv ../.git/ ./ + - cp "${CI_PROJECT_DIR}/.gitignore" . + - cp -R "${CI_PROJECT_DIR}/${WIKI_FOLDER}/." . + + # Set committer info + - git config user.name "$GITLAB_USER_NAME" + - git config user.email "$GITLAB_USER_EMAIL" + + # Commit the gitignore file + - git add ".gitignore" + - git commit -m "Add gitignore file" || true + + # Commit the file + - git add . + - git commit -m "${VERSION}" || true + + # Push the change back to the master branch of the wiki + - git push origin "HEAD:main" + rules: + - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' + + release:gitlab: stage: release tags: @@ -162,17 +306,28 @@ release:gitlab: script: - !reference [.get_version, script] - echo 'Running release_job' + - !reference [.get_packages_url, script] + # Extract description from CHANGELOG.md - CHANGELOG_LINE_START=`awk '/##\ [0-9]+\.[0-9]+\.[0-9]+/{print NR; exit;}' CHANGELOG.md` - CHANGELOG_LINE_END=`awk '/##\ [0-9]+\.[0-9]+\.[0-9]+/{ count++; if(count>1) {print NR; exit;}}' CHANGELOG.md` - DESCRIPTION=`awk 'NR > '$CHANGELOG_LINE_START' && NR < '$CHANGELOG_LINE_END'' CHANGELOG.md` + # Create Release (can't be done by release_step of gitlab image because it don't have access to env var defined in script_step) - > RELEASE_DATA=$(jq --null-input --arg version "$VERSION" --arg description "# Changelog (version $VERSION) $DESCRIPTION" --arg tag_name "$VERSION" --arg ref "$CI_COMMIT_SHORT_SHA" '{ "name": $version, "description": $description, "tag_name": $tag_name, - "ref": $ref + "ref": $ref, + "assets": { + "links": [ + { + "name": "Wiki", + "url": "'${PACKAGE_URL_WIKI}'", + } + ] + } }') - > curl --data "${RELEASE_DATA}" \ diff --git a/Wiki/Home.md b/Wiki/Home.md new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391