有使用个人开发中引入Docker和Github Action的经验

首先

我是外国开发者Kim Hye In。目前在日本作为开发者工作。最近我在进行各种个人项目,今天我想回顾一下我在其中引入Docker和Github Action的经验,并发布了这篇文章。

如果你对Docker和Github Action不了解,我认为下面的网址会很有参考价值。

 

介绍一个简单的项目

这个项目简单说就是为个人设计的博客。
技术要求包括:Next.js、Nest.js、AWS EC2、AWS Route53、styled-components、Mongo DB、Pm2、Nginx。

项目发布

这个网站并不是很复杂,所以我们在一个月内完成了企划、设计和实施。我想提前发布结果物,以表达制作它的喜悦。

在这个时候,我犹豫是否要使用Docker,但因为使用Docker会增加一些工作量,所以我决定使用Pm2。我将GitHub的代码迁移到EC2上进行构建,然后使用Pm2和Nginx进行发布。

structure.png

问题出现

在大约两周后更改前端代码时,在使用Git获取代码并进行构建时,突然发生了EC2停止运行的情况。原因是内存容量过小。由于使用了小型EC2实例,无法选择更大内存容量的实例。因此,我们重新启动了EC2,并通过使用内存交换的方式在构建过程中临时增加了容量来解决了问题。

然后几周后,我们再次更改了前端代码,并在EC2上进行了构建。然后,出现了停止的问题。像之前一样,我们重新启动了EC2并重新连接,EC2恢复正常了。但是,Pm2和Nginx出现了问题。我们花了一周的时间去找原因,但是没有找到。最终,我们决定创建一个新的EC2并进行迁移。从开始搭建环境到现在,真的花了很多时间。

我意识到当问题不断发生的时候,直到天亮才找出原因并解决后,下班后的休息时间逐渐减少,这说明有什么严重的错误存在。

所付出的努力 chū de

我很希望能够尽快解决问题,以便能够有更多的休息时间。因此,我对目前的情况进行了分析。结果显示,问题主要有两个原因。

    我经常忘记手动交换内存进行构建,但如果需要迁移服务器,那将会非常困难。

为了解决这个问题,我认为需要实施自动化的CI/CD流水线和Docker。考虑到Nest.js几乎没有经过修复,因此我认为可以不立即引入Docker也没有问题,所以我决定将Docker引入到Next.js、Nginx和MongoDB。

以下是 Github Action 的流程配置。

    1. 将Next.js项目转换为Docker镜像

 

    1. 将镜像推送到Docker hub

 

    1. 在Ec2服务器上进行Docker hub身份验证,并接收推送的镜像

 

    使用Shell脚本进行Compose部署
name: deploy

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    env : 
      VERSION : 1.1
      AWS_REGION : ap-northeast-1
      EC2_IP_ADDRESS : ${{ secrets.AWS_EC2_IP }}

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

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1

      - name: Login to Docker Hub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_TOKEN }}

      - name: Generate Environment Variables File for Production
        run: |
          echo "NEXT_PUBLIC_EMAIL_ID=$NEXT_PUBLIC_EMAIL_ID" >> .env
          echo "NEXT_PUBLIC_EMAIL_PUBLIC_KEY=$NEXT_PUBLIC_EMAIL_PUBLIC_KEY" >> .env
          echo "NEXT_PUBLIC_EMAIL_TEMPLATE_ID=$NEXT_PUBLIC_EMAIL_TEMPLATE_ID" >> .env
          echo "NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL" >> .env
        env:
          NEXT_PUBLIC_EMAIL_ID: ${{ secrets.NEXT_PUBLIC_EMAIL_ID }}
          NEXT_PUBLIC_EMAIL_PUBLIC_KEY: ${{ secrets.NEXT_PUBLIC_EMAIL_PUBLIC_KEY }}
          NEXT_PUBLIC_EMAIL_TEMPLATE_ID: ${{ secrets.NEXT_PUBLIC_EMAIL_TEMPLATE_ID }}
          NEXT_PUBLIC_API_URL: ${{ secrets.NEXT_PUBLIC_API_URL }} 

      - name: Build and push production
        uses: docker/build-push-action@v2
        with:
          context: .
          file: ${{ secrets.DOCKERFILE_PATH }}
          push: true
          tags: ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_APP_NAME }}:latest,${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_APP_NAME }}:${{ env.VERSION }}
          platforms: ${{ secrets.DOCKER_PLATFORMS }}

      - 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-region: ${{ env.AWS_REGION }}

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1

      - name: Deploy on EC2 instance
        uses: appleboy/ssh-action@v0.1.6

        env :
          DOCKER_REGISTRY: ${{ secrets.DOCKER_USERNAME }}
          DOCKER_IMAGE_TAG: latest
          DOCKER_APP_NAME: ${{ secrets.DOCKER_APP_NAME }}

        with:
          host: ${{ env.EC2_IP_ADDRESS }}
          username: ubuntu
          key: ${{ secrets.EC2_SSH_PRIVATE_KEY }}
          script: |
            cd ${{ secrets.DEPLOY_PATH }}
            sudo ./deploy.sh

我第一次接触GitHub Action时感到有些陌生,但是在文档的指导下,我很快就熟悉了起来。

因此,不需要在EC2上进行构建,也不需要交换内存。只需从Docker hub接收并使用图像,即使迁移服务器也可以顺利进行。现在我们计划使用Docker来运行Nest.js。

Frame 34 1.png

我感受到的事情 (Wǒ de

每次在开发过程中,我都会想着「这种程度应该没问题吧」,但后来总是会出现问题。通过这次的经历,我意识到绝对不能忽视可能出现问题的地方。同时,我也学到了CI/CD的重要性。作为一名工程师,我希望在CI/CD的建设方面能够不断成长。谢谢阅读。

bannerAds