전 TIL 시행착오를 겪고 생각했다. 팀원의 의견도 받아서 CI/CD를 굳이 나눌 필요가 없다는거다.
나는 무작정 다른사람들도 다 CI CD 이렇게 나눠서 작업을 해서 나눠야 되는줄 알았다. 하지만 그렇지 않았다.
두개를 합치기로 했다.
name: Java CI/CD with Gradle
on:
push:
branches: [ "feat/ci-cd" ]
pull_request:
branches: [ "feat/ci-cd" ]
env:
ECR_REPOSITORY_NAME: my-java-app-repo
ECS_CLUSTER_NAME: MyEchoCluster
ECS_SERVICE_NAME: EchoBackService
AWS_REGION: ap-northeast-2
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build and Test with Gradle
run: ./gradlew clean build -x test
- name: Archive build artifacts
uses: actions/upload-artifact@v2
with:
name: built-artifact
path: build/libs/echo-0.0.1-SNAPSHOT.jar
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Download build artifact
uses: actions/download-artifact@v3
with:
name: built-artifact
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
- name: Log in to Amazon ECR
run: aws ecr get-login-password --region ${{ env.AWS_REGION }} | docker login --username AWS --password-stdin ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_KEY }}
- name: Build Docker image
run: docker build -t ${{ env.ECR_REPOSITORY_NAME }} .
- name: Tag Docker image
run: docker tag ${{ env.ECR_REPOSITORY_NAME }}:latest ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/${{ env.ECR_REPOSITORY_NAME }}:latest
- name: Push Docker image to ECR
run: docker push ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/${{ env.ECR_REPOSITORY_NAME }}:latest
- name: Deploy Service to ECS
run: |
aws ecs update-service --cluster ${{ env.ECS_CLUSTER_NAME }} --service ${{ env.ECS_SERVICE_NAME }} --force-new-deployment
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_KEY }}
합친 코드이다. 한번에 됐을까? 그럼 오만이다.
오류가 이렇게 발생했다. 이 오류에 대해서 엄청 고민했다. "뭐가 문제지? 왜 문제지?" 하지만, 이 오류는 사실 아주 간단한 것이었다. Docker 빌드 실패 오류였고, 그 이유는 내가 빌드를 하지 않아서 발생한 것이었다. 현재 CI/CD가 완전히 구현되지 않았기 때문에, 수동으로 도커 이미지를 빌드하고 런해줘야 했는데, 그걸 놓쳤던 것이다. 이 단순한 문제를 해결하느라 거의 4시간 이상을 찾아봤던 것 같다. 정말로 등잔 밑이 어두웠다. 문제는 바로 눈앞에 있었다. 이 오류를 다시 말하자면, Docker 빌드 과정에서 COPY build/libs/echo-0.0.1-SNAPSHOT.jar app.jar 명령어가 실패하면서 빌드가 중단되었다. 오류 메시지는 Docker가 복사하려는 파일이 존재하지 않음을 나타내고 있다. 즉, 애플리케이션을 빌드하지 않았기 때문에 발생한 문제였다. 빌드를 하지 않아서 build/libs/echo-0.0.1-SNAPSHOT.jar 파일이 생성되지 않았고, 결국 빌드를 실행해야 한다는 것을 뒤늦게 깨달았다. ㅠㅠㅠㅠㅠㅠ
이러한 트러블 슈팅 과정을 거치면서 여러개 있었지만 3개를 더 말해보겠다. 물론 간단한거다.
첫 번째: 트러블 슈팅 - AWS ECS 서비스 비활성화로 인한 업데이트 실패
AWS 비용 절감을 위해 ECS 서비스를 비활성화했기 때문에 발생한 문제였다. 우리의 돈은 한도가 있었고, 계속 켜놓으면 돈이 빠져나가기 때문에 조금이라도 아끼자고 서비스를 꺼놨는데, 깜빡하고 잊어버렸다. 이로 인해 서비스가 'active' 상태가 아니어서 업데이트가 실패했다. 이 문제는 서비스를 다시 활성화시킨 후 다시 시도하면 간단히 해결된다.
두 번째: 트러블 슈팅 - Dockerfile을 찾지 못해 Docker 빌드 실패
Docker 이미지를 빌드하려고 할 때, Dockerfile을 찾지 못해 빌드가 실패하는 문제가 발생했다. 이 문제는 Docker 빌드를 실행할 때 Dockerfile의 경로를 명확하게 지정하지 않았기 때문에 발생했다.
이를 해결하기 위해 명령어를 수정하여 Dockerfile의 경로를 명시적으로 지정하고, 이미지 이름을 환경 변수로 설정했다.
name: Build Docker image # Docker 이미지 빌드
run: docker build -t ${{ env.ECR_REPOSITORY_NAME }} -f Dockerfile . # Docker 이미지를 Dockerfile로 빌드
세 번째: 트러블 슈팅 - 아티팩트 복사 실패로 인한 Docker 빌드 오류
Docker 이미지를 빌드하기 전에, 빌드된 JAR 파일을 build/libs 디렉터리로 복사하는 단계에서 오류가 발생했다. cp 명령어가 파일을 복사하려고 했으나, 복사하려는 파일이 존재하지 않아 No such file or directory 오류가 발생한 것이다.
이를 해결하기 위해 먼저 build/libs 디렉터리를 생성하고, 그 후 JAR 파일을 복사하는 방식으로 문제를 해결했다.
name: Create build/libs directory # Docker 컨텍스트를 위한 디렉토리 생성
run: mkdir -p build/libs
name: Copy artifact to Docker context # 아티팩트를 Docker 컨텍스트로 복사
run: cp echo-0.0.1-SNAPSHOT.jar build/libs/echo-0.0.1-SNAPSHOT.jar # JAR 파일 복사
다음 TIL은 CI CD 마지막 TIL !
'TIL' 카테고리의 다른 글
TIL - 2024/08/21 (1) | 2024.08.20 |
---|---|
TIL - 2024/08/19 (0) | 2024.08.19 |
TIL - 2024/08/14 (0) | 2024.08.16 |
TIL - 2024/08/13 (0) | 2024.08.16 |
TIL - 2024/08/12 (0) | 2024.08.16 |