使用 Github Actions 实现 Laravel 项目的持续集成和持续部署 (CI/CD)

2024-06-14 渥太华微生活

1_5s9L2WpBfu8KkKiqGznXhg.jpg


什么是 CI?

CI (Continuous Integration) 表示持续集成。它是一种将软件开发更新 (software development updates) 与代码库 (codebase) 持续集成的自动化方法。它自动化源代码的构建、代码检查和测试 (building, linting, and testing) 以确保其有效性。

使用 CI,开发团队可以更快、更有效地发现错误和安全问题。在早期阶段修复错误更容易、更便宜。

持续集成高度重视测试自动化,以确保在合并新提交时应用程序能够按预期工作。


什么是 CD?

CD (Continuous Delivery/Deployment) 代表持续交付/部署。这是一种将软件部署到不同环境(如开发、准备和生产)的自动化方法。

通过持续部署,部署新软件版本的所有步骤(如从源代码控制中提取新代码库版本、linting、测试、构建、安装依赖项、运行数据库迁移等)都完全自动化。

持续部署可能还涉及基础设施配置和环境设置与配置的自动化。

使部署过程一致、强大且轻松,开发团队可以频繁部署更新,这可能是确保有效开发软件产品的最重要因素。


什么是 CI/CD 管道 (CI/CD Pipeline)?

要为您的项目实现持续集成和持续部署,您需要设置管道。简单来说,管道由两个主要部分组成:触发事件和触发事件发生后执行的一系列操作。

触发器可以是任何事件,例如发出拉取请求、将一个分支合并到另一个分支、创建新分支或将提交推送到存储库。如果需要,您还可以定义自定义触发器端点。

您已经可以看到在这些类型的触发事件之后执行特定的操作序列如何有所帮助。例如,您可能需要运行测试套件、linter、构建过程、部署过程、发送成功或失败通知等。一旦实施 CI 和 CD 管道,您就可以完全自动化所有这些。

Github Actions 为 git 存储库触发器提供支持,可以使用 YML 文件进行配置,您可以在其中定义触发事件并以声明方式描述管道操作。

CI/CD 工具提供了选择管道将在其中运行的环境的选项。例如,您可以选择 Ubuntu 服务器,管道将在 Ubuntu 环境中执行。这意味着您的管道可以执行 Ubuntu shell 命令,例如“docker build -t test-tag .”来构建 docker 映像和“docker push”将其推送到 Docker 注册表。

使用 Ubuntu 服务器,您可以做更多的事情。除了构建和测试代码之外,您还可以使用 AWS CLI 与 AWS 通信以进行资源配置和配置。因此,有了合适的触发事件和环境,您可以自动执行使用管道手动执行的任何操作。

现在让我们看看如何使用 Github Actions 为你的 Laravel 项目设置一个简单的持续集成持续部署管道。

CICD_CICD.png


1、创建Laravel项目:

composer create-project laravel/laravel laravel-github-actions

2、创建代码仓库

Github账户中创建代码仓库 laravel-github-actions:

2024-06-14_094437.jpg


3、推送本地项目代码至代码仓库

参考文章:

Git 版本控制工具的详细介绍

# 初始化,创建本地.git仓库
git init
# 将文件添加到本地.git仓库
git add .
# 提交更改(带有合适的提交信息)
git commit -m 'My first commit'
# 添加要推送项目的远程原点
git remote add origin https://github.com/[Your-Github-ID]/laravel-github-actions.git
# 推送到github
git push -u origin master

4、设置Github Actions

1)导航到您的 git repository,并打开Actions选项卡:

2024-06-14_111011.jpg

2)在选项卡下,您将找到“持续集成工作流” (Continous integration),在该列表中,您可以找到多个随时可用的 CI 流程。

2024-06-14_111059.jpg

3)点击“View All”,并搜索“laravel”。

2024-06-14_111558.jpg

4)单击“Configure”按钮,将打开一个包含可编辑 laravel.yml 文件的新页面,如下所示:

2024-06-16_101453.jpg

5)目前,不要对文件进行任何更改,我们稍后会对其进行编辑。只需单击屏幕右上角的绿色“开始提交”即可。然后将打开一个下拉菜单,选择直接提交到主选项,然后单击提交按钮。


5、拉取 laravel.yml 到本地

本地计算机的终端中,运行 git pull 以获取本地分支中 laravel.yml 的更改。

git pull

6、测试 (Testing)

对于 PHPUnit 测试用例,我们不需要添加任何包。Laravel 附带预安装的 PHPUnit 包。在 laravel.yml 文件中也有相关测试命令,如下:

// .github/workflows/laravel.yml

name: Laravel

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

jobs:
  laravel-tests:

    runs-on: ubuntu-latest

    steps:
    - uses: shivammathur/setup-php@15c43e89cdef867065b0213be354c2841860869e
      with:
        php-version: '8.2'
    - uses: actions/checkout@v4
    - name: Copy .env
      run: php -r "file_exists('.env') || copy('.env.example', '.env');"
    - name: Install Dependencies
      run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
    - name: Generate key
      run: php artisan key:generate
    - name: Directory Permissions
      run: chmod -R 777 storage bootstrap/cache
    - name: Create Database
      run: |
        mkdir -p database
        touch database/database.sqlite
    - name: Execute tests (Unit and Feature tests) via PHPUnit/Pest
      env:
        DB_CONNECTION: sqlite
        DB_DATABASE: database/database.sqlite
      run: php artisan test

启动了一个名为 laravel-tests 的job,该job会启动一个在 Ubuntu 上运行的新服务器(由 GitHub 提供)。

job中的每个步骤都开始运行。第一步是检测指定分支(在本例中为 `master`),然后转到 Laravel 特定任务,例如复制 .env 文件、安装 PHP 依赖项、生成应用程序密钥、授予必要目录的权限以及创建数据库(在本例中为 SQLite)。

最后,它使用 PHPUnit 运行测试(单元和功能)。

job成功运行后如下图:

2024-06-16_103400.jpg


7、构建 (Building)

继续在应用程序中构建assets compilation。为此,我们将创建一个新job,称为 build。

在 `laravel-tests` job的最后一步之后(仍在jobs下),在 .github/workflows/laravel.yml 中添加以下代码:

// .github/workflows/laravel.yml

name: Laravel

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

jobs:
  // 此处省略laravel-tests job

  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Setup Node.js
      uses: actions/setup-node@v2-beta
      with:
        node-version: '20'
        check-latest: true
    - name: Install NPM dependencies
      run: npm install
    - name: Compile assets for production
      run: npm run build

成功运行后结果如下图:

2024-06-16_104918.jpg


8部署 (Deploying)

1)设置远程服务器并获取认证信息:

获取认证信息:

# 生成新密钥(对于提示问题均按enter键,采用默认值):
ssh-keygen
# 授权通过密钥来连接服务器
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 私钥:用于Github Secrets设置
cat ~/.ssh/id_rsa
# 主机IP:用于Github Secrets设置
hostname -I
# 用户名:用于Github Secrets设置
whoami

clone 项目并设置项目文件夹:

# Git clone 项目
sudo git clone https://github.com/[Your-Github-ID]/laravel-github-actions.git
# 创建文件夹并修改权限:
sudo chown [username]:[group] laravel-github-actions/

2)设置Github代码库的Secrets:

Settings --> Secrets and Variables --> Actions:

2024-06-16_114347.jpg

创建新的repository secret (SSH_KEY, SSH_HOST, SSH_USERNAME):

2024-06-16_114832.jpg

3)添加 deploy job

添加一个名为 deploy 的新job,在 .github/workflows/laravel.yml 文件内末尾添加以下代码:

// .github/workflows/laravel.yml
name: Laravel

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

jobs:
  # 此处省略laravel-tests job and build job
  deploy:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Deployment
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.SSH_HOST }}
        key: ${{ secrets.SSH_KEY }}
        username: ${{ secrets.SSH_USERNAME }}
        script: |
          cd /var/www/html/laravel-github-actions/
          git checkout -f
          git pull

要执行远程 SSH 命令,我们使用 appleboy/ssh-action,然后指定主机详细信息。

连接到服务器后,添加一些要运行的脚本。

首先,进入 /var/www/html 文件夹,应用程序从该文件夹提供服务。然后运行 checkout 和 git pull。

如果您看到类似于下面的图像,则您的自动部署成功:

2024-06-16_130240.jpg


结论:

现在我们使用 Github Actions 成功实现了 Laravel 项目的持续集成和持续部署 (CI/CD)。

完整的 .github/workflows/laravel.yml 文件如下:

name: Laravel

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

jobs:
  # Tesing Job
  laravel-tests:
    runs-on: ubuntu-latest

    steps:
    - uses: shivammathur/setup-php@15c43e89cdef867065b0213be354c2841860869e
      with:
        php-version: '8.2'
    - uses: actions/checkout@v4
    - name: Copy .env
      run: php -r "file_exists('.env') || copy('.env.example', '.env');"
    - name: Install Dependencies
      run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
    - name: Generate key
      run: php artisan key:generate
    - name: Directory Permissions
      run: chmod -R 777 storage bootstrap/cache
    - name: Create Database
      run: |
        mkdir -p database
        touch database/database.sqlite
    - name: Execute tests (Unit and Feature tests) via PHPUnit/Pest
      env:
        DB_CONNECTION: sqlite
        DB_DATABASE: database/database.sqlite
      run: php artisan test

  # Building Job
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Setup Node.js
      uses: actions/setup-node@v2-beta
      with:
        node-version: '20'
        check-latest: true
    - name: Install NPM dependencies
      run: npm install
    - name: Compile assets for production
      run: npm run build
 
  # Deployment Job
  deploy:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Deployment
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.SSH_HOST }}
        key: ${{ secrets.SSH_KEY }}
        username: ${{ secrets.SSH_USERNAME }}
        script: |
          cd /var/www/html/laravel-github-actions/
          git checkout -f
          git pull
二维码 | 渥太华微生活

编者注:新闻取自各大新闻媒体,新闻内容并不代表本网立场!文字和图片来自网络,版权归原作者所有。如有侵权,请速联系小编,立即删除。

619
全部评论 (0)
展开快速发表评论

科技专栏

缩略图 | axios 介绍和使用

axios 介绍和使用

2024-06-04 234