차근차근 따라하면 할 수 있습니다 화이팅
● 단계 링크
CICD 구축하기(2) - EC2 인스턴스 생성하기, 세팅하기
CICD 구축하기(3) - github repository 세팅
▶ CICD 구축하기(4) - workflow 작성하기
목표
- workflow 이해하고 작성하기
- 배포 확인하기
목차
1. workflow를 위한 yml 파일 만들기
2. workflow 작성하기
- test 부분 작성하기
- docker 부분 작성하기
- deploy 부분 작성하기
[1. workflow를 위한 yml 파일 만들기]
1. yml 파일 만들기
- 리포지토리 → Actions에 들어간다
- 리포지토리에 따라 적절한 환경을 추천해주기도 하고 필요한 환경을 검색해서 갖다 쓸 수도 있다
- 하지만 set up a workflow yourself를 클릭해 직접 작성해보도록 한다
- 클릭하면 아래와 같은 화면으로 이동하게 된다
- 좌측은 workflow 작성창
- 우측은 marketplace로, 작성에 도움을 받을 수 있다
2. workflow 이해하기
- 기본 틀을 먼저 작성한 후, 간단히 설명해보겠다
name: my first cicd
# workflow를 재실행하는 트리거
on:
push:
branches:
- main
# 재실행되면 수행할 작업들
jobs:
# 작업1: 테스트코드 검사
test:
runs-on: ubuntu-latest
steps:
# 작업2: 빌드
build:
needs: test
steps:
# 작업3: 배포
deploy:
needs: build
runs-on: [self-hosted]
steps:
1) workflow를 재실행하는 트리거
- [main]브랜치에 [push]가 발생하면 재실행된다
- 브랜치는 배포에 사용되는 브랜치를 기재하면 된다. 필자는 주로 main 브랜치를 배포에 사용하므로 main을 기재했다
2) 재실행되면 수행할 작업들
- jobs: 를 쓴 후 내용들을 들여쓰기로 작성한다
3) 작업1: 테스트코드 검사
- 테스트코드가 있을 경우 지속적인 통합을 위해 작성한다
- 테스트코드가 없다면 생략해도 된다. 생략 시 runs-on: ubuntu-latest는 다음단계에 작성한다
- 리눅스로 인스턴스를 생성했더라도 ubuntu-latest라고 작성해도 된다
4) 작업2: 빌드
- 이 단계에서 도커를 빌드할 것이다
- needs의 의미는 test 단계를 꼭 통과해야 수행된다는 의미이다.
5) deploy
- 이 단계에서 EC2에 배포할 것이다
- 리포지토리와 인스턴스를 runners에서 연결했으므로 runs-on에는 [self-hosted]를 쓰면 된다
[2. workflow 작성하기]
1. test 부분 작성하기
test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4.1.7
- name: Setup Node.js environment
uses: actions/setup-node@v4.0.3
with:
node-version: '20'
- name: Install dependencies
run: npm install
- name: Run test
run: npm test
1) 환경 세팅
- 첫 번째 단계이므로 test 단계지만 구동 환경 설정, 코드체킹, 노드 환경 설정이 필요하다 (테스트 생략할거면 다음 job에서 해주면 됨)
- runs-on: EC2 환경을 마련한다. linux든 ubuntu든 ubuntu-latest 사용하면 된다
- Checkout: 코드체킹
- Setup Node.js environment: 노드 환경 세팅하기
- Install dependencies: 필요한 라이브러리 설치
2) 테스트
- run: 수행할 명령어를 작성한다. 테스트를 수행해야 하므로 노드 테스트 실행 명령어인 npm test를 작성한다
2. docker 부분 작성하기
build:
needs: test
runs-on: ubuntu-latest
steps:
- name: Docker Setup Buildx
id: buildx
uses: docker/setup-buildx-action@v3.6.1
with:
path: /temp/.build-cache
key: ${{runner.os}}-buildx-${{github.sha}}
restore-keys: |
${{runner.os}}-buildx-
- name: Login to Github container registry
uses: docker/login-action@v3.3.0
with:
registry: ghcr.io
username: ${{github.actor}}
password: ${{secrets.GHCR_TOKEN}}
- name: Build and push
id: docker_build
uses: docker/build-push-action@v2
with:
push: true
tags: ghcr.io/sangddong/my-image:latest
1) Docker Setup Buildx: 이미지 빌드를 위한 단계
- id를 작성해 다음 단계에서 참조할 수 있도록 한다
- path를 만들어 Buildx 캐시가 저장될 곳을 만들어준다
- key: Buildx 캐시의 고유 키를 설정해준다. os와 커밋 sha를 포함시켜 구별시켜준다
- restore-keys: 캐시를 복원할 때 사용할 기본 키
2) Login to Github container registry: GitHub Container Registry (ghcr.io)에 로그인하기 위한 단계
- registry: 로그인할 레지스트리의 URL, GitHub Container Registry를 사용
- username: GitHub 사용자 이름을 설정, ${{ github.actor }}는 GitHub 사용자 이름
- password: 인증에 사용되는 비밀번호로, GitHub Secrets에서 가져오는 GHCR_TOKEN을 사용
- 이때 로그인에 계속 실패한다면, GHCR_TOKEN에 문제가 있을 가능성이 크다. 토큰은 GitHub Personal Access Token(PAT)으로 생성되어야 하며, 필요한 권한(예: read:packages, write:packages, delete:packages)을 포함해야 한다.
3) Build and push: Docker 이미지를 빌드하고 GitHub Container Registry에 푸시하는 단계
- id를 작성해 다음 단계에서 참조할 수 있도록 한다
- push: true: 빌드한 이미지를 레지스트리에 푸시
- tags: Docker 이미지에 태그를 지정합니다. ghcr.io/sangddong/my-image:latest는 GitHub Container Registry에 푸시될 이미지의 태그 (* ghcr.io를 사용하는 경우, tags 설정을 ghcr.io/${{ github.repository_owner }}/temp-image-name:latest와 같은 형식으로 지정해야 함)
3. deploy 부분 작성하기
- 혹시나 이 부분이 시작되지 않고 계속 대기상태라면, 인스턴스의 actions-runner를 작동시켰는지 확인해야 한다. 아래 명령어를 통해 작동시킬 수 있다
deploy:
needs: build
name: Deploy
runs-on: [self-hosted, sangddong]
steps:
- name: Login to Github container registry
uses: docker/login-action@v3.3.0
with:
registry: ghcr.io
username: ${{github.actor}}
password: ${{secrets.GHCR_TOKEN}}
- name: Verify Docker Login
run: |
echo ${{secrets.GHCR_TOKEN}} | sudo docker login ghcr.io -u ${{github.actor}} --password-stdin
- name: Docker run
run: |
sudo docker stop temp-container-name || true
sudo docker rm temp-container-name || true
sudo docker rmi ghcr.io/sangddong/my-image:latest || true
sudo docker run -d -p 80:3001 \
--name temp-container-name \
--restart always \
-e PORT=${{ secrets.PORT }} \
-e DATABASE_URL=${{ secrets.DATABASE_URL }} \
ghcr.io/sangddong/my-image:latest
1) Login to Github container registry
- 깃허브 사용자 이름과 GHCR_TOKEN으로 로그인한다
2) Verify Docker Login
- 사실 이 단계는 Login to Github container registry 단계에서 로그인이 자꾸 실패하면 추가해주는 단계이다. 생략해도 된다
- 앞선 단계에서 로그인이 실패하는 경우, 그 원인은 Docker 데몬에게 있을 가능성이 크다. Docker 데몬이 이전에 캐시된 로그인 정보를 사용하기 때문에, 로그인 상태가 제대로 반영되지 않을 수 있으므로 직접 로그인 명령어를 실행하여 명시적으로 인증 정보를 설정하면 이런 문제가 해결될 수 있다
3) Docker run
- 컨테이너를 생성해 작동시키는 단계이다
- 컨테이너를 생성하기 전, 컨테이너가 이미 존재하는 경우 제거하는 과정을 거친다
이로써 깃허브 cicd 구축이 완료되었다!!!!!!!!!!
고생하셨습니다 ^-^
'Git' 카테고리의 다른 글
[github] work-flow 작성, github actions cicd 배포시 겪은 오류들과 해결 (0) | 2024.08.21 |
---|---|
[AWS EC2, Github Action, Docker, Node] CICD 구축하기(3) - github repository 세팅 (0) | 2024.08.07 |