Laravel 离线环境下与Gitlab-runner的持续集成(CentOS 7)
Laravel Continuous Integration with Gitlab-runner in offline environment (CentOS 7)
我正在完全离线的环境中开发网站。另外,我使用 gitlab runner 作为 CI 并且主机是 CentOS 7.
问题是 gitlab runner 在 centos 上使用 gitlab-runner
用户部署 laravel 应用程序,apache 使用 apache
用户部署 运行 laravel。
我在 apache 上遇到 Permission denied
错误,直到我更改了文件的所有权。之后我在 apache 日志中收到此错误:
Uncaught UnexpectedValueException: The stream or file "storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied
似乎像 monolog
这样的一些供应商库想要将错误或调试日志写入 storage/logs/laravel.log
但它被拒绝了。 :(
.gitlab-ci.yml
stages:
- build
- test
- deploy
buildBash:
stage: build
script:
- bash build.sh
testBash:
stage: test
script:
- bash test.sh
deployBash:
stage: deploy
script:
- sudo bash deploy.sh
build.sh
#!/bin/bash
set -xe
# creating env file from production file
cp .env.production .env
# initializing laravel
php artisan key:generate
php artisan config:cache
# database migration
php artisan migrate --force
deploy.sh
#!/bin/bash
PWD=$(pwd)'/public'
STG=$(pwd)'/storage'
ln -s $PWD /var/www/html/public
chown apache.apache -R /var/www/html/public
chmod -R 755 /var/www/html/public
chmod -R 775 $STG
我使用的 gitlab runner 正确吗?我该如何修复权限被拒绝的错误?
SELinux
我发现问题是 selinux,一如既往是 selinux,一开始我忽略了它
有什么问题:
你可以使用ls -lZ
命令查看文件的selinux 上下文,默认情况下www 上的所有文件都是httpd_sys_content_t
,问题是selinux 只允许apache 读取这些文件。您应该更改 storage
和 bootstrap/cache
上下文,以便它可以写入。
有 4 种 apache 上下文类型:
- httpd_sys_content_t: 只读目录和文件
- httpd_sys_rw_content_t:Apache
使用的可读写目录和文件
- httpd_log_t:Apache 用于日志文件和目录
- httpd_cache_t:Apache 用于缓存文件和目录
要做什么:
首先安装 policycoreutils-python
以获得更好的命令
yum install -y policycoreutils-python
安装 policycoreutils-python
后,semanage
命令可用,因此您可以像这样更改文件上下文:
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/laravel/storage(/.*)?"
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/laravel/bootstrap/cache(/.*)?"
不要忘记通过此命令提交更改:
restorecon -Rv /var/www/html/laravel/storage
restorecon -Rv /var/www/html/laravel/bootstrap/cache
问题解决:)
我正在完全离线的环境中开发网站。另外,我使用 gitlab runner 作为 CI 并且主机是 CentOS 7.
问题是 gitlab runner 在 centos 上使用 gitlab-runner
用户部署 laravel 应用程序,apache 使用 apache
用户部署 运行 laravel。
我在 apache 上遇到 Permission denied
错误,直到我更改了文件的所有权。之后我在 apache 日志中收到此错误:
Uncaught UnexpectedValueException: The stream or file "storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied
似乎像 monolog
这样的一些供应商库想要将错误或调试日志写入 storage/logs/laravel.log
但它被拒绝了。 :(
.gitlab-ci.yml
stages:
- build
- test
- deploy
buildBash:
stage: build
script:
- bash build.sh
testBash:
stage: test
script:
- bash test.sh
deployBash:
stage: deploy
script:
- sudo bash deploy.sh
build.sh
#!/bin/bash
set -xe
# creating env file from production file
cp .env.production .env
# initializing laravel
php artisan key:generate
php artisan config:cache
# database migration
php artisan migrate --force
deploy.sh
#!/bin/bash
PWD=$(pwd)'/public'
STG=$(pwd)'/storage'
ln -s $PWD /var/www/html/public
chown apache.apache -R /var/www/html/public
chmod -R 755 /var/www/html/public
chmod -R 775 $STG
我使用的 gitlab runner 正确吗?我该如何修复权限被拒绝的错误?
SELinux
我发现问题是 selinux,一如既往是 selinux,一开始我忽略了它
有什么问题:
你可以使用ls -lZ
命令查看文件的selinux 上下文,默认情况下www 上的所有文件都是httpd_sys_content_t
,问题是selinux 只允许apache 读取这些文件。您应该更改 storage
和 bootstrap/cache
上下文,以便它可以写入。
有 4 种 apache 上下文类型:
- httpd_sys_content_t: 只读目录和文件
- httpd_sys_rw_content_t:Apache 使用的可读写目录和文件
- httpd_log_t:Apache 用于日志文件和目录
- httpd_cache_t:Apache 用于缓存文件和目录
要做什么:
首先安装 policycoreutils-python
以获得更好的命令
yum install -y policycoreutils-python
安装 policycoreutils-python
后,semanage
命令可用,因此您可以像这样更改文件上下文:
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/laravel/storage(/.*)?"
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/laravel/bootstrap/cache(/.*)?"
不要忘记通过此命令提交更改:
restorecon -Rv /var/www/html/laravel/storage
restorecon -Rv /var/www/html/laravel/bootstrap/cache
问题解决:)