使用Laravel Envoy CircleCI部署到EC2


概述

我尝试使用Laravel Envoy和CircleCI部署到EC2。
https://laravel.com/docs/8.x/envoy
当合并到Github上的master分支时,应将其部署到EC2上的生产服务器上,而当合并到development分支时,应将其部署到登台服务器上。

假设

设定

  • 生产环境(生产)和登台环境(登台)作为EC2存在,并且在AWS上分配了EIP。
  • 可以从EC2拉Git
  • 在Github上拥有master和开发分支的仓库
  • 已链接,以便在推送到Github存储库时将执行CircleCI

版本

PHP:7.4.7
Laravel特使:2.3.1

步骤

Laravel Envoy设置

1
$ composer require laravel/envoy

这一次,只需如下创建Envoy.blade.php。

Envoy.blade.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@servers(['production' => '[email protected]', 'staging' => '[email protected]'])

@setup
    $docRoot = '/var/www/html';
@endsetup

@story('deploy')
    git
@endstory

@task('git', ['on' =>  $server])
    cd {{ $docRoot }}
    git pull origin {{ $branch }}
@endtask

@finished
    echo "${server}へデプロイしました!";
@endfinished

从CircleCI部署到EC2

的设置

SSH从CircleCI到EC2的设置

CircleCI项目设置页面上,转到SSH Keys>Additional SSH Keys,然后使用"添加SSH密钥"注册用于SSH连接到每个服务器的私钥。在Hostname中输入EIP,在Private Key中输入私钥。
注册时,将显示Fingerprint,请记下它。
スクリーンショット 2020-09-24 0.06.50.png
使用创建EC2时生成的密钥对不是必需的,但是当生成新密钥时,有必要如下将公钥添加到~/.ssh/authorized_keys

1
$ cat id_rsa.pub >> authorized_keys

记录环境变量

CircleCI项目设置页面上,转到Environment Variables,然后使用"添加变量"注册所需的环境变量。这次,将注册生产/登台服务器的EIP,之前创建的指纹,用户名和SSH端口号。
スクリーンショット 2020-09-24 0.09.07.png

配置设置

.circleci / config.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
version: 2
jobs:
  build:
    docker:
      - image: circleci/php:7.4-apache
      - image: circleci/postgres:11-alpine
        environment:
          POSTGRES_DB: default_test
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: postgres
    steps:
      - checkout
      ##### ??中略?? #####
      # ----------------------------------------------------------------------------
      # Deploy

      - add_ssh_keys:  
          fingerprints:  
            - "${KEY_FINGERPRINT}"
            - "${KEY_FINGERPRINT_DEV}"

      - run:  
          name: Start ssh-keyscan  
          command: ssh-keyscan -p ${SSH_PORT} ${HOST_NAME} >> ~/.ssh/known_hosts

      - run:  
          name: Start ssh-keyscan(dev)
          command: ssh-keyscan -p ${SSH_PORT} ${HOST_NAME_DEV} >> ~/.ssh/known_hosts

      - run:
          name: Deploy to EC2 server
          command: |
            if [ "${CIRCLE_BRANCH}" == "master" ]; then
              ./vendor/bin/envoy run deploy --server=production --branch=master
            elif [ "${CIRCLE_BRANCH}" == "develop" ]; then
              ./vendor/bin/envoy run deploy --server=staging --branch=develop
            fi

操作检查

Push

到既不是主控也不是开发的分支

部署已完成,没有执行。
スクリーンショット 2020-09-24 0.42.53.png

并入开发

拉显影分支。
スクリーンショット 2020-09-24 0.47.01.png

并入母版

拉主分支。
スクリーンショット 2020-09-24 0.50.02.png

印象数

我认为无关的分支中包含不必要的处理是不好的。
如果有更好的方法,请告诉我。

看到

  • 在AES EC2上使用ssh成功进行git克隆的步骤
  • 指定要与Laravel Envoy一起部署并部署的服务器
  • CircleCI 2.0私人最佳实践