Skip to content
Snippets Groups Projects
Commit 64dd223b authored by michael.minelli's avatar michael.minelli
Browse files

Merge branch 'v2.1.0' into main

parents c796705c e85e6edb
Branches
Tags
No related merge requests found
Pipeline #26520 passed
.env
aws.xml
workspace.xml
......@@ -184,11 +182,10 @@ web_modules/
.yarn-integrity
# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
.env*
.flaskenv*
!.env.project
!.env.vault
# parcel-bundler cache (https://parceljs.org/)
.cache
......
......@@ -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,35 @@ 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
# Decrypt env vars for production
- apk add npm sed
- cd $PROJECT_FOLDER
- sed -i -r "s/\{\{VERSION\}\}/${VERSION}/g" src/app.ts
- |
if [ $CI_COMMIT_REF_PROTECTED == "true" ]; then
echo "Decrypt production env vars"
sed -i -r "s/(DOTENV_KEY[ ]*:[ ]*[\'\"\`])[^'\"\`]*([\'\"\`])([ ]*\,)?//g" src/app.ts
sed -i -r "s/,[\ \n]*\}/\}/g" src/app.ts
npx dotenv-vault local decrypt "${DOTENV_PROD_KEY}" > .env
fi
- cd ..
# 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 +79,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:
......@@ -75,7 +124,8 @@ test:build:
script:
- !reference [ .build_script, script ]
rules:
- if: '$CI_COMMIT_TAG =~ "/^$/" && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_COMMIT_BRANCH !~ /^v[0-9]+(\.[0-9]+)*$/'
- if: '$CI_COMMIT_TAG =~ "/^$/" && $CI_COMMIT_REF_PROTECTED != "true"'
build:version:
stage: build
......@@ -87,10 +137,12 @@ 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]+)*$/'
- if: '$CI_COMMIT_REF_PROTECTED == "true"'
clean:release:
stage: clean
......@@ -101,7 +153,20 @@ clean:release:
- !reference [.get_version, script]
- !reference [.clean_release, script]
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /^v[0-9]+(\.[0-9]+)*$/'
- if: '$CI_COMMIT_REF_PROTECTED == "true"'
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_REF_PROTECTED == "true"'
clean:dev:release:
stage: clean
......@@ -115,6 +180,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 +205,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 +214,37 @@ 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
- mkdir -p $ARTIFACTS_FOLDER
- 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_REF_PROTECTED == "true"'
release:dockerhub:latest:
stage: release
tags:
......@@ -149,11 +255,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 +317,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}" \
......@@ -180,4 +346,4 @@ release:gitlab:
--header "JOB-TOKEN: $CI_JOB_TOKEN" \
--request POST "${GITLAB_API_PROJECT_URL}/releases"
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /^v[0-9]+(\.[0-9]+)*$/'
\ No newline at end of file
- if: '$CI_COMMIT_REF_PROTECTED == "true"'
\ No newline at end of file
......@@ -14,6 +14,19 @@
**⚠️ Deprecation:**
-->
## 2.1.0 (?)
### 🎨 Interface
- **💥 Breaking:** Renamed `dojo.enonce` (or `dojo.assignment`) file to `dojo_assignment.json`
### 🔨 Internal / Developers
- Deploy Wiki on Gitlab (on push to `main`) from files of `Wiki` folder
- Migration from .env files stored in Gitlab Secure Files to usage of `dotenv-vault` (locally)
### 📚 Documentation
- Added Wiki base
## 2.0.0 (2023-09-15)
### ✨ Feature
......
#/-------------------.env.vault---------------------/
#/ cloud-agnostic vaulting standard /
#/ [how it works](https://dotenv.org/env-vault) /
#/--------------------------------------------------/
# development
DOTENV_VAULT_DEVELOPMENT="Ir7CPeMh8qd9jAgmy8RaSTlY3OA4Kw6xHB+j7AJjfM07H2koRKpOUP5Fsa+XBYp1rjTCl5p2063/H3ed2VmhUwIHxa+CUwHOagy+kKLYHBVzEdSrE6EK96+ihyGwjkrFRdRRWar74TxaCsxoNpLUz0HtK1fbJZMFUhgJOklBcw8BdH6mrq3RI8+tkSx5nOTJTGo0OhilsAZTeAbOdcZQNIcIfbZVMLD1X3YocqitLyAURzfyEegp3XOHfpOr+45/Be4HaakylijLggn73sS/fDr/yo2IRHTz7il/Y8IO3kUMJnSXoqQM1EPzqiYEtIFsDW2aVjLnbDdM2BxlNe+Cv50yglPINfkOMJ3ZBsELjkDBI9N5wLW9qyoF5zxaw4jfnGTPuVsM1FhozEGTBg64GtJ82WI0ftDjt06E1jkMB9hWbYS5pKBWHq/w2A+TfatZjn9QmgEuiO5Q8RW6srojTsuuMjJwVC9YCzjzvxC0YJulfMCBYuPW1cVagp6CkA5soo7iaEfJmt++GhWkYGBMq9EeezTl5GEarpUBYdLYlwfICsgP1E+9lF5dud+zWnrGzBVeePBmcVO86C/SZici/3HkORY68NoqbswV5AXJyACFT6Qf+z3k8CLkrCvfti6xvAAf4ivorbnihB0RX4znE4e70qCU2w3QjS+cwuHuC8sEp4SpqxR+kP2+ktfA5pw08yoFg4zrSTwuvJN8OnLyryo0VODCWA1V6Bom/imtCLn2nRuYQhO0AYiAtvyWOTbeduQ7rixeYc98j80sVHU7PY4hFbF7NVnWUY+nhzJ3rbK1y9q7iLLkpivsRmeosIIhVtoSR+Lur/hYZ2ReFyA6OHofxdcIqKiphG4HLZl9lCq6a+UlRAOqN98XABGmJ1KhCTsFxTTuGahMU1r556O/4NJFnubPU1DH80n71AB4HdD2qCxs4Tm4fDVs3cDv7fak"
# production
DOTENV_VAULT_PRODUCTION="NEaGKlOKDlL652EG43Iid/7P4ybOxkmc3t+6xgKS11Kevzs7zocA8cjJqfkjBAFdMu1oZbiLO+dzXgqEVHmu+66Qr8CDMufQsNXgpO6viLUx/FlDpeY1IYJVma/W1GwEP+5AW2BhrT7MJnBidzx5wHomjy+CAYlMoV3c4Q/obJQcomq65jn5KSgaiFcyLqitbUESJhxAS5adRXvtkdbqaXR5yCRtXF2OS50HW544/9qf9e9hqwELHrd1fYOJqYuE/zbZV3ZGgwgK7Ui0tv8MU4uN6LzpTTZVWdK4cdMuQTtX23rTWg9J9WcAj5M8jpo309VFPPxN3SfzoQHVb9+RlL+XEH92EwRFFevtKdE07Wz5ZbUbtiKAqkqaKiusjSALasoT+mW5LFWjFdFCDJKof98w00kR7c6PoTDBw50Zh5/z+UPn4uXT8ZOKV7ooxGQLATrBP+4k7pyBx2bYCo/o0tbgSJ4uTv+Wo2eVwUXrptxwmp6Tow50NAdcvKJCQmDe43e6PMsyX+9GO6CbRywvS/2aLffXRly+txqkr0B9/suMwuQwyEv8LOVR9Q2z3MC6leQ3VAaGxNGLKEdtJFgn+31JnciGy6HQABDZ6Agc/Tux4PBOOWy0yq0mGQztIk/0dj+WMro="
.env*
.flaskenv*
!.env.project
!.env.vault
\ No newline at end of file
This diff is collapsed.
{
"name" : "dojo_exercise_checker",
"version" : "2.0.0",
"version" : "2.1.0",
"main" : "dist/app.js",
"bin" : {
"dirmanager": "./dist/app.js"
......@@ -42,6 +42,7 @@
"@types/js-yaml" : "^4.0.5",
"@types/node" : "^18.17.1",
"@types/tar-stream" : "^2.2.2",
"dotenv-vault" : "^1.25.0",
"pkg" : "^5.8.1",
"tiny-typed-emitter": "^2.1.0",
"ts-node" : "^10.9.1",
......
// Read from the .env file
// ATTENTION : This lines MUST be the first of this file (except for the path import)
const path = require('node:path');
require('dotenv').config({ path: path.join(__dirname, '../.env') });
require('dotenv').config({
path : path.join(__dirname, '../.env'),
DOTENV_KEY: 'dotenv://:key_bebfddf18e3dd9a0bafafe0e383313f75add1da6fbe41ea5fde51f37ef1776aa@dotenv.local/vault/.env.vault?environment=development'
});
require('./shared/helpers/TypeScriptExtensions'); // ATTENTION : This line MUST be the second of this file
import ClientsSharedConfig from './sharedByClients/config/ClientsSharedConfig';
......@@ -28,7 +31,7 @@ import ClientsSharedExerciseHelper from './sharedByClients/helpers/Dojo/ClientsS
HttpManager.registerAxiosInterceptor();
console.log(Styles.APP_NAME(Config.appName));
console.log(Styles.APP_NAME(`${ Config.appName } (version {{VERSION}})`));
let exerciseAssignment: ExerciseAssignment | undefined;
let exerciseDockerCompose: ExerciseDockerCompose;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment