Github Actions - 3. workflow 작성하기

zuckerfrei·2023년 5월 15일
0

Github Actions

목록 보기
3/3

요약

Github Actions로 CI/CD 파이프라인을 구축한 내용 정리



1. 필요한 기능 정리

  • 특정 조건에만 반응하여 배포 작업을 시작 할 것
  • 이중화(active-active)를 위해 한 번의 배포 작업으로 2개 이상의 서버에 동시에 배포 가능 할 것
  • 배포 대상이 되는 4곳의 사이트에 대해 부분/전체 배포 가능 할 것
    • ex) A, B, C, D 사이트가 존재할 경우
      A배포, B배포, A+B 배포, A+B+C+D 배포 같이 유연하게
  • 각 사이트 별로 설정 파일을 생성하여 관리할 것
  • 이미지 빌드 시간을 짧게 가져갈 것
  • 이전 이미지, 컨테이너를 깔끔하게 정리하여 파이프라인을 여러 번 실행시켜도 문제가 발생하지 않을 것

2. workflow 구성

  • Trigger
    • 파이프라인 실행 여부 & 배포 사이트 체크
  • Build
    • 컨테이너 이미지 빌드
  • clean-deploy
    • 기존 이미지, 컨테이너 존재 체크 및 정리 & 신규 버전 배포

3. 구현

1) 특정 조건에만 반응하여 배포 작업을 시작 할 것

Trigger job에서 커밋 메시지를 확인하는 if문을 추가해서, 특정 사이트인 경우에만 파이프라인이 실행되도록 설정

if: ${{ contains(github.event.head_commit.message, '#사이트이름') }}

2) 이중화(active-active)를 위해 한 번의 배포 작업으로 2개 이상의 서버에 동시에 배포 가능 할 것

각 job마다 runs-on을 설정하여, runs-on과 일치하는 태그의 runner만 실행하도록 설정

  trigger-001:
    ...
    runs-on: site-001
    steps:
      - ...
  trigger-002:
    ...
    runs-on: site-002
    steps:
      - ...

3) 배포 대상이 되는 4곳의 사이트에 대해 부분/전체 배포 가능 할 것

각 사이트 별로 workflow 파일을 생성하고 커밋 메시지로 트리거가 동작하도록 설정

A, C 사이트 동시 배포

커밋 메시지 예시입니다.
#A #C

4) 각 사이트 별로 설정 파일을 생성하여 관리할 것

  • application.yaml 파일에서 각 사이트 별 profile 선언 후 사이트 별 설정 값 관리,
  • 각 사이트 별 Dockerfile 생성하여 설정 관리

application.yaml

---
spring:
  config:
    activate:
      on-profile: A-site

[설정값1]
[설정값2]
      
---
spring:
  config:
    activate:
      on-profile: B-site
      
[설정값1]
[설정값2]

5) 이미지 빌드 시간을 짧게 가져갈 것

buildx 옵션으로 빌드 캐시 사용하여 빌드 시간 단축

Build job 중 일부

docker buildx build -t ${{  env.IMAGE_NAME  }}:${{  env.IMAGE_VERSION  }} -f Dockerfile-${{ env.DOMAIN }} .

6) 이전 이미지, 컨테이너를 깔끔하게 정리하여 파이프라인을 여러 번 실행시켜도 문제가 발생하지 않을 것

  • 쉘스크립트로 이전 버전의 이미지를 찾은 후 $GITHUB_ENV(env variable)로 선언하여, 이미지 버전을 체크하고 삭제하는데 이용
  • 현재 배포된 컨테이너 중지 & 삭제시킨 후 삭제 여부를 확인하고, 깔끔하게 삭제 된 경우에만 신규 버전을 배포하도록 설정
echo "기존 컨테이너 확실히 제거되었는지 확인"

CONTAINER_NAME=$(docker ps -aqf "name=${{  env.IMAGE_NAME  }}-*")

if [ -z "$CONTAINER_NAME" ]; then
  echo "CLEAN_RESULT=0" >> $GITHUB_ENV
  echo "clean remove success"
else
  echo "CLEAN_RESULT=1" >> $GITHUB_ENV
  echo "$CONTAINER_NAME still exists.. clean remove fail"
fi
profile
무설탕 음료를 좋아합니다

0개의 댓글