【问题标题】:BitBucket Pipelines doesn't execute whole shell script even though it works when executed directly on serverBitBucket Pipelines 不会执行整个 shell 脚本,即使它直接在服务器上执行时也可以工作
【发布时间】:2021-11-04 21:59:42
【问题描述】:

我有一个用于部署的小型 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=$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 Pipeline 执行它时,这是我得到的输出:

+ 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

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

【问题讨论】:

  • 我不知道gradlew,但我在一些与工作控制相关的问题中偶然发现了它。所以很可能您的问题主要出在gradlew 本身(而不是“bitbucket”或“部署”。)
  • 感谢提示,我更新了标签
  • 这似乎与这个问题中的问题相同:stackoverflow.com/questions/40972099/… 显然 gradle 发送了一个退出命令,如果它是用管道执行的则关闭脚本

标签: bash gradle deployment build gradlew


【解决方案1】:

我找到了解决办法:

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

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

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 2021-08-23
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    相关资源
    最近更新 更多