BitBucket Pipelines не выполняет весь сценарий оболочки, даже если он работает, когда выполняется непосредственно на сервере - PullRequest
0 голосов
/ 30 марта 2019

У меня есть небольшой сценарий оболочки для развертывания, который я использую в своем конвейере битбакетов.

Я успешно проверил, что конвейер bitbucket выполняет сценарий на моем сервере с этим шагом (я попробовал его, написав однострочный сценарий, который просто вставляет файл на сервер -> он был создан правильно после запуска канала):

  - step:
     name: Deploy dev 
     trigger: manual
     script:
      - cat ./deploy.sh | ssh -T user@[myIp]

Когда я выполняю свой скрипт deploy прямо на сервере после входа в систему через ssh, он прекрасно работает. Но когда BitBucket Pipeline выполняет его, последние четыре команды по какой-то причине пропускаются.

Это файл deploy.sh:

#!/bin/bash
env="dev"
if [ $# -gt 0 ]; then
  env=$1
fi

basePath="/path/to/my/project/${env}"

echo "---------------------------------------- | DEPLOYING TO ${env}"
cd ${basePath}
git stash
git pull

echo "---------------------------------------- | BUILD ANGULAR"
cd ${basePath}/Web/project
ng build

echo "---------------------------------------- | BUILD API"
cd ${basePath}/API
./gradlew build

echo "---------------------------------------- | KILL API"
sh ${basePath}/killAllServers.sh
mv ${basePath}/killAllServers.sh ${basePath}/log/archive/`date +%Y-%m-%d-%H:%M:%S`-killed.log

echo "---------------------------------------- | CLEAR LOGS"
mv ${basePath}/log/java-spring.log ${basePath}/log/archive/`date +%Y-%m-%d-%H:%M:%S`-spring.log

echo "---------------------------------------- | STARTING API"
java -jar ${basePath}/path/to/my/build.jar --spring.profiles.active=dev >> ${basePath}/log/java-spring.log  & echo "kill $!  #started on `date +%Y-%m-%d-%H:%M:%S`" >> ${basePath}/killAllServers.sh

Теперь, когда я выполняю его на своем сервере, я получаю следующий вывод (я выдал некоторые выходные данные из angular и gradle, чтобы сделать его более читабельным):

user@[myIp]:/path/to/my/project$ sh deploy.sh
---------------------------------------- | DEPLOYING TO dev
Saved working directory and index state ... /**Git output**/
---------------------------------------- | BUILD ANGULAR
Your global Angular CLI version /**Angular Output**/
---------------------------------------- | BUILD API

BUILD SUCCESSFUL in 6s
3 actionable tasks: 3 up-to-date
---------------------------------------- | KILL API
---------------------------------------- | CLEAR LOGS
---------------------------------------- | STARTING API

Когда я выполняю его через конвейер BitBucket, я получаю следующий вывод:

+ cat ./deploy.sh | ssh -T user@[myIp]
Welcome to Ubuntu /** Ubuntu Output**/
---------------------------------------- | DEPLOYING TO dev
Saved working directory and index state /** Git output**/
---------------------------------------- | BUILD ANGULAR
Your global Angular CLI version /** Angular Output**/
---------------------------------------- | BUILD API
> Task :compileJava UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE
> Task :bootJar UP-TO-DATE
> Task :jar SKIPPED
> Task :assemble UP-TO-DATE
> Task :compileTestJava NO-SOURCE
> Task :processTestResources NO-SOURCE
> Task :testClasses UP-TO-DATE
> Task :test NO-SOURCE
> Task :check UP-TO-DATE
> Task :build UP-TO-DATE
BUILD SUCCESSFUL in 5s
3 actionable tasks: 3 up-to-date

Я понятия не имею, почему сценарий не выполняет остальные команды также при выполнении через конвейер.

1 Ответ

0 голосов
/ 30 марта 2019

Я нашел решение:

Проблема заключается в том, что сборка gradle посылает команду выхода после завершения. Это не вызывает проблем, когда скрипт, который вызывал сборку gradle, вызывался напрямую. Вот почему он работал, когда я выполнял его прямо на сервере.

Но когда он вызывался с конвейером, скрипт также останавливается. Обходной путь, который я нашел, состоял в том, что можно создать другой сценарий с именем onlyGradle.sh, который содержит только команду сборки ./gradlew и вызывается с помощью sh onlyGradle.sh в моем deploy.sh. Затем deploy.sh продолжает работать после gradle построить -> даже в битбакете

...