自动部署到 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: ====================
请注意以下事项:
- Laravel 根目录不包含 'index.php' 文件,但我添加了一个
虚拟 'index.php' 文件,因为 Azure 需要它来
验证构建。
- 我从本地 git 中删除了 'composer.json' 文件,因为我没有
需要 运行 作曲家安装。我只是想复制应用程序和路线
文件夹从 repo 文件夹到 'wwwroot'
你永远不会真正切换到 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 命令。
我的 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: ====================
请注意以下事项:
- Laravel 根目录不包含 'index.php' 文件,但我添加了一个 虚拟 'index.php' 文件,因为 Azure 需要它来 验证构建。
- 我从本地 git 中删除了 'composer.json' 文件,因为我没有 需要 运行 作曲家安装。我只是想复制应用程序和路线 文件夹从 repo 文件夹到 'wwwroot'
你永远不会真正切换到 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 命令。