2 분 소요

오늘은 진행하고 있는 사이드 프로젝트에 Github Actions를 활용하여 CI/CD 구축을 해보았습니다.
CI/CD를 구축할 수 있는 툴은 무료버전 또는 기업용 유료버전으로 나뉘어져 있습니다. 오늘 활용하고자 하는 Github Actions 외에도 종류가 굉장히 다양 (Jenkins, CircleCI, TravisCI 등) 한데, 아무래도 Github Actions가 설치나 큰 세팅 없이 간단히 활용할 수 있어서 괜찮은 듯 싶어 이렇게 시도해보았습니다.

기존 배포 방식

기존에 Next.js와 Node.js로 만들고 있는 프로젝트는 Oracle Cloud VM에 돌아가고 있고, 배포 자동화 구축이 되어 있지 않아 아래와 같은 절차로 빌드를 진행했습니다.

  1. SSH로 OCI 인스턴스 접속
  2. 폴더별 git pull
  3. 폴더별 npm install 및 build
  4. 배포

이러한 과정이 별게 아니라고 생각이 들 수도 있지만, 반복되고 지루한 이런 절차는 개발자의 리소스를 비효율적으로 활용하는 것이라고 할 수 있습니다.

그렇다면 이제 본격적으로 Github Actions를 활용한 CI/CD 구축을 해보도록 하겠습니다.

Github Actions를 활용한 CI/CD 구축

SSH 연결

가장 먼저 SSH 연결을 하기 위해 ssh-remote-commands 라는 action을 사용해주도록 하겠습니다. 해당 페이지에서 상세하게 적혀있는 매뉴얼을 참고하시면 좋습니다.

ppk file -> rsa 변경

1

PuTTY Key Generator로 만들었던 ppk 파일을 rsa 형식으로 변경해줍니다. 위 사진과 같이 기존 ppk 파일을 불러온 다음 Conversions - Export OpenSSH key를 눌러주면 됩니다.

secrets 설정

암호화될 값들을 넣어주는 secret을 설정해보도록 하겠습니다.
레포지토리의 세팅에서 Secrets and variables - Actions 를 눌러줍니다.

image

그럼 위와 같은 화면이 나옵니다. New repository secret를 눌러줍니다.

image

계정명, 서버 IP, 비밀키, 포트 등의 정보를 만들어주면 됩니다. 참고로 비밀키는 아까 위에서 만들었던 rsa 파일의 내용 전부를 넣어주면 됩니다. (—–BEGIN OPENSSH PRIVATE KEY—–와 —–END OPENSSH PRIVATE KEY—– 를 포함)

작성한 secrets는 ${{secrets.XXX }} 이런식으로 키 값으로 사용할 수 있습니다. 이제 사전 준비를 마쳤으므로 스크립트를 작성해야합니다.

Workflow 작성

Github Actions는 프로젝트 최상위에 있는 .github/workflows 폴더 안에 있는 yml 을 읽어서 작동하게끔 되어 있습니다. 직접 작성해도 되고 깃허브 Actions 탭에서 제공되는 템플릿으로 작성하는 것도 가능합니다.

제 프론트엔드 배포 스크립트를 예시로 적어보도록 하겠습니다.

.github/workflows/deploy.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
name: frontend deploy # workflow의 이름
on:
  push:
    branches: ["develop"]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      # 누군가 만들어 놓은 Actions 활용 시 uses 키워드 사용
      - uses: actions/checkout@v4

      # step의 이름
      - name: Run scripts in server
        uses: appleboy/ssh-action@master
        with:
          host:  ${{ secrets.REMOTE_SSH_HOST }} 
          username:  ${{ secrets.REMOTE_SSH_USERNAME }} 
          key:  ${{ secrets.REMOTE_SSH_KEY  }} 
          port:  ${{ secrets.REMOTE_SSH_PORT  }} 
          # ssh 접속 실패 타임아웃 - 보통 40초는 안걸린다
          timeout: 40s
          script: |
            whoami
            cd FreeMarket-FE
            sudo git pull origin develop
            # 아래 두 작업이 없으면 pm2에 대해서 command not found 에러가 뜰 수 있음
            export NVM_DIR=~/.nvm
            source ~/.nvm/nvm.sh
            npm install
            npm run build
            pm2 restart FreeMarket

만약 모두 작성을 잘 했는데 deploy 부분에서

1
ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain

위와 같은 에러가 뜬다면 서버에서 sshd_config가 잘 설정되어 있는지 확인해보세요.

/etc/ssh/sshd_config 에서

1
2
PubkeyAuthentication yes
PubkeyAcceptedKeyTypes=+ssh-rsa

위와 같은 코드 2줄을 추가하고 ssh server를 재시작 하면 됩니다.

🔔포스팅 공지
개인 공부 기록용 블로그 입니다.
잘못된 부분이 있을 시 메일이나 댓글로 지적해주시면 감사드리겠습니다 :)

댓글남기기