iT邦幫忙

2023 iThome 鐵人賽

DAY 28
0
DevOps

嘿,稍等一下!別急著開發功能,先來打造 Walking Skeleton 吧!系列 第 28

【Walking Skeleton】Day28 - 在正式環境部屬 Laravel,並且加上 CI/CD

  • 分享至 

  • xImage
  •  

安裝 PHP extensions

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 你不需要再裝一次啦

設定 Nginx

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 查看是發生什麼問題,有可能是少設定到什麼,或是沒有權限的關係


加上 Github Actions

回到開發環境,打開 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 可是出了名的難搞,就多試幾次吧,把錯誤都修正後就會成功的


上一篇
【Walking Skeleton】Day27 - Laravel 中的自動測試
下一篇
【Walking Skeleton】Day29 - 安裝與介紹 Docker
系列文
嘿,稍等一下!別急著開發功能,先來打造 Walking Skeleton 吧!34
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言