본문 바로가기

내용 복습/devOps

Github Actions - CICD

CICD는 지속적 통합(Continuous Integration) 및 지속적 제공/배포(Continuous Delivery/Deployment)를 의미하며, 소프트웨어 개발 라이프사이클을 간소화하고 가속화하는 것을 목표로 한다. 툴은 github actions, Jenkins, argo CD 등이 있는데 이번에는 간편한 깃액션으로 해보려고 한다. 아래는 코드 배포 자동화 과정을 나타낸 그림이다.

 

골자는 develop 브랜치에 모은 코드들을 메인 브랜치에 푸쉬하면 깃헙 액션에서 AWS code deploy를 통해 배포되는 것이다. 이전 프로젝트에서 다른 분이 하신 것을 본 적 있는데, 확실히 초기설정만 잘 해놓으면 배포에 신경쓰지 않아도 되서 개발속도가 빨라지는 것을 느꼈다.

 

그리고 github actions를 위한 코드를 작성했는데, 루트 경로에 github/workfolws 폴더 경로를 생성하고 아래에 yml파일을 생성한다. 파일이름은 상관없는 듯 하다. 그리고 아래의 익스텐션을 설치하면 코드 작성이 더 쉽다.

 

name: test

on: pull_request

jobs:
    test:
        runs-on: ubuntu-22.04
        steps:
            - name: Checkout repository // 레포지토리에서 코드 가져오기
              uses: actions/checkout@v3 // 깃 액션 버전 3으로 설정
            - name: Node.js setup
              uses: actions/setup-node@v3 // 노드 설치
            - with:
                node-version: "18"
            - name: Install npm packages // npm 패키지 설치
              runs: npm ci
            - name: install and run redis-server // 레디스 설치 및 실행
              run: |
                sudo apt-get update
                sudo apt-get install -y redis-server
                redis-server --daemonize yes --requirepass test_env --port 6380
            - name: Run test
              run: npm run test

            - name: test build
              run: npm run build

 

위의 코드는 내가 수강하고 있는 강의의 Lightsail 배포 파이프라인을 작성한 것이다.

사실 위의 코드엔 약간 하자가 있는데, package.json에 "test":"jest -- watchAll"로 되어있기에 ci 환경에서는 빌드단계로 넘어가지 못하고 계속 테스트를 실행하게 된다. 그래서 "test:ci":"jest"를 추가해주고 npm run test:ci로 이 코드를 수정해주면 된다.

 

사실 나의 최종적인 목표는 이 강의 마지막에 있는 ECS이다. 사실 yml파일을 처음 작성해봐서 두려움이 있었는데, 생각보다 읽기 쉬워서 안심했다. 다음 단계는 SSH 터널링으로 VM 접속이다. 

 

 

위의 도식은 기본적인 SSH 키 사용법이다. 상세한 설정법은 다음에 포스팅 하겠다. 아래는 workflows 폴더 아래에 deploy.yml을 생성해서 추가한 코드이다.

 

name: deploy

on:
  push:
    branches:
      - main

jobs:
    deploy:
        runs-on: ubuntu-latest
        steps:
            - name: Set up SSH
              run: |
              mkdir -p ~/.ssh/  // 파일이 없다면 생성
              echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa  // 파일 내용을 저 값으로 변경
              chmod 600 ~/.ssh/id_rsa

            - name: Set up known hosts
              run: |
                echo "${{ secrets.SSH_KNOWN_HOSTS }}" >> ~/.ssh/known_hosts  // 파일 생성하고 내용은 저 값
                chmod 644 ~/.ssh/known_hosts

            - name: SSH and deploy
              run: |
                ssh ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_PUBLIC_IP }} "
                  cd express
                  git pull || exit 1  // 실패하면 나가기
                  npm install || exit 1
                  npm run build || exit 1
                "

 

 

환경변수들은 미리 git repository에 설정해줘야하고, 대강 이런 흐름인 것을 공부해봤다.