自动部署到 azure linux webapp 后获取 .sh 文件的正确方法是什么?

What is the right way to source .sh file after auto deployment to azure linux webapp?

我的 azure webapp (linux) 上有一个 laravel 应用程序。 我在部署后尝试 运行 一些 php 命令。

我正在使用本地 Git 部署到我的 azure 网络应用程序。

并且根据 this guide,我将“POST_BUILD_SCRIPT_PATH”设置为 运行 一个名为“postbuild.sh”的脚本

(请注意,我使用的是 .sh 文件,因为我在基于 Linux 的网络应用程序中。)

问题是我的 postbuild.sh 位置在“wwwroot”(我的 laravel 根应用程序所在的位置)。 但我一直收到

Could not open input file: artisan

当我尝试 运行 任何 artisan 命令时的消息

php artisan cache:clear

查找后发现脚本是从一个tmp位置执行的

我应该在正确的位置使用 sourcing 来 运行ning 脚本,但它仍然不起作用。

所以我在 'wwwroot' 中创建了另一个名为 'clearcache.sh' 的 .sh 文件,并尝试在 'postbuild.sh' 中获取它,但仍然无法正常工作。

我的postbuild.sh是

echo "Post Build .sh"
echo "Script executed from: ${PWD}"
BASEDIR=$(dirname [=12=])
echo "Script location: ${BASEDIR}"
echo "===================="
source ./home/site/wwwroot/refresh.sh

我的refresh.sh是

echo "Refresh script"
echo "Script executed from: ${PWD}"
BASEDIR=$(dirname [=13=])
echo "Script location: ${BASEDIR}"
php artisan cache:clear

我在推送到 azure repo 时遇到的错误是:

remote: Detecting platforms...
remote: Detected following platforms:
remote:   php: 7.4.24
remote:
remote: Using intermediate directory '/tmp/8d9a71074a40f5b'.
remote:
remote: Copying files to the intermediate directory...
remote: Done in 0 sec(s).
remote: /home/site/wwwroot/postbuild.sh: line 6: ./home/site/wwwroot/refresh.sh
remote:
remote: : No such file or directory
remote: Source directory     : /tmp/8d9a71074a40f5b
remote: Destination directory: /home/site/wwwroot
remote:
remote: Executing pre-build command...
remote: Pre Build
remote: Finished executing pre-build command.
remote: PHP executable: /tmp/oryx/platforms/php/7.4.24/bin/php
remote: No 'composer.json' file found; not running 'composer install'.
remote:
remote: Executing post-build command...
remote: Post Build .sh
remote: Script executed from: /tmp/8d9a71074a40f5b
remote: Script location: /home/site/wwwroot
remote:
remote: ====================

请注意以下事项:

你永远不会真正切换到 BASEDIR cd $BASEDIR 所以你的工作目录实际上永远不会改变所以这里有一个解决方法:

echo "Refresh script"
echo "Script executed from: ${PWD}"
BASEDIR=$(dirname [=10=])
echo "Script location: ${BASEDIR}"
$(
   cd $BASEDIR
   php artisan cache:clear
)

注意多行$(...)是执行内容但完成后保留原始工作目录。

或者你可以这样做:

echo "Refresh script"
echo "Script executed from: ${PWD}"
BASEDIR=$(dirname [=11=])
echo "Script location: ${BASEDIR}"
php $BASEDIR/artisan cache:clear

我使用不同的方法实现了我想要的。

我使用了自定义部署脚本。 (as per this link)

自定义部署让您完全自己处理部署过程。 所以我写了一个脚本来将文件从 repo 复制到 wwwroot。

但我遇到了另一个问题,即 php-cli,kudu 运行s 不包含我在 kudu 的仓库中发现的 this issue 任何数据库模块。

所以,我想出了 运行 我的 artisan 命令(主要是缓存刷新)的解决方案 以编程方式使用 Laravel 控制器。并卷曲 HTTP 请求以调用此 link 来执行 使用此控制器的 artisan 命令。

不是理想的解决方案。但有效

这是我的 .deployment 文件

[config]
command = ./deploy.sh

这是我的 deploy.sh

rm -rf $DEPLOYMENT_TARGET/app
rm -rf $DEPLOYMENT_TARGET/resources
rm -rf $DEPLOYMENT_TARGET/routes
rm -rf $DEPLOYMENT_TARGET/public/*.js
rm -rf $DEPLOYMENT_TARGET/public/*.svg
rm -rf $DEPLOYMENT_TARGET/public/*.eot
rm -rf $DEPLOYMENT_TARGET/public/*.css
rm -rf $DEPLOYMENT_TARGET/public/*.ico
rm -rf $DEPLOYMENT_TARGET/public/*.woff2
rm -rf $DEPLOYMENT_TARGET/public/*.woff
rm -rf $DEPLOYMENT_TARGET/public/*.ttf
\cp -RTf  $DEPLOYMENT_SOURCE $DEPLOYMENT_TARGET
rm -rf $DEPLOYMENT_SOURCE/app
rm -rf $DEPLOYMENT_SOURCE/resources
rm -rf $DEPLOYMENT_SOURCE/routes
rm -rf $DEPLOYMENT_SOURCE/public
php /home/site/wwwroot/refresh-app.php

您可以调用 link 使用 curl 或任何其他喜欢的方式刷新 refresh-app.php 中的 artisan 命令。