우리가 가장 무서워하는 것 중 하나는 바로 배포하기이다. 배포를 하는 과정에서 정상적으로 작동이 되지 않거나 치명적인 실수를 한다면 전의를 상실하고 어디서부터 손대야할지 매우 난감한 상황이 생기기도 한다. 다시말해 브랜치로 분리하여 작업을 하고 병합을 하며 배포하는 과정에서 실패하게되면 개발자들은 피로와 스트레스가 누적이 되며, 브랜치에서 커밋의 주기가 늦어지며 CI극장이 생기기도 한다는 뜻이다.
그래서 이를 극복하고자 지속적인 통합과 지속적인 배포를 하며 빠르게 원인을 파악하고 개발을 치고 나가는 CI/CD파이프 라인이 생겨났다고 한다.
이 내용은 유튜브의 어떤 강의를 들으면서 얼추 생각나 적어보았다 ㅎㅎ
서론은 여기까지하고 그럼 GitActions를 사용해서 어떻게 CI/CD 파이프라인을 개설하는지 알아보자.
1. GitActions 에서 Java with Gradle을 지정한다. 자바의 Gradle을 사용해서 간편하게 파이프라인을 구성할 수 있다.
2. Gradle 파일 생성
configure을 누르면 아래와 같이 자동으로 기본 구성 파일을 제공해준다. 우선 Commit Change를 눌러 initial Commit을 해주고 구성을 수정해보자.
3. yml파일 수정하기
파일의 위치는 .github/workflows/gradle.yml 에 위치하고 있다.
아래 내용은 가장 기본적인 구성이며 최적화를 위한 내용은 아직 담겨있지 않다. 그래들을 다운받을 때 불필요한 다운로드를 방지하는 캐싱정도는 추가로 작성된 상태다.
그럼 하나씩 내용을 뜯어보자.
name: CI/CD github Actions & Docker
on:
push:
branches: ["master"]
permissions:
contents: read
jobs:
CI-CD:
runs-on: ubuntu-latest
steps:
# 코드 체크아웃
- uses: actions/checkout@v3
# JDK 설정
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
# Gradle 캐싱
- 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-
# 환경 설정(application-dev.yml 파일 생성)
- name: Make application-dev.yml
if: contains(github.ref, 'master')
run: |
cd ./src/main/resources
touch ./application-dev.yml
echo "${{ secrets.YML_DEV }}" > ./application-dev.yml
cat ./application-dev.yml # 디버그용 출력
shell: bash
# gradlew 실행 권한 부여
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# Gradle 빌드
- name: Build with Gradle
run: ./gradlew clean build -x test
# Docker Hub 로그인
- name: Docker Hub Login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# Docker 빌드 & 푸시
- name: Docker build & push to dev
if: contains(github.ref, 'master')
run: |
docker build --cache-from=type=local,src=/tmp/.build-cache -f Dockerfile -t ${{ secrets.DOCKER_REPO}}/myselectshop:test .
docker push ${{ secrets.DOCKER_REPO}}/myselectshop:test
# 배포
- name: Deploy to dev
uses: appleboy/ssh-action@master
id: deploy-dev
if: contains(github.ref, 'master')
with:
host: ${{ secrets.HOST_DEV }}
username: ${{ secrets.USERNAME }}
port: 22
key: ${{ secrets.PRIVATE_KEY }}
script: |
sudo docker rm -f myselectshop # 특정 컨테이너만 삭제
sudo docker pull ${{ secrets.DOCKER_REPO}}/myselectshop:test
sudo docker run -d -p 8080:8080 --name myselectshop ${{ secrets.DOCKER_REPO}}/myselectshop:test
sudo docker image prune -f # 필요 없는 이미지 정리
1. name
workflow의 이름을 지정한다.
Github Actions에서 실행할 떄 워크플로우의 식별자로 사용된다.
필수는 아니지만, 명확한 이름을 설정하면 여러 개의 워크플로우를 관리하기 쉬워진다.
2. on (workflow Trigger)
- push : 특정 브랜치에 코드가 푸시될 때 실행
- pull_request : PR이 생성될 때 실행
- schedule : 지정된 시간마다 실행(cron을 사용)
- workflow_dispatch : 수동 실행( 사용자가 직접 실행 가능하다)
on:
push:
branches: ["master"]
3. jobs(작업 정의)
하나 이상의 작업을 정의한다.
각 작업은 별도의 실행 환경에서 독립적으로 실행된다.
여러 개의 작업을 병렬 또는 순차적으로 실행 가능하게 한다.
jobs:
CI-CD:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
3-1. runs-on
워크플로우를 실행할 OS 환경을 지정한다.
- ubuntu-latest : 최신 Ubuntu 환경
- ubuntu-20.04 : Ubuntu 20.04
- ubuntu-22.04 : Ubuntu 22.04
- windows-latest : 최신 Windows 환경
- macos-latest : 최신 macOS 환경
runs-on: ubuntu-latest
3-2 . steps(작업 단계)
하나의 job 내에서 실행할 개별 작업을 정의한다.
uses, run , with 등의 키워드를 사용하여 액션을 실행한다.
- uses : Github Actions의 기본 액션을 가져와 실행한다.
steps:
- uses: actions/checkout@v3 // 코드 저장소를 체크아웃
- name: Set up JDK 17
uses: actions/setup-java@v3 // JDK 환경을 설정
with:
java-version: '17'
distribution: 'temurin'
- run : 직접 실행할 Shell 명령어를 작성한다. 여러 줄의 스크립트도 가능하다.
- name: Create Config File
run: |
echo "APP_ENV=production" > .env
cat .env
- if : 특정 조건이 만족될 때만 실행한다.
- name: Deploy to dev
if: contains(github.ref, 'master') //github.ref : 현재 브랜치 정보, github.event_name : 실행 이벤트 이름(push,pull_requests 등)
- with : 액션에 추가 옵션 전달
- uses: actions/setup-java@v3
with: //인수 전달
java-version: '17'
distribution: 'temurin'
- uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
4. env : 환경 변수 설정
- name: Print Environment Variable
run: echo "Database URL is $DATABASE_URL"
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
5. secrets(보안 변수)
GitHub 저장소의 settings > secrets에서 설정한 보안 변수를 참조
민감한 정보를 저장할 때 사용 된다.
- name: SSH Deploy
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST_DEV }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.PRIVATE_KEY }}
옵션 설명 총정리!
- name : 워크플로우의 이름을 설정
- on : 실행 트리거 설정 (push, pull_request, schedule 등)
- jobs : 여러 개의 작업을 정의
- runs-on : 실행 환경 지정 (ubuntu-latest, windows-latest 등)
- steps : 작업 내 개별 단계 정의
- uses : 외부 GitHub Action 사용
- run Shell : 명령어 실행
- if : 조건에 따라 실행 여부 결정
- with : 액션에 추가 옵션 전달
- env : 환경 변수 설정
- secrets : 보안 변수를 GitHub Secrets에서 가져와 사용
설정을 마치고 파일을 저장한 뒤 작업후에 master 브랜치에 push를 해주면 다음과 같이 push이벤트를 감지하고 자동으로 파이프라인이 시작된다.
작업이 실패되거나 취소, 성공시 왼쪽 작은 아이콘으로 구분이 가능하다.
실패된 작업은 롤백되며 서버에 배포되지 않는다. 하지만 설정 내용에 따라 배포가 된 이후에 문제가 발생할 수도 있다. 작업 순서를 잘 생각하고 작업하는 것이 좋다.
만약 배포되기 전에 문제가 발생했다면 아래 로그를 통해 어떤 문제가 발생했는지 확인할 수 있다.
나 같은 경우 컨테이너 이름 또는 if 옵션에서 branch명을 다르게 했다던가 이런 불일치 문제로 많이 fail했었다. 신중하게 코드를 하나하나 내려읽어가는 습관이 필요하다.. 급한 성격을 죽여야지 ㅠ
'AWS' 카테고리의 다른 글
[Docker/ MySQL설치] Docker를 사용하여 MySQL 설치하기 (0) | 2025.02.05 |
---|---|
[EC2 / Docker 설치하기] Docker ubuntu환경에서 설치하는 법 (0) | 2025.02.05 |
[AWS / 문제 해결 추가] 매우 간편한 AWS EC2 Linux Docker설치 (0) | 2024.08.12 |
[AWS / 접근 오류] Disconnected-No-supported-authentication-methods-available-server-sent-publickeygssapi-keyexgssapi-with-mic (0) | 2024.08.12 |
[AWS / 사진첨부] 탄력적 IP가 무엇이고 어떻게 설정하지? (0) | 2024.08.02 |