본문 바로가기

Diary/TIL

2024-04-11) CI/CD with github-action

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이 더러워지게 돼었고, 추후에 개선 방법을 더 찾아보게 되었다.