WHAT
CI/CD 구축(지속적 통합/ 지속적 배포)
WHY
애플리케이션 개발 단계를 자동화하여 애플리케이션을 더욱 짧은 주기로 고객에게 제공하기 위해.
CI/CD는 새로운 코드 통합으로 인해 개발 및 운영시에 발생하는 문제(통합지옥)을 해결하기 위함
HOW
- CI/CD 서비스 선정
Jenkins는 소규모 프로젝트에 적합하지 않기에 비교 대상에서 제외GitHub Actions VS GitLab
GITLAB | GitHub Actions |
GitLab은 코드 저장소, 이슈 추적, 웹 IDE, CI/CD 등을 통합한 개발 플랫폼으로 다양한 기능을 제공 | GitHub Actions는 GitHub에서 제공하는 클라우드 기반의 CI/CD 플랫폼입니다. |
GitLab CI/CD는 GitLab에서 제공하는 내장된 CI/CD 도구, 파이프라인을 쉽게 설정하고 실행 가능 | GitHub Actions는 GitHub 저장소와 강력하게 통합되어 있으며, GitHub 이벤트를 기반으로 작업을 실행할 수 있습니다. |
GitLab은 자체 호스팅 옵션 제공, AWS에서 EC2 인스턴스 등을 사용하여 GitLab을 설치하고 구성 가능 | AWS에서 EC2 인스턴스 등을 사용하여 Spring과 Docker를 실행하고, GitHub Actions를 통해 CI/CD 파이프라인 작성 가능 |
GitLab의 CI/CD 기능은 Docker와 Spring과의 통합 지원, 다양한 환경에서 배포 및 테스트 수행 가능 | GitHub Actions는 다양한 언어와 프레임워크를 지원, 커뮤니티에서 많은 액션 제공 |
본 프로젝트에서의 CI/CD 목표는 분산형 버전관리 사용 및 파이프라인 구축gitlab이 더 많은 기능을 제공하지만 CI/CD 경험이 없는 상태에서는 github actions가 더 적절할 것으로 판단
GitHub actions로 결정
Nginx 설정
80포트로 받아서 8080포트로 전송
dockerfile로 만들기
Docerfiled을 사용하여 이미지 빌드, 컨테이너 실행시 Nginx 설치설정파일은 /etc/nginx/conf.d에 설치
docker 이미지 굽기 & docker hub에 push
docker build -f dockerfile-nginx -t [dockerHub계정]/[repository이름] .
-f : docker파일의 경로 지정-t : 이미지에 태그 부여
docker-compose 작성 및 ec2로 전송
Github Action 작성
- Secret 변수 작성
gradle.yml 작성
# Workflow의 이름을 정의합니다
name: Java CI with Gradle
# Workflow를 트리거할 이벤트를 지정합니다 (main 브랜치로의 push)
on:
push:
branches: [ "main" ]
# Repository 내용에 대한 접근 권한을 지정합니다
permissions:
contents: read
# Workflow의 작업을 정의합니다
jobs:
# 빌드 작업을 정의합니다
build:
# 작업을 수행할 운영 체제를 설정합니다
runs-on: ubuntu-latest
# 작업에서 실행될 단계들을 정의합니다
steps:
# 단계: 리포지토리에서 소스 코드를 체크아웃합니다
- name: checkout
uses: actions/checkout@v3
# 단계: JDK 17을 설정합니다
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
# 단계: application-database.yaml 파일을 생성합니다
- name: make application-database.yaml
run: |
cd ./src/main/resources
touch ./application-database.yaml
echo "${{ secrets.DATABASE }}" >> ./application-database.yaml
shell: bash
# 단계: gradlew에 실행 권한을 추가합니다
- name: Add executable permission to gradlew
run: chmod +x ./gradlew
# 단계: Gradle로 프로젝트를 빌드합니다
- name: Build with Gradle
run: ./gradlew bootJar
# 단계: 웹 Docker 이미지를 빌드하고 푸시합니다
- name: web docker build and push
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -t ${{ secrets.DOCKER_REPO }}/moon .
docker push ${{ secrets.DOCKER_REPO }}/moon
# 단계: SSH를 사용하여 원격 서버에서 명령을 실행합니다 (비밀번호 인증)
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ubuntu
key: ${{ secrets.KEY }}
script: |
sudo docker rm -f $(docker ps -qa)
sudo docker pull ${{ secrets.DOCKER_REPO }}/moon
sudo docker pull ${{ secrets.DOCKER_REPO }}/moon-nginx
docker-compose up -d
docker image prune -f
CI/CD 동작 확인
'Deep Dive > DevOps' 카테고리의 다른 글
RDS 생성 및 Spring과 연결 (0) | 2023.07.05 |
---|---|
AWS S3 버킷 생성 (0) | 2023.07.04 |
docker 파일 생성 및 실행 (0) | 2023.06.27 |
ec2 서버에서 실행하기 (0) | 2023.06.26 |
가상머신 메모리 용량 늘려서 쓰기 (0) | 2023.06.25 |