https://laravel.com/docs/10.x/deployment#server-requirements
Laravel 會需要用到一些 PHP extensions,以下圈起來的是要另外安裝設定的,其他都是包含在 PHP 本身
因此要先在正式環境把這些東西裝一裝,不過裝之前還是老樣子先更新 Linux 套件
sudo apt update && sudo apt upgrade
安裝這四個 PHP extensions
sudo apt install php8.2-curl php8.2-fileinfo php8.2-mbstring php8.2-pdo php8.2-dom php8.2-zip
如果沒出現紅字就是安裝成功了
中間有一些小提醒,是說 php8.2-common 就包含 php8.2-fileinfo php8.2-pdo 你不需要再裝一次啦
https://laravel.com/docs/10.x/deployment#nginx
這邊的設定其實跟之前的滿像的,比較大的差異是在於會把所有路徑的請求都交給 /index.php 處理,我設定完是以下這樣,就是把 example.com 改成自己的網站,還有 php8.1-fpm 改成 php8.2-fpm,其實寫成 php-fpm 也是一樣的,加個版本方便辨識
server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name 2023ironman.net;
root /srv/2023ironman/public;
include snippets/ssl-2023ironman-net.conf;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
設定完別忘了重新載入設定檔
sudo systemctl reload nginx
老樣子要先手動 pull 一次,因為要設定一些正式環境要用到的東西
cd /srv/2023ironman && git pull
然後是安裝要用到的函式庫,不裝 dev 開發用的
composer install --optimize-autoloader --no-dev
被官網給騙到了,DOM 也是要安裝的 PHP extensions
安裝 php8.2-dom
sudo apt install php8.2-dom
再試一次
composer install --optimize-autoloader --no-dev
這次又有問題了,看起來還缺少了 zip 這個 PHP extensions
安裝 php8.2-zip
sudo apt install php8.2-zip
再試一次,我不信這次還會失敗
composer install --optimize-autoloader --no-dev
終於成功了
再來是複製和設定 .env 檔案
php -r "file_exists('.env') || copy('.env.example', '.env');"
把 APP_DEBUG 關掉(很重要,不關掉的話錯誤訊息就被大家看光光了)
,還有設定資料庫帳號密碼那些,這系列應該是講不到資料庫了,我就不設定啦
建立 APP Key
php artisan key:generate
https://laravel.com/docs/10.x/deployment#optimization
還有一些最佳化的東西要設定,我就直接全部一起上啦
chmod -R 777 storage bootstrap/cache
php artisan config:cache
php artisan event:cache
php artisan route:cache
php artisan view:cache
現在打開網站應該就有畫面啦,如果還有出現錯誤的話,可以到 /var/nginx/error.log 查看是發生什麼問題,有可能是少設定到什麼,或是沒有權限的關係
回到開發環境,打開 Laravel 專案,把之前的 tests.yml、deploy.yml 加進去
這邊我跳過了設定 Linter 的過程,因為和之前設定的方式一樣,如果不要 Linter 就把 ./vendor/bin/phpcs
這幾行拿掉就可以了
tests.yml 與之前不一樣的地方是要複製 .env 和產生 APP Key,還有自動測試換成 Laravel 的測試
.github/workflows/tests.yml
name: Tests
on:
push:
branches:
- "**"
pull_request:
branches:
- "**"
jobs:
tests:
runs-on: ubuntu-latest
steps:
- uses: shivammathur/setup-php@15c43e89cdef867065b0213be354c2841860869e
with:
php-version: "8.2"
- uses: actions/checkout@v3
- run: php -r "file_exists('.env') || copy('.env.example', '.env');"
- run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
- run: php artisan key:generate
- run: ./vendor/bin/phpcs ./config/
- run: ./vendor/bin/phpcs ./app/
- run: ./vendor/bin/phpcs ./tests/
- run: php artisan test
deploy.yml 要加上安裝 composer 函式庫,還有更新最佳化的快取
.github/workflows/deploy.yml
name: Deploy
on:
workflow_run:
workflows:
- Tests
branches:
- main
types:
- completed
jobs:
deploy:
runs-on: ubuntu-latest
steps:
# 設定私鑰,為了 SSH 連線進正式環境
- uses: webfactory/ssh-agent@v0.7.0
with:
ssh-private-key: ${{ secrets.SSH_KEY }}
# 設定 known_hosts,避免鑰確認指紋
- run: echo "${{ secrets.KNOWN_HOSTS }}" >> ~/.ssh/known_hosts
# 連線進正式環境,並且更新程式、函式庫、快取
- run: ssh ${{ secrets.USER_HOST }} '
cd /srv/2023ironman
&& git pull
&& composer install --optimize-autoloader --no-dev
&& php artisan config:cache
&& php artisan event:cache
&& php artisan route:cache
&& php artisan view:cache
'
又到了這緊張刺激、既期待又怕受到傷害的時刻,將 Github Actions 的設定 commit push 上 github
果然要一次就成功還是太勉強了呢,CI/CD 可是出了名的難搞,就多試幾次吧,把錯誤都修正後就會成功的