CI/CD 기능 구현
Jenkins, github action 이 두가지가 제일 유명하다. 그런데 git organization 기반으로 코드를 작성하고 있었고, dev를 맡으신 분께서 github action에 대한 경험을 가지고 계셔서 github action을 채택하게 되었다.
1. 워크플로우 이름 및 트리거 조건
name: Java CI/CD with Gradle
on:
push:
branches: [ "dev" ]
pull_request:
branches: [ "dev" ]
- 워크플로우 이름: "Java CI/CD with Gradle".
- 트리거 조건: dev 브랜치에 푸시되거나 풀 리퀘스트가 생성될 때 실행된다.
2. Build Job
runs-on: ubuntu-latest
services:
redis:
image: redis
ports:
- 6379:6379
- ubuntu-latest 환경에서 실행된다.
- Redis 서비스를 사용한다.
- uses: actions/checkout@v2
- name: Set up JDK 17
uses: actions/setup-java@v1
with:
java-version: 17
- name: Create directory for application.yml
run: mkdir -p ./src/main/resources/
- name: Create directory for TEST application.yml
run: mkdir -p ./src/test/resources/
- name: Generate application.yml
run: echo "${{ secrets.APPLICATION_PROPERTIES_CONTENT }}" > ./src/main/resources/application.yml
- name: Generate TEST application.yml
run: echo "${{ secrets.TEST_APPLICATION_PROPERTIES_CONTENT }}" > ./src/test/resources/application.yml
- 코드 체크아웃
- JDK 설정
- 디렉토리 생성
-설정 파일 생성
- name: Gradle Caching
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- Gradle 캐싱
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
shell: bash
- name: Build with Gradle
run: ./gradlew clean build
- Gradlew 실행 권한 부여
- Gradle 빌드
- name: Docker build & push to docker repo
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -f Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:${{ github.run_number }} .
docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:${{ github.run_number }}
- Docker 이미지 빌드 및 푸시
Deploy Job
needs: build
runs-on: ubuntu-latest
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
- name: AWS EC2 Connection
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST_DEV }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_PEM }}
port: ${{ secrets.EC2_PORT }}
timeout: 60s
script: |
sudo docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:${{ github.run_number }}
sudo bash deploy-githubActions.sh ${{ github.run_number }}
sudo docker image prune -f
- AWS 자격 증명 설정
- AWS EC2 연결 및 배포 스크립트 실행
다음과 같은 방식으로 실행되었다.
하지만 다음과 같은 단점이 있었는데, CD 작업이 dev branch에 pull request 시에 한번, merge 시에 한번 발생한다.
그렇기에 github action이 더러워지게 돼었고, 추후에 개선 방법을 더 찾아보게 되었다.
'Diary > TIL' 카테고리의 다른 글
2024-04-13) 대규모 시스템 설계 기초 CH1: 규모 확장, 캐시 (0) | 2024.05.19 |
---|---|
2024-04-12) 대규모 시스템 설계 기초 CH1: 단일 서버, db (0) | 2024.05.19 |
2024-04-09) release 와 dev 분리 (0) | 2024.05.18 |
2024-04-08) 모니터링&테스트와 관련된 의사결정 여러가지 (0) | 2024.05.17 |
2024-04-06) Pinpoint 등록 시도 (0) | 2024.05.15 |