Hi folks,
i hit a really mysterious problem.
I use GitLab’ runner with an ruby image in the yml-file.
The whole setup of the image, ssh and scripts runs wonderful.
Then a job “deploy_stage” runs three steps on the remote host.
The 1st one runns always wonderful too.
The 2nd is an easy rsync command - this one fails currently.
It seems that the job runs always the first ssh command and then stalls / times out on the 2nd or 3rd.
After the timeout there is no further error message, anywhere.
I tried even logging at the remote. There is nothing.
# define possible stages
stages:
- deploy
variables:
REMOTE_SCRIPT_PATH: "/files/scripts"
REMOTE_BACKUP_SCRIPT: "backup_typo3.bsh"
REMOTE_CLEANUP_SCRIPT: "cleanup.bsh"
REMOTE_LOG_PATH: "/files/logs"
REMOTE_DEPLOY_SCRIPT_PATH: "/files/scripts/remote-target"
REMOTE_DEPLOY_SCRIPT: "deploy.bsh"
#SSH_PRIVATE_KEY_GITLAB_CI is in Gitlab CI/CD variables
.deploy_stage_template:
before_script:
# configure SSH-keys
- . ./_gitlab-ci/Scripts/prepare-ssh-key.bsh
- prepareSshKey "$STAGE_SERVER" "$SSH_PRIVATE_KEY_GITLAB_CI"
##
## copy scripts for remote-target-server
- ssh $STAGE_SERVER_USER@$STAGE_SERVER "if [ ! -d $REMOTE_DEPLOY_SCRIPT_PATH ]; then mkdir -p $REMOTE_DEPLOY_SCRIPT_PATH; echo Created directory $REMOTE_DEPLOY_SCRIPT_PATH; fi"
- scp -r _gitlab-ci/remote-target/. $STAGE_SERVER_USER@$STAGE_SERVER:$REMOTE_DEPLOY_SCRIPT_PATH/
- ssh $STAGE_SERVER_USER@$STAGE_SERVER "chmod ug+x $REMOTE_DEPLOY_SCRIPT_PATH/*"
## add loggin directory when needed
- ssh $STAGE_SERVER_USER@$STAGE_SERVER "if [ ! -d $REMOTE_LOG_PATH ]; then mkdir -p $REMOTE_LOG_PATH; [ -d $REMOTE_LOG_PATH ] && echo Created directory $REMOTE_LOG_PATH; fi"
after_script:
# configure SSH-keys
- . ./_gitlab-ci/Scripts/prepare-ssh-key.bsh
- prepareSshKey "$STAGE_SERVER" "$SSH_PRIVATE_KEY_GITLAB_CI"
##
## cleanup remote-scripts from remote-target-server
- ssh $STAGE_SERVER_USER@$STAGE_SERVER "if [ -d $REMOTE_DEPLOY_SCRIPT_PATH ] && [ $REMOTE_DEPLOY_SCRIPT_PATH != '/' ]; then rm -rf $REMOTE_DEPLOY_SCRIPT_PATH; echo Removed directory $REMOTE_DEPLOY_SCRIPT_PATH; fi;"
deploy_stage:
# initiate before_script from deploy_stage_template
extends: .deploy_stage_template
######################################################################
#
# deploy to stage STAGE_SERVER
#
######################################################################
stage: deploy
image: ruby:2.5
only:
refs:
# - master
- /^release\/.*$/
# - feature\/ci-test
# - /^gitlab-ci-dev$/
# define which job artifacts should be available in this job
dependencies:
# - building_vbfrontend_gulp-frontend
environment:
name: $STAGE_SERVER
url: $STAGE_SERVER_URL
when: on_success
variables:
STAGE_SERVER_USER: "08154711"
STAGE_SERVER: "domain.tld"
STAGE_SERVER_URL: "https://domain.tld"
STAGE_SERVER_ROOT_PATH: "/html/my-cms"
script:
## call script showing env vars first and enforcing return code true on grep
- which bash
- chmod ug+x ./_gitlab-ci/Scripts/*
- env|grep -e '(REMOTE|SERVER)' || [ 1 -eq 1 ]
- . ./_gitlab-ci/Scripts/deploy-stages.bsh
This is the shortened yml-file.
Also, there is the part of the script, which is executed on the gitLab runner and executes command on the remote server:
## takes all deploy steps into account
## runs on gitlab-runner
## o backup remote target
## o rsync repository to remote target
## o execute deployment on remote target
## o cleanup backup dir
## make backup of target system
ssh $STAGE_SERVER_USER@$STAGE_SERVER "cd $REMOTE_SCRIPT_PATH; ./$REMOTE_BACKUP_SCRIPT"
## copy repository to remote
echo "copy relevant repository files to remote target server ($STAGE_SERVER_USER@$STAGE_SERVER:$STAGE_SERVER_ROOT_PATH)"
ssh $STAGE_SERVER_USER@$STAGE_SERVER
rsync -avz --exclude '.*' --exclude '_*' ./* $STAGE_SERVER_USER@$STAGE_SERVER:$STAGE_SERVER_ROOT_PATH
ret=$?
echo "copy of relevant repository files to remote target server ($STAGE_SERVER_USER@$STAGE_SERVER:$STAGE_SERVER_ROOT_PATH) ended with $ret"
## execute remote target deploy script
echo "executing remote deploy script (${REMOTE_DEPLOY_SCRIPT_PATH}/${REMOTE_DEPLOY_SCRIPT})"
ssh $STAGE_SERVER_USER@$STAGE_SERVER
ssh $STAGE_SERVER_USER@$STAGE_SERVER "cd $STAGE_SERVER_ROOT_PATH; pwd; ${REMOTE_DEPLOY_SCRIPT_PATH}/${REMOTE_DEPLOY_SCRIPT}"
ret=${?}
echo "remote deploy script (${REMOTE_DEPLOY_SCRIPT_PATH}/${REMOTE_DEPLOY_SCRIPT}) return code $ret"
## cleanup backup-directory: 90 days older files deleted
echo "executing remote cleanup script (${REMOTE_DEPLOY_SCRIPT_PATH}/${REMOTE_CLEANUP_SCRIPT})"
ssh $STAGE_SERVER_USER@$STAGE_SERVER
ssh $STAGE_SERVER_USER@$STAGE_SERVER "${REMOTE_DEPLOY_SCRIPT_PATH}/${REMOTE_CLEANUP_SCRIPT} -d=/files/backups -a=90"
ret=${?}
echo "remote cleanup script (${REMOTE_DEPLOY_SCRIPT_PATH}/${REMOTE_CLEANUP_SCRIPT}) return code $ret"
I really would appreciate any hints, comments or solutions for that ‘hidden’ problem / behavoir.
Many thanks,
Thomas