From de8af88c3c57bfc53a384a7a15ed4282c718efe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grand?= <francois.grand@inrae.fr> Date: Fri, 15 Apr 2022 10:34:12 +0200 Subject: [PATCH 1/5] refactor(ci): modify release-version.sh to not update releases.json/symlinks on nightly version refs #505 --- scripts/release-version.sh | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/scripts/release-version.sh b/scripts/release-version.sh index 9952d4134..83398a209 100755 --- a/scripts/release-version.sh +++ b/scripts/release-version.sh @@ -2,9 +2,10 @@ # Fabrique les exécutables electron/cordova pour une version de Cassiopée $1, les # distribue sur le serveur $2 dans le dossier $3, et met à jour le fichier releases.json +# et les liens symboliques si la version n'est pas nightly if [ "$#" -lt 3 ]; then - echo "usage: $0 X.Y.Z login@server /var/www/releases_dir" + echo "usage: $0 <X.Y.Z|nightly> <login@server> <releases dir>" exit 1 fi @@ -15,22 +16,29 @@ RELEASES_DIR="$3" RELEASES_FILE="$RELEASES_DIR/releases.json" TMP_RELEASES_FILE="tmp-releases.json" +# update flag for releases file/symlinks +update_latest=1 +if [[ $VERSION == "nightly" ]]; then + update_latest=0 +fi + echo "deploy-version.sh: building release for version $VERSION, deploying in $HOST_LOGIN:$RELEASES_DIR" # build releases npm run release-all # update existing releases file +if (( $update_latest )); then + echo "updating releases.json" -# fetch current releases file -scp "$HOST_LOGIN:$RELEASES_FILE" "./$TMP_RELEASES_FILE" + # fetch current releases file + scp "$HOST_LOGIN:$RELEASES_FILE" "./$TMP_RELEASES_FILE" -grep -P "\"latest\": \"$VERSION\"" "$TMP_RELEASES_FILE" + grep -P "\"latest\": \"$VERSION\"" "$TMP_RELEASES_FILE" -if [[ $? == 0 ]] -then + if [[ $? == 0 ]]; then echo "$VERSION est déjà la version la plus récente, pas de mise à jour du fichier releases.json" -else + else sed -i -E "s/\"latest\": .+,/\"latest\": \"$VERSION\",/" "$TMP_RELEASES_FILE" echo -e "\t\"$VERSION\": { \t\t\"darwin\": \"Cassiopée-${VERSION}-mac.zip\", @@ -41,20 +49,26 @@ else sed -i "/\"latest\": \"$VERSION\",/r releases_patch.tmp" "$TMP_RELEASES_FILE" rm releases_patch.tmp -fi + fi -# send updated file, remove local copy -scp "./$TMP_RELEASES_FILE" "$HOST_LOGIN:$RELEASES_FILE" -rm "./$TMP_RELEASES_FILE" + # send updated file, remove local copy + scp "./$TMP_RELEASES_FILE" "$HOST_LOGIN:$RELEASES_FILE" + rm "./$TMP_RELEASES_FILE" +fi # copy releases to public web directory scp "release/Cassiopée Setup $VERSION.exe" "release/fr.irstea.cassiopee_${VERSION}_amd64.deb" "release/cassiopee-$VERSION.apk" "release/Cassiopée-${VERSION}-mac.zip" "$HOST_LOGIN:$RELEASES_DIR/" # symlink "latest" version for each platform -ssh $HOST_LOGIN /bin/bash << EOF + +if (( $update_latest )); then + echo "updating 'latest' symlinks" + + ssh $HOST_LOGIN /bin/bash << EOF cd "$RELEASES_DIR" ln -sf "Cassiopée Setup $VERSION.exe" "windows-latest.exe" ln -sf "fr.irstea.cassiopee_${VERSION}_amd64.deb" "linux-latest.deb" ln -sf "Cassiopée-${VERSION}-mac.zip" "macos-latest.zip" ln -sf "cassiopee-$VERSION.apk" "android-latest.apk" EOF +fi -- GitLab From c7e4bc5b51eaa06330e25062dfbd8d9df13a101b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grand?= <francois.grand@inrae.fr> Date: Fri, 15 Apr 2022 11:34:18 +0200 Subject: [PATCH 2/5] refactor(ci) : rename deployment stages deploy renamed to deploy-dev deploy-stable renamed to deploy-prod refs #505 --- .gitlab-ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 76965e220..c2c4534eb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,8 +4,8 @@ stages: - test - build - clean-stale-branches - - deploy - - deploy-stable + - deploy-dev + - deploy-prod - releases-nightly - releases-version @@ -93,8 +93,8 @@ clean-stale-branches: script: - ./scripts/remove-stale-branches.sh $DEPLOY_HOST_LOGIN $DEPLOY_URL -deploy: - stage: deploy +deploy-dev: + stage: deploy-dev only: - pushes - tags @@ -105,8 +105,8 @@ deploy: # Copie de la branche / du tag - rsync --delete -a "dist/" "$DEPLOY_HOST_LOGIN:$DEPLOY_URL/$CI_COMMIT_REF_NAME" -deploy-stable: - stage: deploy-stable +deploy-prod: + stage: deploy-prod only: variables: - $CI_COMMIT_REF_NAME == "stable" -- GitLab From b0f4433859edb27b4c728412cb3b1a78fc14d899 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grand?= <francois.grand@inrae.fr> Date: Fri, 15 Apr 2022 11:35:40 +0200 Subject: [PATCH 3/5] refactor(ci) : release-version.sh : split arguments login@server argument split to separate login and server refs #505 --- scripts/release-version.sh | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/scripts/release-version.sh b/scripts/release-version.sh index 83398a209..c17a7d311 100755 --- a/scripts/release-version.sh +++ b/scripts/release-version.sh @@ -1,20 +1,22 @@ #!/bin/bash # Fabrique les exécutables electron/cordova pour une version de Cassiopée $1, les -# distribue sur le serveur $2 dans le dossier $3, et met à jour le fichier releases.json +# distribue sur le serveur $2@$3 dans le dossier $4, et met à jour le fichier releases.json # et les liens symboliques si la version n'est pas nightly -if [ "$#" -lt 3 ]; then - echo "usage: $0 <X.Y.Z|nightly> <login@server> <releases dir>" +if [ "$#" -lt 4 ]; then + echo "usage: $0 <X.Y.Z|nightly> <login> <server> <releases dir>" exit 1 fi VERSION="$1" -HOST_LOGIN="$2" -RELEASES_DIR="$3" +LOGIN="$2" +HOST="$3" +RELEASES_DIR="$4" # RELEASES_DIR="/tmp/cassiopee-releases" # debug RELEASES_FILE="$RELEASES_DIR/releases.json" TMP_RELEASES_FILE="tmp-releases.json" +HOST_LOGIN=$LOGIN@$HOST # update flag for releases file/symlinks update_latest=1 -- GitLab From 7978fd22ac489a489ef0b5bed9f54b4f3078ee6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grand?= <francois.grand@inrae.fr> Date: Fri, 15 Apr 2022 11:57:32 +0200 Subject: [PATCH 4/5] refactor(ci) : .gitlab-ci.yml : use DEV_xx/PROD_xx variables from Gitlab CI/CD environment refs #505 --- .gitlab-ci.yml | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c2c4534eb..196f45238 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,13 +10,20 @@ stages: - releases-version variables: +# from Gitlab CI/CD environment variables : +# - development server : +# DEV_HOST : deployment server hostname +# DEV_LOGIN : user on deployment server +# DEV_PATH : path base on deployment server +# - production server : +# PROD_HOST : deployment server hostname +# PROD_LOGIN : user on deployment server +# PROD_PASS : password for user on deployment server +# PROD_PATH : path base on deployment server LC_ALL: C.UTF-8 ANDROID_HOME: "/usr/local/android-sdk" # should already be defined in the Docker image ANDROID_SDK_ROOT: "/usr/local/android-sdk" # should already be defined in the Docker image - DEPLOY_HOST_LOGIN: "nghyd@aubes" - DEPLOY_URL: "/var/www/html/cassiopee" - DEPLOY_STABLE_URL: "/var/www/cassiopee-production" - RELEASES_URL: "$DEPLOY_STABLE_URL/cassiopee-releases" + RELEASES_PATH: "$PROD_PATH/cassiopee-releases" before_script: # load private key from GitLab CI variable, to deploy on Aubes server @@ -91,7 +98,7 @@ clean-stale-branches: - tags - web script: - - ./scripts/remove-stale-branches.sh $DEPLOY_HOST_LOGIN $DEPLOY_URL + - ./scripts/remove-stale-branches.sh $DEV_LOGIN@$DEV_HOST $DEV_PATH deploy-dev: stage: deploy-dev @@ -103,7 +110,7 @@ deploy-dev: - build script: # Copie de la branche / du tag - - rsync --delete -a "dist/" "$DEPLOY_HOST_LOGIN:$DEPLOY_URL/$CI_COMMIT_REF_NAME" + - rsync --delete -a "dist/" "$DEV_LOGIN@$DEV_HOST:$DEV_PATH/$CI_COMMIT_REF_NAME" deploy-prod: stage: deploy-prod @@ -114,9 +121,9 @@ deploy-prod: - build script: # Copie de la branche production - - rsync --delete -a "dist/" "$DEPLOY_HOST_LOGIN:$DEPLOY_STABLE_URL/" + - rsync --delete -a "dist/" "$PROD_LOGIN@$PROD_HOST:$PROD_PATH/" # Modification du dossier base href - - ssh $DEPLOY_HOST_LOGIN "sed -i 's:/cassiopee/stable/:/:g' $DEPLOY_STABLE_URL/index.html" + - ssh $PROD_LOGIN@PROD_HOST "sed -i 's:/cassiopee/stable/:/:g' $PROD_PATH/index.html" releases-nightly: stage: releases-nightly @@ -124,11 +131,7 @@ releases-nightly: - schedules dependencies: [] script: - - npm run release-all - - find release -name "fr.irstea.cassiopee_*.deb" -exec scp "{}" $DEPLOY_HOST_LOGIN:$RELEASES_URL/linux-nightly.deb \; - - find release -name "Cassio*Setup*.exe" -exec scp "{}" $DEPLOY_HOST_LOGIN:$RELEASES_URL/windows-nightly.exe \; - - find release -name "Cassio*-mac.zip" -exec scp "{}" $DEPLOY_HOST_LOGIN:$RELEASES_URL/macos-nightly.zip \; - - find release -name "cassiopee-*.apk" -exec scp "{}" $DEPLOY_HOST_LOGIN:$RELEASES_URL/android-nightly.apk \; + - ./scripts/release-version.sh nightly $PROD_LOGIN $PROD_HOST $RELEASES_PATH releases-version: stage: releases-version @@ -137,4 +140,4 @@ releases-version: - $CI_COMMIT_REF_NAME =~ /^[0-9]+\.[0-9]+\.[0-9]+$/ # version tag dependencies: [] script: - - ./scripts/release-version.sh $CI_COMMIT_REF_NAME $DEPLOY_HOST_LOGIN $RELEASES_URL + - ./scripts/release-version.sh $CI_COMMIT_REF_NAME $PROD_LOGIN $PROD_HOST $RELEASES_PATH -- GitLab From b8992d46b0350f7b92e754416f814f31e9cf2d8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grand?= <francois.grand@inrae.fr> Date: Tue, 19 Apr 2022 13:26:37 +0200 Subject: [PATCH 5/5] refactor(ci): add deploy-version.sh helper script refs #505 --- .gitlab-ci.yml | 15 +++++++++------ scripts/deploy-version.sh | 31 +++++++++++++++++++++++++++++++ scripts/release-version.sh | 18 +++++++++++++++--- 3 files changed, 55 insertions(+), 9 deletions(-) create mode 100755 scripts/deploy-version.sh diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 196f45238..ba234b4ef 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -26,9 +26,12 @@ variables: RELEASES_PATH: "$PROD_PATH/cassiopee-releases" before_script: - # load private key from GitLab CI variable, to deploy on Aubes server + # load private key from GitLab CI variable to deploy on Aubes server - eval $(ssh-agent -s) - ssh-add <(echo "$AUBES_B64_AUTHORIZED_SSH_PRIVATE_KEY" | base64 -d) + # load private key from GitLab CI variable to deploy on OVH server + - ssh-add <(echo "$OVH_B64_AUTHORIZED_SSH_PRIVATE_KEY" | base64 -d) + # disable console prompt for host checking - mkdir -p ~/.ssh - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config @@ -110,7 +113,7 @@ deploy-dev: - build script: # Copie de la branche / du tag - - rsync --delete -a "dist/" "$DEV_LOGIN@$DEV_HOST:$DEV_PATH/$CI_COMMIT_REF_NAME" + - ./scripts/deploy-version.sh $CI_COMMIT_REF_NAME $DEV_LOGIN $DEV_HOST $DEV_PATH deploy-prod: stage: deploy-prod @@ -120,15 +123,15 @@ deploy-prod: dependencies: - build script: - # Copie de la branche production - - rsync --delete -a "dist/" "$PROD_LOGIN@$PROD_HOST:$PROD_PATH/" - # Modification du dossier base href - - ssh $PROD_LOGIN@PROD_HOST "sed -i 's:/cassiopee/stable/:/:g' $PROD_PATH/index.html" + - ./scripts/deploy-version.sh stable $PROD_LOGIN $PROD_HOST $PROD_PATH $PROD_PASS releases-nightly: stage: releases-nightly only: - schedules + except: + # exclude master to apply releases-nightly on devel only + - master dependencies: [] script: - ./scripts/release-version.sh nightly $PROD_LOGIN $PROD_HOST $RELEASES_PATH diff --git a/scripts/deploy-version.sh b/scripts/deploy-version.sh new file mode 100755 index 000000000..59ed40937 --- /dev/null +++ b/scripts/deploy-version.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +set -o errexit + +# deploie l'appli sur le serveur $3 (user $2/mot de passe $5) dans le dossier $4 et met à jour le fichier index.html +# si la version est "stable" + +if (( $# < 4 || $# > 5 )); then + echo "usage: $0 <version> <login> <server> <path> [<password>]" + exit 1 +fi + +VERSION="$1" +LOGIN="$2" +HOST="$3" +DIR="$4" +PASS="$5" + +echo "$(basename $0): deploying version $VERSION in $LOGIN@$HOST:$DIR" + +if [[ $VERSION == "stable" ]]; then + # Copie de la branche production + rsync -a --delete --exclude=cassiopee-releases -e "ssh -o StrictHostKeyChecking=no" dist/ ${LOGIN}@${HOST}:${DIR}/ + + # Modification du dossier base href + echo "updating index.html" + ssh $LOGIN@$HOST "sed -i 's:/cassiopee/stable/:/:g' $DIR/index.html" +else + # Copie de la branche / du tag + rsync -a --delete --exclude=cassiopee-releases -e "ssh -o StrictHostKeyChecking=no" "dist/" "$LOGIN@$HOST:$DIR/$VERSION" +fi diff --git a/scripts/release-version.sh b/scripts/release-version.sh index c17a7d311..1f810669e 100755 --- a/scripts/release-version.sh +++ b/scripts/release-version.sh @@ -1,10 +1,14 @@ #!/bin/bash +set -o errexit + # Fabrique les exécutables electron/cordova pour une version de Cassiopée $1, les # distribue sur le serveur $2@$3 dans le dossier $4, et met à jour le fichier releases.json # et les liens symboliques si la version n'est pas nightly -if [ "$#" -lt 4 ]; then +echo "args $@" + +if (( $# < 4 )); then echo "usage: $0 <X.Y.Z|nightly> <login> <server> <releases dir>" exit 1 fi @@ -24,7 +28,7 @@ if [[ $VERSION == "nightly" ]]; then update_latest=0 fi -echo "deploy-version.sh: building release for version $VERSION, deploying in $HOST_LOGIN:$RELEASES_DIR" +echo "release-version.sh: building release for version $VERSION, deploying in $HOST_LOGIN:$RELEASES_DIR" # build releases npm run release-all @@ -59,7 +63,15 @@ if (( $update_latest )); then fi # copy releases to public web directory -scp "release/Cassiopée Setup $VERSION.exe" "release/fr.irstea.cassiopee_${VERSION}_amd64.deb" "release/cassiopee-$VERSION.apk" "release/Cassiopée-${VERSION}-mac.zip" "$HOST_LOGIN:$RELEASES_DIR/" +ssh $HOST_LOGIN mkdir -p $RELEASES_DIR +if [[ $VERSION == nightly ]]; then + find release -name "fr.irstea.cassiopee_*.deb" -exec scp "{}" $HOST_LOGIN:$RELEASES_DIR/linux-nightly.deb \; + find release -name "Cassio*Setup*.exe" -exec scp "{}" $HOST_LOGIN:$RELEASES_DIR/windows-nightly.exe \; + find release -name "Cassio*-mac.zip" -exec scp "{}" $HOST_LOGIN:$RELEASES_DIR/macos-nightly.zip \; + find release -name "cassiopee-*.apk" -exec scp "{}" $HOST_LOGIN:$RELEASES_DIR/android-nightly.apk \; +else + scp "release/Cassiopée Setup $VERSION.exe" "release/fr.irstea.cassiopee_${VERSION}_amd64.deb" "release/cassiopee-$VERSION.apk" "release/Cassiopée-${VERSION}-mac.zip" "$HOST_LOGIN:$RELEASES_DIR/" +fi # symlink "latest" version for each platform -- GitLab