Github actions와 Docker, EC2를 이용한 CI/CD 맨땅에 헤딩

Soondol·2024년 4월 30일

내게 CI/CD는
생각은 하고있었지만 실천은 못한..
그런것이다.

여태 그냥 알려준대로 사용하던 Jenkins,
또 서버에 파일을 직접 올려 배포를 해보면서,
저게 어떻게 동작하는지 알아봐야지,
배포 자동화를 내손으로 만들어보고싶다는 생각만 주구장창 했었다.

그러다 이젠 해봐야지싶어 시작해보기로했다.

먼저 이것저것 찾아본대로
DockerFile을 작성하고,
github actions의 .github/workflows/gradle.yml 작성하고,
하면되나..?

먼저 DockerFile은 루트디렉토리에 생성한 후

FROM openjdk:17
CMD ["./gradlew", "clean", "build"]
VOLUME /tmp
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

이처럼 작성했다.
추가로
docker-compose.yml과 .github/workflows/.yml 을 작성해주고,

services:
  app:
    container_name: concert_reservation_app
    image: {dockerHub username}/{docker_image_name}:{tag}
    expose:
      - "8080"
    ports:
      - "8080:8080"
name: github actions, dokcer, EC2

# 어떤 조건에서 workflow를 실행할것인가.
on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
permissions:
  contents: read

jobs:
  build:
    # runs-on은 github action의 CI서버 runner가 어떤 환경을 갖출지
    runs-on: ubuntu-latest
    
    # name(옵션)이름을 적어주고 uses나 run으로 어떤일을 할지 적는다.
    # uses는 이미 만들어져있는 것을 가져다쓰는 것, run은 직접 명령어를 적어주겠다
    steps:
      - name: Checkout
        uses: actions/checkout@v4

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

      - name: Build with Gradle
        run: |
          chmod +x ./gradlew
          ./gradlew clean build -x test

      # 테스트
      - name: Run Tests
        run: |
          ./gradlew test

      - name: Docker build & push to docker repo
        run: |
          docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
          docker build -f Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest .
          docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest

      - name: Deploy to server
        uses: appleboy/ssh-action@master
        id: deploy
        with:
          host: ${{ secrets.HOST }}
          username: ubuntu
          key: ${{ secrets.KEY }}
          envs: GITHUB_SHA
          script: |
            sudo docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
            sudo docker rm -f $(sudo docker ps -qa)
            cd ${{ secrets.DOCKER_COMPOSE_PATH }}
            sudo docker-compose pull app
            sudo docker-compose up -d
            sudo docker image prune -f

Dockerfile을 사용해 이미지를 빌드하고,
docker-compose를 사용해 이미지를 배포 및 실행하도록 했다.

이후 EC2에 docker 및 docker-compose를 설치했고,
소스코드를 main에 push하면 위의 일련의 과정이 수행이되어
EC2에서 확인할 수 있었다 !


트러블 슈팅에 대해 간략히 모아봐야겠다..

1. DockerFile 생성 후 무지성 build

docker build . -t myImage 이후
JAR_FILE에 대한 이슈가 나타났다.

ARG JAR_FILE=build/libs/*.jar
이 부분의 jar파일을 얻기위해 bootJar을 실행시켜준다.
그럼 build-libs-.......-SNAPSHOT.jar 파일이 생성된다 !









2. main push후 빌드 과정에서 이런 에러가 났다.


올바르지 않은 이미지 태그 형식으로 작성했다고한다.
나의 경우

docker build -f Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest .

이런식으로 작성했는데 docker login시 이메일로 로그인하게끔 작성해놨었다..
docker hub에서 내 username확인해서 바꿔주니 성공했다..

3. EC2에서의 docker-compose파일 찾을수 없음!


EC2서버에 git pull작업 이후에 해당 경로를
github action 파일 secrets.DOCKER_COMPOSE_PATH 부분에 넣어줘서 해결했다.


무지성 1회차 CICD를 경험해보고 많은 부족함을 느낀다...
다음번엔 제대로 이해하고 테스트 커버리지, 린트 등의 CI에 집중하여
도전해봐야겠다..

0개의 댓글