사내에서 팀원들과 사이드프로젝트를 진행하고 있다.
초기 서버 환경구성은 AWS에서 도커를 명령어를 이용해 컨테이너를 올리는 형태로 구성했었다.
그런데, 추가 기능 및 코드수정이 발생할시에 내가 일일히 직접 AWS에 접속해서 도커이미지를 재생성하고 컨테이너에 올리는게 비효율적이라는 생각이 들었고, CI/CD의 필요성을 뼈저리게 깨닫게 되었다.
나는 예전에 스프링으로 백엔드 개발 시 젠킨스를 이용해 배포환경을 구성해본 경험이 있었다.
그런데 젠킨스를 사용하기에는 프로젝트가 소규모 사이즈라고 판단이 들었다.
젠킨스를 사용하기에는 조금 무거울것 같다는 생각이 들었다.
그래서 사내에서 백엔드개발자분들이 사용하는 깃헙액션을 사용해보기로 했다.
기본적인 깃헙액션 문법 (이외에도 많음)
on
name: CI/CD # 이름을지정 (필수아님)
on: # 이벤트 트리거 지정 (필수)
# use example
# 특정 브랜치일 때 수행
on:
push:
branches:
- main
# push일 때 수행
on: push
# push / PR일 때 수행
on: [push, pull_request]
jobs
job은 기본적으로 병렬로 실행이 된다.
runs-on
job이 실행될 머신의 타입을 의미한다.
steps
step은 job의 작업 단위이다. step은 작업을 수행하는 각각의 단계가 정의된다.
다양한 작업들이 들어갈 수 있다. 예를 들면 코드를 체크아웃하거나 빌드하거나, 테스트를 실행하거나, 배포하는 등의 작업이 가능하다.
uses
github에서 제공하는 액션을 사용할때 사용된다. 다른 저장소에 있는 액션을 가져와서 사용할때 해당하는 저장소의 경로를 지정한다.
소유자/저장소명@참조자
ex) actions/setup-node@v4, actions/checkout@v3
with
해당 액션을 실행할 때 필요한 추가적인 옵션들을 지정한다. 액션에 필요한 매개변수들이나 환경변수들을 설정할 수 있다.
run
스크립트를 직접 실행하는데 사용한다. 쉘 명령어를 실행하거나, 사용자가 원하는 작업을 수행한다
# 워크플로의 일부로 실행될 작업을 지정
# 각 작업에는 이름이 있으며, 각 작업 내에서 수행해야 하는 단계나 작업을 정
jobs:
# example
# Job1로 표시되는 job1이라는 작업을 생성
jobs:
job1:
name: Job 1 # 스텝 혹은 액션을 지정한다.
runs-on: ubuntu-latest # job이 실행될 머신의 타입 (필수)
steps:
- name: Step 1
# 스텝에서 진행할 액션들을 지정한다.
uses: actions/setup-node@v4
with:
node-version: 18
- name: Install dependencies
run: npm install
- name: Build
run: npm run build
...
- name: Step 2
...
AWS에 접속화기 위해 aws-actions/configure-aws-credentials@v1 을 사용했다.
secrets.ACCESS_KEY
secrets.SECRET_KEY
위의 2가지는 AWS의 IAM 을 이용하면 된다.
IAM의 '보안자격증명' 메뉴에서 생성 및 얻을 수 있다.
secret_key는 다운받은 cert를 vi로 실행시켜 얻는 RSA키 이다.
깃헙설정에서 secrets으로 시작되는 값들을 등록해준다.
name: CI/CD
on:
push:
branches:
- main
jobs:
ci:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v3
- name: AWS configure credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.SECRET_KEY }}
aws-region: ap-northeast-2
- name: pull github repo
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.SSH_KEY}}
script: |
cd project-folder
git config --global user.email ${{secrets.MY_EMAIL}}
git config --global user.name ${{secrets.MY_NAME}}
git remote set-url origin https://${{ secrets.MY_EMAIL }}:${{ secrets.MY_PASSWORD }}@github.com/GITHUB_URL/project.git
cd:
needs: [ci]
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v3
- name: AWS configure credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.SECRET_KEY }}
aws-region: ap-northeast-2
- name: build docker
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.SSH_KEY}}
script: |
cd project-folder
sudo git pull origin
docker system prune -a -f
docker compose -p project up --build -d
1. 깃헙 main 브런치에 코드가 merge or push 된다.
2. AWS에 접속하여 코드를 최신화(CI)하고
3. 도커 컨테이너를 서버에 배포(CD) 하게 된다.
원래는 내가 작성한 플로우가 아니라 도커허브를 이용해서 작업을 한다고 한다.
여력이 된다면 그렇게 리팩토링을 해보고 싶다.
'Web' 카테고리의 다른 글
| [CSS] 부모 width를 무시하고 width 100%를 주는방법 (0) | 2023.03.30 |
|---|---|
| 개발관련 유용한 웹사이트 (0) | 2023.03.15 |