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