gitHubAction CI CD 따로 배포

wjd15sheep·2024년 5월 7일

AWS

목록 보기
3/3

CI 설정

docker

앞 선 블로그에서 설명한 것 처럼 도커는 어느 프로그램에 올려도 같은 시스템 환경에서 프로그램이 돌아갈 수 있게 하기 위해서 사용하는 프로그램이다. 배포에서 없어서는 안되는 소프트웨어이다.
그럼 프로젝트에 도커 파일을 생성해 준다.
최상단에 DockerFile

FROM amazoncorretto:17-alpine

ARG JAR_FILE=build/libs/*.jar

COPY ${JAR_FILE} app.jar

ENTRYPOINT ["java", "-jar", "/app.jar"]

FROM : 도커 이미지의 기반이 되는 베이스 이미지를 지정, amazoncorretto:17-alpine는 Amazon에서 제공하는 OpenJDK로 자바 버전 17보단 경량화된 리눅스 배포판

ARG JAR_FILE=build/libs/.jar: 도커 이미지를 빌드할 때 사용할 수 있는 인자를 선언하는 부분, JAR_FILE이라는 인자를 선언하고, 기본값으로 build/libs/.jar을 지정,
빌드된 자바 아티팩트의 위치를 지정하는 것

COPY ${JAR_FILE} app.jar : 도커 이미지 내부로 파일을 복사

ENTRYPOINT ["java", "-jar", "/app.jar"] : 도커 컨테이너가 시작될 때 실행될 기본 명령어를 지정, 여기서 java -jar /app.jar 명령어를 사용하여, 앞서 복사한 app.jar 파일을 실행하도록 설정

프로젝트에서 ./gradlew clean build => build를 통해 .jar 파일 생성
docker build -t name/github-actions-demo . => Docker를 통한 Docker Image 빌드

gitHubAction

github에서 배포 할 repository를 선택 위 상단 탭에서 gitAction을 눌러준다.

위와 같은 이미지에서 Java with Gradle를 선택

workflows/gradle.yml 파일이 생성이 되고 여기에 적은 내용이 CI CD 설정 파일이 된다.

name: Java CI with Gradle

# master 브랜치에 push, PR 이벤트 발생시 동작.
on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      # (1) 프로그램 빌드 (Java 빌드) 1) Java 및 Docker 빌드를 위한 환경 설정
      - uses: actions/checkout@v3
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      # (1) 프로그램 빌드 (Java 빌드) 2) Java 빌드를 위한 ./gradlew 파일 권한 변경
      - name: Run chmod to make gradlew executable
        run: chmod +x ./gradlew

      # (1) 프로그램 빌드 (Java 빌드) 3) Java 빌드
      - name: Spring Boot Build
        run: ./gradlew clean build

      # (2) Docker 이미지 빌드 1) DockerFile 을 기반으로 Docker Image 빌드
      - name: docker image build
        run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-demo .

      # (2) Docker 이미지 빌드 2) Docker Hub 에 Login
      - name: docker login
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_PW }}

      # (2) Docker 이미지 빌드 3) Docker Hub 에 빌드된 이미지 push
      - name: docker Hub push
        run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-demo

on 설정은 branch push가 된다면 자동으로 실행이 되는 트리거 브렌치를 설정하는 곳이다.
지금 설정은 main이 설정이 되어있다.
그외 설명은 주석으로 확인

username, password 값은 민감한 값들이 Github Action 스크립트에 그대로 입력되어있으면 아무나 탈취 가능해져 github에 MyProfile에서 Security에 Access Token을 생성

  • ${{ secrets.DOCKERHUB_USERNAME }}
  • ${{ secrets.DOCKERHUB_PW }}

먼저 Docker Hub 회원가입 후 My Profile에서 Security에 Access Token 생성
Github 프로젝트에서 Settings → Security → Secrets and Variable → Actions 

  • DOCKERHUB_USERNAME 은 Docker Hub 회원가입할때 입력한 유저네임(닉네임)
  • DOCKERHUB_PW 은 아까전에 Docker Hub 에서 발행했던 Access Token

모든 설정이 끝난뒤 해당 main 브랜치에서 아무거나 Git Push를 수행하면 Github Action이 동작된다.

=> github Action이 성공했으면
Docker Hub 내 저장소로 이동하면 업로드가 잘 되어있는 것을 확인 할 수 있다.

main 브랜치에 아무 커밋 시작

github Action 성공

docker hub에서도 이미지가 올라간 것을 확인 할 수 있다.

CD AWS EC2에서 앞서 CI 절차로 만든 docker image 구동

aws에서 인스턴스를 실행 보안 규칙에서 사용자 지정 TCP 포트 8080 포트 입력 -> 위치 무관(모든 ip) 추가할 것

인스턴스 실행 후 EC2내 모든 패키지 업데이트

도커를 인스턴스내 설치
sudo yum install docker -y

도커 엔진 구동
sudo service docker start

도커 login
docker login
Username, Password는 github에 설정한 값 그대로 사용

그러나 오류가 생겼다면

sudo chmod 666 /var/run/docker.sock
파일 권한을 666으로 변경하여 그룹 내 다른 사용자도 접근하도록 변경

다시 docker에 로그인 시도하면 성공할 것이다.

로그인 완료한 dockerhub에서 Docker Image를 다운로드
docker pull name/github-actions-demo
잘 받아졌는지 확인
docker images

Docker Image 구동 후 Docker Container 구동 확인
docker run -p 8080:8080 name/github-actions-demo

성공적으로 구동되는 것을 확인

docker Container 서버 확인
크롬과 같은 웹 브라우저로 Ec2의 퍼블릭 Ip :8080으로 접속 시도

정상적으로 접속이 가능한 것을 확인할 수 있다.

profile
성장 위해 노력하는 웹 개발자 주니어

1개의 댓글

comment-user-thumbnail
2024년 6월 13일

깃헙 액션 ci, cd 정리 감사합니다!! 헤매고 있었는데 잘보고가요

답글 달기