#!/bin/bash # # Copyright 2025 Sergey S. Chernov real.sergeych@gmail.com # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # function checkState() { if [[ $? != 0 ]]; then echo echo -- rsync failed. deploy was not finished. deployed version has not been affected echo exit 100 fi } # Update docs/idea_plugin.md to point to the latest built IDEA plugin zip # from ./distributables before building the site. The change is temporary and # the original file is restored right after the build. DOC_IDEA_PLUGIN="docs/idea_plugin.md" DOC_IDEA_PLUGIN_BACKUP="${DOC_IDEA_PLUGIN}.deploy_backup" function updateIdeaPluginDownloadLink() { if [[ ! -f "$DOC_IDEA_PLUGIN" ]]; then echo "WARN: $DOC_IDEA_PLUGIN not found; skipping plugin link update" return 0 fi # Find the most recently modified plugin zip local latest latest=$(ls -t distributables/lyng-idea-*.zip 2>/dev/null | head -n 1) if [[ -z "$latest" ]]; then echo "WARN: no distributables/lyng-idea-*.zip found; leaving $DOC_IDEA_PLUGIN unchanged" return 0 fi local base base=$(basename "$latest") local version version="${base#lyng-idea-}" version="${version%.zip}" local url url="https://lynglang.com/distributables/${base}" local newline newline="### [Download plugin v${version}](${url})" # Backup and rewrite the specific markdown line if present cp "$DOC_IDEA_PLUGIN" "$DOC_IDEA_PLUGIN_BACKUP" || { echo "ERROR: can't backup $DOC_IDEA_PLUGIN"; return 1; } # Replace the line that starts with the download header; if not found, append it awk -v repl="$newline" 'BEGIN{done=0} \ /^### \[Download plugin v/ { print repl; done=1; next } \ { print } \ END { if (done==0) exit 42 }' "$DOC_IDEA_PLUGIN_BACKUP" > "$DOC_IDEA_PLUGIN" local rc=$? if [[ $rc -eq 42 ]]; then echo "WARN: download link not found in $DOC_IDEA_PLUGIN; appending generated link" echo >> "$DOC_IDEA_PLUGIN" echo "$newline" >> "$DOC_IDEA_PLUGIN" elif [[ $rc -ne 0 ]]; then echo "ERROR: failed to update $DOC_IDEA_PLUGIN; restoring original" mv -f "$DOC_IDEA_PLUGIN_BACKUP" "$DOC_IDEA_PLUGIN" 2>/dev/null return 1 fi } # default target settings case "com" in com) SSH_HOST=sergeych@lynglang.com # host to deploy to SSH_PORT=22 # ssh port on it ROOT=/bigstore/sergeych_pub/lyng # directory to rsync to ;; # com) # SSH_HOST=vvk@front-01.neurodatalab.com # ROOT=/home/vvk # ;; *) echo "*** ERROR: target not specified (use deploy com | dev)" echo "*** stop" exit 101 esac die() { echo "ERROR: $*" 1>&2 ; exit 1; } # Update the IDEA plugin download link in docs (temporarily), then build, then restore the doc updateIdeaPluginDownloadLink || echo "WARN: proceeding without updating IDEA plugin download link" ./gradlew site:clean site:jsBrowserDistribution BUILD_RC=$? # Always restore original doc if backup exists if [[ -f "$DOC_IDEA_PLUGIN_BACKUP" ]]; then mv -f "$DOC_IDEA_PLUGIN_BACKUP" "$DOC_IDEA_PLUGIN" fi if [[ $BUILD_RC -ne 0 ]]; then echo echo -- build failed. deploy aborted. echo exit 100 fi #exit 0 # Prepare working dir ssh -p ${SSH_PORT} ${SSH_HOST} " cd ${ROOT} rm -rd build 2>/dev/null if [ -d release ]; then echo copying current release cp -r release build else echo creating first release mkdir release mkdir build fi "; # sync files SRC=./site/build/dist/js/productionExecutable rsync -e "ssh -p ${SSH_PORT}" -avz -r -d --delete ${SRC}/* ${SSH_HOST}:${ROOT}/build/dist checkState #rsync -e "ssh -p ${SSH_PORT}" -avz ./static/* ${SSH_HOST}:${ROOT}/build/dist #checkState rsync -e "ssh -p ${SSH_PORT}" -avz -r -d --delete distributables/* ${SSH_HOST}:${ROOT}/build/dist/distributables checkState echo echo finalizing the deploy... ssh -p ${SSH_PORT} ${SSH_HOST} " cd ${ROOT} rm -rd release~ mv release release~ mv build release cd release # in this project we needn't restart back when we deploy the front # ~/bin/restart_service "; if [[ $? != 0 ]]; then echo echo -- finalization failed. the rease might be corrupt. rolling back is not yet implemented. echo exit 100 fi echo echo Deploy successful echo