반응형

Github Actions를 활용한 CI/CD 파이프라인 구축 개념

  1. EC2 Instance 생성, EC2 Instance에 Docker 설치, Docker Hub 회원가입이 되어있다고 가정
  2. Github Repository에 프로젝트의 추가사항이나 변경사항 push 혹은 merge
  3. Github Actions에서 push 혹은 merge가 된 것을 확인
  4. Update된 Project를 빌드함
  5. 빌드한 결과로 Doocker Image 생성
  6. 생성한 Docker Image를 Docker Hub에 업로드
  7. EC2 Instance에 SSH로 접속 후 Docker Hub에 업로드 된 이미지로 프로그램 실행
  • 수정사항을 Github에 올리기만 해준다면 다음 과정은 Github Actions에서 모두 처리
  • GitLab을 활용한 CI/CD 파이프라인 구축과 달리 Github Actions에서는 EC2 Instance에 접속 후 실행까지 해주기 때문에 crontab 설정 등이 필요없음
  • Docker Hub 대신 AWS S3를 사용하는 방법도 존재함

Github Actions를 활용한 CI/CD 파이프라인 구축 방법

  1. (Spring Boot, Gradle 기준)
  2. Github에 Repository 생성 및 프로젝트 업로드
  3. 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 참고
  1. main branch, develop branch 생성 (이 과정은 안해도 됨)
  2. Github Repository에 진입 후 Actions 클릭
  3. Get started with GitHub Actions에서 Java with Gradle 클릭
  4. 다음 페이지에서 표시한 부분에 원하는 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 }} => 환경변수라고 생각하면 됨. 아래에서 각각 추가할 예정
  1. 모두 작성했으면 Commit 진행
    • Commit이 완료되면 Repository에 .github/workflows 경로에 yml 파일이 추가되어 있을 것임
    • 수정하고 싶다면 이 파일을 수정하면 되고, 다른 workflow를 추가하고 싶다면 여기에 yml 파일을 추가하면 됨
    • 만약 이 부분에서 막힌다면 Github Settings -> Developer Settings -> Personal access tokens에서 생성한 토큰에 들어가 workflow를 체크해주면 됨
  2. 이제 다시 Actions 탭에 들어가보면 workflow가 실행되고 있음 => 실패할 것임 => 위에서 적어두었던 환경변수들을 하나씩 채워넣어 줘야함
  3. Settings -> Secrets and variables -> Actions 진입
  4. 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-----'까지(맨 뒤에 %빼고)를 복사해서 이 값으로 넣어주면 됨
  1. 환경변수 세팅까지 끝났으면 아까 실패했던 workflow을 재실행시켜 주면 아래와 같이 workflow가 성공됨
  2. 여기까지 성공했으면 Github Actions를 활용한 CI/CD 파이프라인 구축이 완료된 것
  3. 이제 main 브랜치에 push나 pull request를 하고 Actions 탭에 들어가면 workflow가 실행되어 배포까지 완료하는 것을 확인할 수 있음

결과

반응형

↓ 클릭시 이동

복사했습니다!