0. 개요
기존에 젠킨스를 통해 CI/CD를 구축을 해 보았었는데 이래저래 설치 및 설정에 상당한 시간이 소요되었었습니다.
그래서 이번엔 별도 서버 구축도 필요 없고, 간단하게 yaml작성으로 CI/CD를 구현할 수 있는 Github Action으로 CI/CD를 구축해 보았습니다.
1. Github Action 이란?
Github repo를 기반으로 한 Workflow 자동화 도구입니다.
간단한 YMAL 작성을 통해 빌드, 테스트, 릴리즈, 배포가 가능합니다.
그리고 market place라는게 활성화되어 있어, 본인이 직접 작성하지 않더라도 다른 개발자가 작성한 yaml을 참조하거나 불러와서 자유롭게 사용할 수 있습니다.
YAML이란?
들여쓰기와 키-값 쌍의 계층 구조를 사용해 데이터 구조를 나타내는 데이터 형식입니다.
sprig boot에서 설정값들을 입력하는 applciation.yml이 바로 yaml 파일입니다.
그러니까, 으믈로 읽는게 아니라 야믈로 읽어야 합니다.
또한 배포서버로 github가 서버를 무료로(public repo에 한해) 배포해줍니다.
즉, 별도의 배포서버를 구축하지 않아도 github에서 제공해주는
2. Github Action의 구성요소
Githun action은 구성하는 구성요소들은 다음과 같습니다.
- Workflow
- GitHub Action의 기본 컨테이너이자 최상위 개념입니다. 후술할 여러 job으로 구성되어 있습니다.
- 확장자명은 yaml이며, github repo의 .github/workflows 디렉토리에 위치합니다.
- event 기반으로 동작되게 됩니다. - Job
- Workflow를 구성하는 작업 단위입니다. Job은 여러 step으로 구성되어 있습니다.
- needs keyword를 사용해 다른 작업과의 의존관계를 나타낼수도 있고, 병렬 실행도 가능합니다. - Step
- Job을 구성하는 작업 단위입니다. 여러 Task들로 구성되어 있습니다.
- 셸 명령아나 스크립트들을 입력할 수도 있고, action을 실행할수도 있습니다. - Action
- workflow의 가장 작은 블럭으로, 재사용 가능한 코드 단위입니다.
- 직접 작성한 Action을 사용하거나, marketplace의 Action들을 사용할수도 있습니다. - Event
- Workflow가 실행될 조건(Trigger)를 나타냅니다.
예를들어, 특정 브런치가 merge되는 상황에 workflow를 실행시키도록 할 수 있습니다. - Runner(Enviroment)
- workflow가 실행될 환경을 정의합니다.
- 직접 호스팅하는 self-hosted runner와 github이 호스팅을 제공해주는 github-hosted runner로 나뉩니다.
3. 작성하기
name: Auto deploy to NCP
#main branch가 push될 때마다 동작
on:
push:
branches: [ "main" ]
permissions:
contents: read
#아래의 action을 수행할 runner의 os는 최신버전 ubuntu
jobs:
build:
runs-on: ubuntu-latest
steps:
#소스코드(repo)를runner로 옮김. 서브모듈을 사용하므로 서브모듈 옵션도 추가
- name: checkout
uses: actions/checkout@v3
with:
submodules: recursive
token: ${{ secrets.ACTION_TOKEN }}
#명시한 환경으로 setup
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
# gradle setup & build
- name: grant execute permission for gradlew
run: |
gradle wrapper
chmod +x gradlew
- name: gradle build
run: ./gradlew clean build
#빌드한 jar파일을 도커 이미지로 빌드하고 도커 허브에 푸시
- name: web docker build and push
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -t ${{ secrets.DOCKER_REPO }}/urlumberjack .
docker push ${{ secrets.DOCKER_REPO }}/urlumberjack
deploy:
#needs를 통해 build job이 수행 성공시에 작업되도록 설정
needs: build
runs-on: ubuntu-latest
steps:
#NCP에 로그인해 docker image pull & run : https://github.com/appleboy/ssh-action
- name : NCP login and docker image pull and run
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.NCP_HOST }}
username: ${{ secrets.NCP_USERNAME }}
password: ${{ secrets.NCP_PASSWORD }}
port: ${{ secrets.NCP_PORT }}
script: |
sudo docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
sudo docker stop $(sudo docker ps -a -q)
sudo docker rm -f $(sudo docker ps -a -q)
sudo docker pull ${{ secrets.DOCKER_REPO }}/urlumberjack
sudo docker run -d -p 8080:8080 ${{ secrets.DOCKER_REPO }}/urlumberjack
sudo docker image prune -f
ps -ef | grep java
+ Github secret과 같이 사용하기
위의 코드를 보시면 계정정보와 같은 민감한 데이터들은 직접 입력하지 않고 ${{ }} 블럭으로 대체하고 있습니다.
이는 github secret에 저장된 값들을 불러와서 사용하고 있는 것입니다.
repo의 setting - secrets and variables - actions 탭으로 들어가서 등록할 수 있습니다.
'VCS' 카테고리의 다른 글
Git submodule을 통해 application.yml 관리를 해보자! (0) | 2023.06.07 |
---|---|
You've added another git repository inside your current repository. (0) | 2022.03.30 |
[Git] 실수로 삭제한 Local/Remote Branch 복구하기 (0) | 2022.01.31 |