celina의 이것저것

[cicd] 깃허브액션 cicd구축 본문

9oormthonUNIV/[kakao x goorm] 구름톤 유니브 단풍톤

[cicd] 깃허브액션 cicd구축

celinayk 2024. 11. 27. 17:47
반응형

1. 워크플로우 파일 생성: .github/workflows/ 디렉터리 안에 작성해야한다. 

name: CI/CD using GitHub Actions & Docker

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read

    steps:
      - uses: actions/checkout@v4


      - name: Print working directory
        run: pwd

      # 1. Set up JDK 17
      - name: Set up JDK 17
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'


      - name: Set Properties
        run: |
          mkdir -p src/main/resources
          echo "${{ secrets.APPLICATION_YML }}" | base64 --decode > src/main/resources/application.properties
          find src

      # 2. Build the Spring Boot application
      - name: Grant execute permission for gradlew
        run: chmod +x ./gradlew

      - name: Clean and Build with Gradle Wrapper
        run: ./gradlew bootJar

      # 3. Get current time
      - name: Get current time
        uses: 1466587594/get-current-time@v2
        id: current-time
        with:
          format: YYYY-MM-DDTHH-mm-ss
          utcOffset: "+09:00"

      - name: Show Current Time
        run: echo "CurrentTime=${{ steps.current-time.outputs.formatted }}"

      # 4. Docker image build
      - name: docker image build
        run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/munhwahansang_server:latest .

      # 5. DockerHub login
      - name: docker login
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_PASSWORD }}

      # 6. DockerHub image push
      - name: docker Hub push
        run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/munhwahansang_server:latest

      - name: 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

      # 7. EC2 인스턴스 접속 및 애플리케이션 실행
      - name: Application Run
        uses: appleboy/ssh-action@v0.1.6
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USERNAME }}
          key: ${{ secrets.EC2_SSH_PRIVATE_KEY }}

          script: |
            sudo docker ps -q | xargs --no-run-if-empty sudo docker stop
            sudo docker ps -a -q | xargs --no-run-if-empty sudo docker rm

            sudo docker rmi ${{ secrets.DOCKERHUB_USERNAME }}/munhwahansang_server || true
            sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/munhwahansang_server:latest
            
            sudo docker run -d -p 443:443 \
            --name munhwahansang_server \
            -v /etc/letsencrypt:/etc/letsencrypt:ro \
            -e SPRING_DATASOURCE_URL=${{ secrets.DB_URL }} \
            -e SPRING_DATASOURCE_USERNAME=${{ secrets.DB_USERNAME }} \
            -e SPRING_DATASOURCE_PASSWORD=${{ secrets.DB_PASSWORD }} \
            ${{ secrets.DOCKERHUB_USERNAME }}/munhwahansang_server:latest

 

2. GitHub Secrets 설정

이걸 해주는 이유는 저 yml파일에서 비밀번호, 같은 민감한 정보가 외부에 노출되지 않게 하기위해 따로 관리를 하는것이다.

 

 

3. Dockerfile 작성:  Spring Boot 애플리케이션을 Docker 컨테이너로 실행하기 위한 기본 설정이 필요하다.

FROM openjdk:17
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

 

4. ec2인스턴스에 도커설치

 

 

Docker Hub Push 워크플로 vs EC2 배포 워크플로

목적 이미지를 Docker Hub에 저장 이미지를 EC2에 배포 및 실행
Docker Hub 사용 최종 결과물을 저장소로 업로드 EC2가 이미지를 가져오기 위한 중간 저장소
EC2 연결 필요 없음 필요 (SSH 연결 등)
Docker 컨테이너 실행 로컬 또는 다른 환경에서 수동 실행 EC2 서버에서 컨테이너 자동 실행
복잡도 상대적으로 단순 비교적 복잡 (EC2 설정 및 연결 필요)
CI/CD 파이프라인 수준 CI만 포함 (배포는 수동) CI/CD 모두 포함 (자동 배포)

 

참고

https://velog.io/@sgwon1996/GitHub-Action%EC%9C%BC%EB%A1%9C-CICD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0

 

GitHub Action으로 CI/CD 구축하기

GitHub Action을 통해 이미지 빌드 및 업로드, 컨테이너 배포를 수행하는 파이프라인을 구축해보겠습니다.

velog.io

https://growth-coder.tistory.com/220

 

[Spring] 깃허브 액션으로 CI/CD 구축해보기 (스프링 부트)

CI/CD는 Continuous Integration/Continuous Delivery의 준말로 지속적인 통합과 지속적인 전달을 의미한다. 지속적인 통합(CI)은 지속적으로 품질 관리를 적용하는 프로세스를 실행시키는 것이다. 작은 단위

growth-coder.tistory.com

 

Comments