반응형
Github Actions를 활용한 CI/CD 파이프라인 구축 개념
- EC2 Instance 생성, EC2 Instance에 Docker 설치, Docker Hub 회원가입이 되어있다고 가정
- Github Repository에 프로젝트의 추가사항이나 변경사항 push 혹은 merge
- Github Actions에서 push 혹은 merge가 된 것을 확인
- Update된 Project를 빌드함
- 빌드한 결과로 Doocker Image 생성
- 생성한 Docker Image를 Docker Hub에 업로드
- EC2 Instance에 SSH로 접속 후 Docker Hub에 업로드 된 이미지로 프로그램 실행
- 수정사항을 Github에 올리기만 해준다면 다음 과정은 Github Actions에서 모두 처리
- GitLab을 활용한 CI/CD 파이프라인 구축과 달리 Github Actions에서는 EC2 Instance에 접속 후 실행까지 해주기 때문에 crontab 설정 등이 필요없음
- Docker Hub 대신 AWS S3를 사용하는 방법도 존재함
Github Actions를 활용한 CI/CD 파이프라인 구축 방법
- (Spring Boot, Gradle 기준)
- Github에 Repository 생성 및 프로젝트 업로드
- Dockerfile 생성 및 업로드
FROM adoptopenjdk/openjdk11
# COPY ./build/libs/<프로젝트명>-<버전>-SNAPSHOT.jar app.jar
COPY ./build/libs/CI-CD-Practice-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
- 예제에서 사용한 프로젝트 이름이 CI-CD-Practice이고 버전은 0.0.1이기 때문에 위와 같이 작성
- 자신의 프로젝트에맞게 수정하면 됨 => 잘 모르겠으면 https://chb2005.tistory.com/189 참고
- main branch, develop branch 생성 (이 과정은 안해도 됨)
- Github Repository에 진입 후 Actions 클릭
- Get started with GitHub Actions에서 Java with Gradle 클릭
- 다음 페이지에서 표시한 부분에 원하는 yml 파일 이름을 적어주고 내용에는 아래의 코드 붙여넣기
# Workflow 이름
name: Spring Boot & Gradle CI/CD
# 어떤 이벤트가 발생하면 workflow 실행할 지 명시
on:
# main 브랜치에 push나 pull request 발생 시
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
# 위 이벤트 발생 시 실행될 작업들
jobs:
build:
# VM의실행 환경 지정 => 우분투 최신 버전
runs-on: ubuntu-latest
# 실행될 jobs를 순서대로 명시
steps:
- name: Checkout
uses: actions/checkout@v3
# JDK 11 설치
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
# Gradle Build를 위한 권한 부여
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# Gradle Build (test 제외)
- name: Build with Gradle
run: ./gradlew clean build --exclude-task test
# DockerHub 로그인
- name: DockerHub Login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
# Docker 이미지 빌드
- name: Docker Image Build
run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }} .
# DockerHub Push
- name: DockerHub Push
run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }}
# EC2 인스턴스 접속 및 애플리케이션 실행
- name: Application Run
uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_KEY }}
script: |
sudo docker kill ${{ secrets.PROJECT_NAME }}
sudo docker rm -f ${{ secrets.PROJECT_NAME }}
sudo docker rmi ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }}
sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }}
sudo docker run -p ${{ secrets.PORT }}:${{ secrets.PORT }} \
--name ${{ secrets.PROJECT_NAME }} \
-e SPRING_DATASOURCE_URL=${{ secrets.DB_URL }} \
-e SPRING_DATASOURCE_USERNAME=${{ secrets.DB_USERNAME }} \
-e SPRING_DATASOURCE_PASSWORD=${{ secrets.DB_PASSWORD }} \
-d ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }}
- ${{ secrets.xxx }} => 환경변수라고 생각하면 됨. 아래에서 각각 추가할 예정
- 모두 작성했으면 Commit 진행
- Commit이 완료되면 Repository에 .github/workflows 경로에 yml 파일이 추가되어 있을 것임
- 수정하고 싶다면 이 파일을 수정하면 되고, 다른 workflow를 추가하고 싶다면 여기에 yml 파일을 추가하면 됨
- 만약 이 부분에서 막힌다면 Github Settings -> Developer Settings -> Personal access tokens에서 생성한 토큰에 들어가 workflow를 체크해주면 됨
- 이제 다시 Actions 탭에 들어가보면 workflow가 실행되고 있음 => 실패할 것임 => 위에서 적어두었던 환경변수들을 하나씩 채워넣어 줘야함
- Settings -> Secrets and variables -> Actions 진입
- New repository secret에 각각 추가
- DOCKERHUB_USERNAME : 본인의 Docker Hub Username
- DOCKERHUB_PASSWORD : 본인의 Docker Hub Password
- PROJECT_NAME : 프로젝트 이름 (ci-cd-practice) => 이 이름으로 Docker Hub에 올라가게 되고, Docker Container 이름도 이 이름으로 설정할 예정
- PORT : Docker을 실행시킬 포트 번호 (ex: 8080)
- DB_URL : 프로젝트에 사용될 DB의 URL (ex: jdbc:mysql://RDS주소:DB포트/DB명)
- DB_USERNAME : 프로젝트에 사용될 DB의 Username (ex: root)
- DB_PASSWORD : 프로젝트에 사용될 DB의 Password
- EC2_HOST : AWS EC2 인스턴스의 퍼블릭 IPv4 DNS (ex: ec2-52-79-213-143.ap-northeast-2.compute.amazonaws.com)
- EC2_USERNAME : AWS EC2 인스턴스의 Username (ex: ubuntu)
- EC2_KEY : AWS EC2 인스턴스를 생성할 때 저장된 pem 키
- MAC을 기준으로 터미널에서 cat <pem 키 경로>를 입력하면 (드래그앤 드롭해도 됨) '-----BEGIN RSA PRIVATE KEY-----'부터 '-----END RSA PRIVATE KEY-----'까지(맨 뒤에 %빼고)를 복사해서 이 값으로 넣어주면 됨
- 환경변수 세팅까지 끝났으면 아까 실패했던 workflow을 재실행시켜 주면 아래와 같이 workflow가 성공됨
- 여기까지 성공했으면 Github Actions를 활용한 CI/CD 파이프라인 구축이 완료된 것
- 이제 main 브랜치에 push나 pull request를 하고 Actions 탭에 들어가면 workflow가 실행되어 배포까지 완료하는 것을 확인할 수 있음
결과
반응형
'CI,CD' 카테고리의 다른 글
[CI/CD] GitLab을 활용한 CI/CD 파이프라인 구축 (+ Linux Crontab) (0) | 2023.03.16 |
---|---|
[AWS] EC2 인스턴스에 Docker 설치 및 프로젝트 배포 + 배포 중지 (0) | 2023.03.02 |
[AWS] EC2 인스턴스 생성 ( + SSH 접속, MAC ) (0) | 2023.03.02 |
[AWS] RDS 생성 (+ MySQL Workbench와 연결) (0) | 2023.02.28 |
[AWS] 보안그룹 생성 (0) | 2023.02.28 |