티스토리 뷰

devops

github action으로 ec2에 자동배포하기1

안양사람 2021. 10. 18. 17:37
728x90
SMALL

우아한테크캠프 마지막 프로젝트 때 나는 자동배포부분을 맡지 않아서 꼭 혼자서 다시 해보고 싶었다. 그리고 삽집도 많이했는데 다시 삽질하지 않겠다는 의지(?)를 갖고 블로그에 글을 정리한다.

 

GitHub Actions이란

GitHub Actions를 사용하면 이제 세계적 수준의 CI/CD로 모든 소프트웨어 워크플로를 쉽게 자동화할 수 있습니다. GitHub에서 바로 코드를 빌드, 테스트 및 배포하세요. 코드 검토, 분기 관리 및 문제 분류가 원하는 방식으로 작동하도록 합니다. -- by 공식문서  https://github.com/features/actions

쉽게 말해서 워크플로우를 자동화 시켜주는 도구다. 자동배포, 린트체크, 자동화 스크립트 처리 등을 할 수 있다. 가장 기본적인 방법은 크론탭을 이용한 방법이다. 예전에는 그렇게 했지만 지금은 깃헙 액션을 많이 이용한다. 크론탭 기능을 깃헙 액션으로 적용할 수도 있다.

-- 크론탭을 이용한 자동배포 https://ms3864.tistory.com/376

 

리눅스(우분투) 자동 배포하기(aws ec2)

 리눅스에서는 원하는 시간마다 특정 명령어를 실행할 수 있게 해주는 크론탭이라는게 존재한다. 이를 이용해서 git에서 pull을 받아오고 만약 받아왔다면 자동으로 받아오고 배포를 할 수 있다.

ms3864.tistory.com

 

참고 용어

CI/CD

  • CI
    • Continuous Integration
    • 테스트와 빌드를 자동으로 진행하는 프로세스
  • CD
    • Continuous Deploy, Continuous Delivery
    • 배포 자동화

 

Github Actions 개념

Workflows

  • 최상위 개념
  • 하나 이상의 job으로 구성되고, event에 의해 예약되거나 트리거 될 수 있는 자동화된 프로세스 -- ex) 빌드, 테스트, 패키지, 릴리스 또는 배포
  • yaml으로 작성되고, .github/workflows 폴더아래에 저장

Events

  • workflow를 트리거하는 특정 활동
  • ex) 특정 브랜치 push, pr, cron

Jobs

  • 동일한 runner에서 실행되는 일련의 단계
  • 기본적으로 여러 job이 있는 workflow는 병렬로 실행(순차적으로도 가능)

Steps

  • job에서 명령을 실행할 수 있는 개별 작업

Actions

  • job을 생성하는 단계로 결합되는 독립 실행형 명령
  • workflow의 가장 작은 이식 가능한 구성 요소
  • github 커뮤니티에서 만든 작업 사용가능

Runners

  • GitHub Actions 러너 애플리케이션이 설치된 서버
  • GitHub에서 호스팅하는 러너를 사용하거나 직접 호스팅할 수 있습니다. 러너는 사용 가능한 작업을 수신 대기하고 한 번에 하나의 작업을 실행하고 진행 상황, 로그 및 결과를 다시 GitHub에 보고합니다. GitHub 호스팅 러너는 Ubuntu Linux, Microsoft Windows 및 macOS를 기반으로 하며 워크플로의 각 작업은 새로운 가상 환경에서 실행됩니다. GitHub 호스팅 러너에 대한 자세한 내용은 " GitHub 호스팅 러너 정보 ."를 참조하십시오 . 다른 운영 체제가 필요하거나 특정 하드웨어 구성이 필요한 경우 자체 러너를 호스팅할 수 있습니다. 자체 호스팅 러너에 대한 정보는 " 자신의 러너 호스팅 "을 참조하십시오 .

Github Actions workflow 명령어

먼저 기본 명령어에 대해서 알아야한다.

name: learn-github-actions

GitHub 리포지토리의 작업 탭에 표시될 워크플로의 이름(선택)

on: [push]

워크플로 파일을 자동으로 트리거하는 이벤트를 지정 (ex) push, pull_request)

jobs:

모든 작업을 함께 그룹화

check-bats-version:

섹션 check-bats-version내에 저장된 작업 의 이름을 정의

runs-on: ubuntu-latest

작업이 GitHub에서 호스팅하는 새로운 가상 머신에서 실행됨을 의미

steps:

check-bats-version작업 에서 실행되는 모든 단계를 함께 그룹화 . 이 섹션 아래에 중첩된 각 항목은 별도의 작업 또는 셸 명령입니다.

- uses: actions/checkout@v2

리포지토리를 체크아웃하고 이를 러너에 다운로드하여 코드에 대해 작업(예: 테스트 도구)을 실행할 수 있도록 하는 작업

워크플로가 리포지토리의 코드에 대해 실행되거나 리포지토리에 정의된 작업을 사용할 때마다 체크아웃 작업을 사용해야함

- uses: actions/setup-node@v2 with: node-version: '14'

실행기에 지정된 버전의 소프트웨어 패키지 를 설치 하는 작업을 사용 하여 명령에 액세스

- run: npm install -g bats

run키워드는 job에서 명령을 실행하는 작업을 알려준다.

- run: bats -v

마지막으로 bats소프트웨어 버전을 출력하는 매개변수를 사용 하여 명령을 실행

 

Github Actions workflow 생성

생성하는 방법은 어렵지 않다. .github/workflows/~~.yml으로 생성해도 되고 github에서 직접 만들수도 있다. 깃허브 레포에 들어가서 actions를 누르고  set up a workflow yourself 를 누르면 기본 코드가 작성이 되어있다.

일단 내 코드로 설명하겠다.

 

전체 코드

deploy.yml

# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions

name: deploy

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-20.04

    strategy:
      matrix:
        node-version: [14.x]
        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/

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

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node-version }}

      - name: create env file
        working-directory: ./server
        run: |
          touch .env
          cat << EOF >> .env
          ${{ secrets.ENV }}

      - name: build client files
        working-directory: ./client
        run: |
          yarn install --frozen-lockfile
          yarn build

      - name: zip distributions
        run: zip -r blog-vanilla.zip ./client/dist ./server ./appspec.yml ./scripts

      - name: AWS configure 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: ap-northeast-2

      - name: upload to S3
        run: aws s3 cp --region ap-northeast-2 ./blog-vanilla.zip s3://blog-vanilla-bucket/public/

      - name: deploy with AWS codeDeploy
        run: aws deploy create-deployment
          --application-name blog-vanilla-codedeploy
          --deployment-config-name CodeDeployDefault.OneAtATime
          --deployment-group-name deploy-group
          --s3-location bucket=blog-vanilla-bucket,bundleType=zip,key=public/blog-vanilla.zip

 

 

name: deploy

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

name을 deploy로 정하고 main 브랜치에 push, pr이 되었을 때 워크플로우를 트리거시킨다. 프로젝트를 하다보면 지금 환경에서 잘 실행되서 배포를 하면 문제가 항상 생긴다. 그럴때 main에 pr한상태로 그냥 커밋만 해주면 자동배포가 되고 바로바로 확인할 수 있다.

참고로 on이 위에서 설명한 event의 역할을 한다.

 

jobs:
  build:
    runs-on: ubuntu-20.04

    strategy:
      matrix:
        node-version: [14.x]
        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/

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

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node-version }}

위에서 용어를 설명했기 때문에 넘어간다.

나머지는 AWS 설정이 필요해서 다음글에 적겠다.

다음글에서...

 

참고글

https://docs.github.com/en/actions

https://zzsza.github.io/development/2020/06/06/github-action/

728x90
LIST
댓글
공지사항