Github Actions를 활용한 CI/CD 구축 (OCI & SSH)
오늘은 진행하고 있는 사이드 프로젝트에 Github Actions를 활용하여 CI/CD 구축을 해보았습니다.
CI/CD를 구축할 수 있는 툴은 무료버전 또는 기업용 유료버전으로 나뉘어져 있습니다. 오늘 활용하고자 하는 Github Actions 외에도 종류가 굉장히 다양 (Jenkins, CircleCI, TravisCI 등) 한데, 아무래도 Github Actions가 설치나 큰 세팅 없이 간단히 활용할 수 있어서 괜찮은 듯 싶어 이렇게 시도해보았습니다.
기존 배포 방식
기존에 Next.js와 Node.js로 만들고 있는 프로젝트는 Oracle Cloud VM에 돌아가고 있고, 배포 자동화 구축이 되어 있지 않아 아래와 같은 절차로 빌드를 진행했습니다.
- SSH로 OCI 인스턴스 접속
- 폴더별 git pull
- 폴더별 npm install 및 build
- 배포
이러한 과정이 별게 아니라고 생각이 들 수도 있지만, 반복되고 지루한 이런 절차는 개발자의 리소스를 비효율적으로 활용하는 것이라고 할 수 있습니다.
그렇다면 이제 본격적으로 Github Actions를 활용한 CI/CD 구축을 해보도록 하겠습니다.
Github Actions를 활용한 CI/CD 구축
SSH 연결
가장 먼저 SSH 연결을 하기 위해 ssh-remote-commands 라는 action을 사용해주도록 하겠습니다. 해당 페이지에서 상세하게 적혀있는 매뉴얼을 참고하시면 좋습니다.
ppk file -> rsa 변경
PuTTY Key Generator로 만들었던 ppk 파일을 rsa 형식으로 변경해줍니다.
위 사진과 같이 기존 ppk 파일을 불러온 다음 Conversions - Export OpenSSH key
를 눌러주면 됩니다.
secrets 설정
암호화될 값들을 넣어주는 secret을 설정해보도록 하겠습니다.
레포지토리의 세팅에서 Secrets and variables - Actions
를 눌러줍니다.
그럼 위와 같은 화면이 나옵니다. New repository secret
를 눌러줍니다.
계정명, 서버 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를 재시작 하면 됩니다.
🔔포스팅 공지
개인 공부 기록용 블로그 입니다.
잘못된 부분이 있을 시 메일이나 댓글로 지적해주시면 감사드리겠습니다 :)
댓글남기기