使用Github Actions将代码直接部署到AWS EC2实例

时间:2020-05-29 13:36:23

标签: amazon-web-services github amazon-ec2 github-actions

正如标题所述,我正在尝试使用 Github将 Laravel-Angular 应用程序直接从 Github 部署到 AWS EC2 实例动作

在我的应用程序中,需要3个 Angular 8 + 项目,这些项目需要在部署之前进行构建。不需要构建laravel。

可用的解决方案建议使用 AWS Elastic Beanstalk 部署代码。但是,如果这样做,如何将弹性beantalk附加到现有实例还不够清楚。

是否可以在不使用 Elastic Beanstalk 的情况下将代码部署到 AWS EC2

这是我的 Github操作 build.yml:

name: Build Develop Branch

on:
  push:
    branches: [ develop ]
  pull_request:
    branches: [ develop ]

jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [14.x]

    steps:
    - name: Code Checkout
      uses: actions/checkout@v2
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v1
      with:
        node-version: ${{ matrix.node-version }}
    - name: App 1 npm install
      run: npm install
      working-directory: angular-app-1
    - name: App 1 Build
      run: npm run build:staging
      working-directory: angular-app-1
    - name: App 2 npm install
      run: npm install
      working-directory: angular-app-2
    - name: App 2 Build
      run: node node_modules/@angular/cli/bin/ng build --configuration=staging
      working-directory: angular-app-2
    - name: App 3 npm install
      run: npm install
      working-directory: angular-app-3
    - name: App 3 Build
      run: node node_modules/@angular/cli/bin/ng build --configuration=staging
      working-directory: angular-app-3

3 个答案:

答案 0 :(得分:6)

开始之前:

这不是完整的答案。这不是一个完整的演练,但是有许多提示和一些代码将帮助您设置某些AWS内容(例如ALB)以及您的存储库中的文件,以使其正常工作。这个答案更像是我昨晚试图使ECS正常运行时从我的冲刺跑中获得的一些线索。

我也没有足够的观点来发表评论或聊天...这是我能提供的最好的东西。

快速链接(不过您可能应该跳过这两点):

  1. 查看以下内容:https://docs.aws.amazon.com/codedeploy/latest/userguide/instances-ec2-configure.html
  2. 我没有足够的观点要发表评论或聊天...但是,这也不是一个完整的答案,因为我正尝试先从GH完成ECS部署,然后再从GH。无论如何...
  3. 最后一次编辑:这听起来像是一种营销策略,但是位于GitHub {} {3}}上的GitHub操作和工作流_调度的正确实现。您会在下面找到相同的ECS工作。请注意,由于它是免费的,因此我将GitHub操作更改为使用Docker Hub(对于我来说,如果您打算使用ECS则更便宜,因为AWS ECR昂贵)。

编辑:ECS部署现在可以工作。即将开始进行EC2部署。

编辑2:我添加了Donate Anything回购。另外,我不确定直接EC2部署(至少对我而言)是否可行,因为安装脚本有点奇怪。但是,我仍然没有时间去EC2。同样,如果有人愿意分享自己的时间,请贡献自己的力量!

我确实想警告大家,安全小组非常重要。那阻塞了我很长一段时间,所以请确保您安装正确。 Donate Anything's GitHub repository,我教你如何做。


完整的非完整答案:

我现在正在In the ECS tutorial中处理此问题,并正在使用GitHub操作在ECS this repo中进行处理。在EC2上我还没有开始太远,但是测试的基本步骤是:

CRUCIAL

  • 您需要首先尝试从AWS CLI进行部署。这是因为AWS Actions尚没有专用于部署到EC2的操作。
  • 写下每个语句。稍后我们将需要它们来执行GitHub操作。

在测试此AWS设置时的一些提示:

  • 在使用CodeDeploy之前,您需要一个EC2实例,一个Application Load Balancer(您将在Elastic Load Balancer下找到它)和一个目标组(您在ALB设置期间创建)。转到目标组,右键单击该组,然后注册您的实例。
  • 要从CodeDeploy进行部署,请创建一个新应用程序。创建一个新的部署组。我认为,对于您的设置,您应该执行就地部署类型,而不是蓝色/绿色部署类型。
  • 最后,在CLI上进行测试,您应该运行在此处看到的代码:here

您的测试概要如下:

  • 对于我来说,对于我的ECS回购,我花了整整10个小时的时间来尝试逐步正确配置所有内容,例如GitHub动作。对于您来说,您应该这样做。假设您是代码:找出需要从哪里开始。
  • 啊哈!我可能应该先弄清楚CodeDeploy。让我们先对一个appspec.yaml文件进行纠正! appspec文件是CodeDeploy如何在所有内容的挂钩上进行工作的方式。不幸的是,我目前正在解决该问题https://docs.aws.amazon.com/codedeploy/latest/userguide/tutorials-wordpress-upload-application.html,但这是因为AppSpec文件的EC2和ECS语法不同。幸运的是,EC2没有任何特殊区域。只是使您的文件和钩子正确。我的测试示例:
version: 0.0
os: linux

files:
  - source: /
    destination: /code

hooks:
  BeforeInstall:
    - location: aws_scripts/install_dependencies
      timeout: 300
      runas: root
  ApplicationStop:
    - location: aws_scripts/start_server
      runas: root

GitHub动作:

您至少需要什么:

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        # TODO Change your AWS region here!
        aws-region: us-east-2

签出代码对于...好吧...获取代码很有必要。

对于AWS凭证的配置,您需要使用适当的IAM凭证将AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY添加到GitHub机密中。为此,我相信IAM唯一需要的角色是完整的CodeDeploy内容。

部署代码:

这是在达到此步骤之前应尝试的测试代码的时间。设置好工作流程后,让我们将CLI中的代码粘贴到您的操作中。


    - name: Deploying with CodeDeploy
      id: a-task
      env:
        an-environment-variable: anything you want
      run: |
        echo "Your CLI code should be placed here"

很抱歉,如果这令人困惑,不是您要查找的内容,或者想要完整的教程。我也没有实际使用过,但是自上次尝试以来已经有一段时间了,上次尝试时,我什至不知道什么是EC2实例...我只是做了一个独立的EC2实例并使用rsync传输我的文件。希望我写的是一些线索,可以很容易地指导您解决问题。

如果您可以使用它,请在此处共享它:here,这样就没有其他人可以承受AWS部署的痛苦了……

答案 1 :(得分:4)

<块引用>

是否可以在不使用 Elastic Beanstalk 的情况下将代码部署到 AWS EC2?

我找到了一种使用 GitHub Actions 部署到 EC2 实例(或任何通过 rsync 接受 ssh 命令的服务器)的简单方法。

我在存储库的 .github/workflows 文件夹中有一个简单的文件,每当向我的 GitHub 存储库进行推送时,GitHub Actions 就会运行该文件以部署到我的 EC2 实例.

没有麻烦,没有大惊小怪,没有特殊的咒语或拜占庭式的 AWS 配置细节。

文件.github/workflows/pushtoec2.yml

name: Push-to-EC2

on: push

jobs:
  deploy:
    name: Push to EC2 Instance
    runs-on: ubuntu-latest

    steps:
      - name: Checkout the code
        uses: actions/checkout@v1

      - name: Deploy to my EC2 instance
        uses: easingthemes/ssh-deploy@v2.1.5
        env:
          SSH_PRIVATE_KEY: ${{ secrets.EC2_SSH_KEY }}
          SOURCE: "./"
          REMOTE_HOST: "ec2-34-213-48-149.us-west-2.compute.amazonaws.com"
          REMOTE_USER: "ec2-user"
          TARGET: "/home/ec2-user/SampleExpressApp"

上面使用的 ssh deploy GitHub 操作的详细信息。

答案 2 :(得分:1)

是的,我今天能够解决这个问题。

首先,您需要在 AWS 上完成本教程以设置您的 EC2 服务器,以及在 CodeDeploy 中配置应用程序和部署组:Tutorial: Use CodeDeploy to deploy an application from GitHub

然后,您可以使用 GitHub Actions 中的以下工作流程在推送时部署您的代码。您本质上是使用 AWS CLI 创建新部署。将 CLI 的 AWS 凭证存储在 GitHub Secrets 中。

以下是部署 Node 应用的示例:

name: Deploy to AWS

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    name: Deploy AWS
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [12.x]
        app-name: ['your-codedeploy-application']
        deployment-group: ['your-codedeploy-deploy-group']
        repo: ['username/repository-name']
        
    steps:
      - uses: actions/checkout@v2
      
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node-version }}
          
      - name: Install dependencies
        run: npm install
      
      - name: Build app
        run: npm run build

      - name: Install AWS CLI 
        run: |
          curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
          unzip awscliv2.zip
          sudo ./aws/install --update
      
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-session-token: ${{ secrets.AWS_SESSION_TOKEN }}
          aws-region: us-east-1
          
      - name: Deploy to AWS
        run: |
          aws deploy create-deployment \
          --application-name ${{ matrix.app-name }} \
          --deployment-config-name CodeDeployDefault.OneAtATime \
          --deployment-group-name ${{ matrix.deployment-group }} \
          --description "GitHub Deployment for the ${{ matrix.app-name }}-${{ github.sha }}" \
          --github-location repository=${{ matrix.repo }},commitId=${{ github.sha }}