BitBucket Pipelines 不会执行整个 shell 脚本,即使它直接在服务器上执行时也能正常工作

BitBucket Pipelines doesn't execute whole shell script even though it works when executed directly on server

我有一个用于部署的小 shell 脚本,我在我的 bitbucket 管道中使用它。

我通过这一步成功地测试了 bitbucket 管道在我的服务器上执行脚本(我通过编写一个单行脚本来尝试它,它只在服务器上插入一个文件 - >它是在管道之后正确创建的运行):

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

当我通过 ssh 登录后直接在服务器上执行我的部署脚本时,效果很好。但是当BitBucket Pipeline执行的时候,最后四个命令因为某些原因被跳过了。

这是 deploy.sh 文件:

#!/bin/bash
env="dev"
if [ $# -gt 0 ]; then
  env=
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

我不知道为什么脚本在通过管道执行时不执行其余命令。

我找到了解决方案:

问题似乎是gradle构建完成后发送了退出命令。当直接调用调用 gradle build 的脚本时,这不会导致问题。这就是为什么当我直接在服务器上执行它时它起作用的原因。

但是当使用管道调用时,脚本也会停止。 我发现的解决方法是可以创建另一个名为 onlyGradle.sh 的脚本,该脚本仅包含 ./gradlew build 命令并在我的 [=18= 中使用 sh onlyGradle.sh 调用] 然后 deploy.sh 在 gradle 构建之后继续 运行 -> 即使在 bitbucket