1. Workflow 생성
Repository 상단의 Actions를 클릭합니다.
템플릿화 되어 있는 workflow를 선택합니다.
현재 Github Repository의 .github/workflows/ 내에서 yml 파일을 작성할 수 있도록 이동됩니다.
2. Secret 환경변수 등록
- public Repository에서 보이면 안 되는 변수 (docker hub 계정 등)가 있다면 Repository 설정에서 등록할 수 있습니다.
- 사용은 ${{ secrets.AWS_ACCESS_KEY_ID }} 와 같이 사용합니다.
3. Workflow 작성
- Workflow는 CI/CD 모두 한 파일에 작성할 수 있지만,
PR 요청 시에 CI 작업만 하고, PR 승인이 나야지만 CD 과정까지 이루어질 수 있도록 하기 위해 분리하였습니다.
-(3-1)에는 CI, (3-2)에는 CD workflow를 작성하겠습니다.
3-1. Workflow CI 작성
- CI 과정은 개발을 진행하면서 지속적으로 코드를 통합하는 과정을 말합니다.
- 테스트 후 빌드 과정이 자동화 되어있기 때문에 코드 충돌이나 문제점을 발견하여 빠르게 수정할 수 있습니다.
- 프로젝트 build CI 전체 코드는 아래와 같습니다.
name: rally-mate CI with Gradle
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
# branch checkout
- uses: actions/checkout@v3
# Cache workflow 실행 시간 개선 위해 dependencies와 build output을 캐싱
# https://www.daleseo.com/github-actions-cache/
- name: Caching Gradle
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- run: echo -e "${{ secrets.JASYPT_PASSWORD }}\n${{ secrets.JASYPT_ALGORITHM }}" > ./src/main/resources/application-secret.properties
- run: cat ./src/main/resources/application-secret.properties > ~/rally-mate-secret.txt
- name: Grant execute permission for gradlew
run: chmod +x gradlew
shell: bash
- name: Test with Gradle
run: ./gradlew test
- name: Build with Gradle
run: ./gradlew build -x test
shell: bash
- name: Login to Dockerhub
uses: docker/login-action@v1
with:
username: ${{secrets.DOCKERHUB_USER}}
password: ${{secrets.DOCKERHUB_ACCESS_TOKEN}}
# jib 이용하여 애플리케이션 도커 허브로 push (docker build -> push까지 한 번에)
- name: Run Jib to deploy Application
run: ./gradlew jib
위 코드를 하나씩 순서대로 보겠습니다.
A. Workflow 실행 조건 설정
- on 키워드를 이용하여 특정 이벤트 발생 시 workflow를 자동으로 트리거되도록 설정합니다.
1) master로 push되거나 pull reqeust가 merge 될 때,
2) master branch에 대해 pull request 요청 발생 시에 동작됩니다.
name: rally-mate CI with Gradle
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
B. Workflow 내의 Jobs 정의
- Workflow 내의 작업들은 jobs 키워드로 설정합니다. 1개의 job 내에 여러 개의 steps로 구성되어 있습니다.
- Jobs에는 여러 개의 작업 식별자(ID)와 관련 내용으로 구성되어 있습니다. ( 아래 코드에서는 build가 이름입니다 )
- 각 step마다 설명을 주석으로 달아두었습니다.
jobs:
# job ID
build:
# ubuntu 환경에서 실행합니다.
runs-on: ubuntu-latest
# step을 정의합니다.
steps:
# branch checkout actions를 사용하여 master branch의 내용을 가져옵니다.
- uses: actions/checkout@v3
# Cache workflow 실행 시간 개선 위해 dependencies와 build output을 캐싱합니다.
# https://www.daleseo.com/github-actions-cache/
- name: Caching Gradle
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
# JDK 17을 설정합니다.
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
# gradlew에 실행권한을 줍니다.
- name: Grant execute permission for gradlew
run: chmod +x gradlew
shell: bash
# 테스트코드를 실행합니다.
- name: Test with Gradle
run: ./gradlew test
# 테스트코드 성공 이후 test 없이 gradle을 build합니다.
- name: Build with Gradle
run: ./gradlew build -x test
shell: bash
# Dockerhub에 로그인합니다.
- name: Login to Dockerhub
uses: docker/login-action@v1
with:
username: ${{secrets.DOCKERHUB_USER}}
password: ${{secrets.DOCKERHUB_ACCESS_TOKEN}}
# jib 이용하여 애플리케이션 도커 허브로 push 합니다.
# jib가 없다면 docker build, docker push 과정이 필요하겠지만
# jib가 있기 때문에 위 과정이 한 번에 진행됩니다.
- name: Run Jib to deploy Application
run: ./gradlew jib
3-2. Workflow CD 작성
- CD란 지속적인 배포를 말합니다. CI를 통해 빌드하고 테스트를 통과한 코드에 대해,
테스트서버와 운영서버에 자동으로 release 하는 것을 말합니다.
- 프로젝트 deploy CD 전체 코드는 아래와 같습니다.
name: rally-mate CD
on:
pull_request:
branches: [ master ]
types: [ closed ]
env:
PROJECT: rally-mate
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Application Run
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_SSH_HOST }}
username: ${{ secrets.SERVER_SSH_USERNAME }}
password: ${{ secrets.SERVER_SSH_PASSWORD }}
port: ${{ secrets.SERVER_SSH_PORT }}
envs: env.PROJECT
script: |
whoami > whoami.txt
echo $(whoami) > whoami2.txt
cd ~/${{ env.PROJECT }}
git pull
cd docker
echo '${{ secrets.DOCKERHUB_PASSWORD }}' | docker login -u ${{ secrets.DOCKERHUB_USER }} --password-stdin
sudo docker rm -f $(docker ps -q -a)
docker-compose pull
docker-compose up -d
docker image prune -f
- 위 코드를 순서대로 보겠습니다.
A. Workflow 실행 조건 설정
- on 키워드를 이용하여 특정 이벤트 발생 시 workflow를 자동으로 트리거되도록 설정합니다.
1) master branch에 대해 pull request 요청이 closed 되면 동작됩니다.
name: rally-mate CD
on:
pull_request:
branches: [ master ]
types: [ closed ]
# 환경변수 설정 ( env.PROJECT 로 접근 가능)
env:
PROJECT: rally-mate
B. Workflow 내의 Jobs 정의
- 각 step마다 설명을 주석으로 달아두었습니다.
jobs:
deploy:
runs-on: ubuntu-latest
steps:
# ssh 통하여 명령어를 실행합니다.
- name: Application Run
uses: appleboy/ssh-action@master
with:
# github repository secrets 정보를 이용하여 ssh 접속 대상을 설정합니다.
host: ${{ secrets.SERVER_SSH_HOST }}
username: ${{ secrets.SERVER_SSH_USERNAME }}
password: ${{ secrets.SERVER_SSH_PASSWORD }}
port: ${{ secrets.SERVER_SSH_PORT }}
envs: env.PROJECT
# 프로젝트가 있는 디렉토리 접근 후 docker hub 로그인합니다.
# 이후 실행 중인 docker를 제거한 이후 새로운 이미지로 docker를 재시작합니다.
script: |
cd ~/${{ env.PROJECT }}
git pull
cd docker
echo '${{ secrets.DOCKERHUB_PASSWORD }}' | docker login -u ${{ secrets.DOCKERHUB_USER }} --password-stdin
sudo docker rm -f $(docker ps -q -a)
docker-compose pull
docker-compose up -d
docker image prune -f
4. Docker 설정
4-1. Docker Hub 회원가입 및 토큰 발행
- CI 과정을 통해 빌드된 이미지를 Docker Hub에 올려야 합니다.
- 토큰 발행 방법
4-2. Docker 설치
- 서버 내에 Docker를 설치합니다. 필요시 해당 URL을 참고합니다.
4-3. Jib 설정
- yml에 docker hub 로그인 대신 jib를 사용합니다.
- Jib란 구글 클라우드 도구 jib를 이용하여 프로젝트 빌드와 동시에 컨테이너 이미지까지 만들어서 push까지 해주는 역할을 합니다.
- 다음 URL을 참고하여 설정을 완료합니다 :: Jib 설정하기
5. 결과
1) 아래와 같이 github CI/CD가 성공하고 서버까지 배포된 상태입니다.
2) Docker hub에 새로운 이미지가 빌드되어 업로드 되었습니다.
참고
[1] Github Actions 첫 워크플로우 생성해보기 (DaleSeo)
'CI & CD' 카테고리의 다른 글
프로젝트 CI/CD 툴의 선정과 Github Actions 개념 (1) | 2023.06.04 |
---|