[Github Action] failed to compute cache key: failed to calculate checksum of ref ... 에러 발생

728x90

하고있는 작업

Github Action으로 ECS(Elastic Container Service)로 스프링부트 애플리케이션을 배포하려고한다.
github action script는 깃헙 액션에서 의도에 따라서 템플릿을 복붙해서 쓸 수 있게 잘 제공해주기 때문에 요리조리 잘 짬뽕해서 작성했다. (멀티모듈을 서비스별로 배포하는 부분이 조금 막혔지만 회사 코드들을 참고하면서 비슷하게 설정해봤다)

문제 상황

Github Action Script는 아래와 같이 작성했다. (궁금하면 아래에서 확인할 수있다)

더보기

해당 프로젝트는 저장소를 공개했기 때문에 직접 확인할 수 있다. 😃
링크: https://github.com/Rok93/physical-therapy/blob/main/.github/workflows/deploy.yml

name: Deploy to Amazon ECS

on:
  push:
    branches: [ "main" ]

env:
  AWS_REGION: ap-northeast-2
#  ECR_REPOSITORY: physical-theraphy-ecr-prod
  ECS_SERVICE: physical-theraphy-service
  ECS_CLUSTER: physical-theraphy-ecs-cluster-prod
  ECS_TASK_DEFINITION: physical-the경raphy-task
  
  CONTAINER_NAME: physical-theraphy-container

permissions:
  contents: read

jobs:

  build-jar:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Install JDK 17
        uses: actions/setup-java@v3.12.0
        with:
          distribution: 'temurin'
          java-version: '17'
          cache: 'gradle'

      - name: build Jar
#        run: ./gradlew bootJar --build-cache -Dorg.gradle.jvmargs=-Xmx4g
        run: ./gradlew bootJar -Dorg.gradle.jvmargs=-Xmx4g

  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    needs:
      - build-jar
    strategy:
      fail-fast: false
      matrix:
        service: [ app-api ] # 추후 배포할 서비스가 늘어나면 여기에 추가하면 됌
        environment: [ prod ]

    environment: ${{ matrix.service }}-${{ matrix.environment }}

    env:
      ECR_REPOSITORY: physicaltherapy-${{ matrix.service }}-${{ matrix.environment }}

    steps:
    - name: Checkout
      uses: actions/checkout@v3

    - name: Configure 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: ${{ env.AWS_REGION }}

    - name: Login to Amazon ECR
      id: login-ecr
      uses: aws-actions/amazon-ecr-login@v1

    - name: Build, tag, and push image to Amazon ECR
      id: build-image
      env:
        ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
        IMAGE_TAG: ${{ github.sha }}
        SERVICE_TAG: ${{ matrix.service }}
      run: |
        # Build a docker container and
        # push it to ECR so that it can
        # be deployed to ECS.
        docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $SERVICE_TAG
        docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
        echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT

    - name: Fill in the new image ID in the Amazon ECS task definition
      id: task-def
      uses: aws-actions/amazon-ecs-render-task-definition@v1
      with:
        task-definition: ${{ env.ECS_TASK_DEFINITION }}
        container-name: ${{ env.CONTAINER_NAME }}
        image: ${{ steps.build-image.outputs.image }}

    - name: Deploy Amazon ECS task definition
      uses: aws-actions/amazon-ecs-deploy-task-definition@v1
      with:
        task-definition: ${{ steps.task-def.outputs.task-definition }}
        service: ${{ env.ECS_SERVICE }}
        cluster: ${{ env.ECS_CLUSTER }}
        wait-for-service-stability: true

 

그런데 트리거가 발생해서 deploy Job이 실행됐을 때, 애플리케이션을 Docker Image로 build 하는 Job이 계속 실패했다.

명령어 자체가 잘못됐나 싶어서, 이것저것 수정해봤었는데 별다른 성과는 없었다.
구글링하면서 위와 비슷한 이슈 문의 글을 찾았다. >> 사실 딱히 해결책을 콕 찝어서 말해주는 사람은 없었으나 결국 경로문제라는 늬앙스의 의견들이 많았다. 

경로 문제를 의심하며 다시 에러 로그를 살펴보았다. 

ERROR: failed to solve: failed to compute cache key: failed to calculate checksum of ref moby::tsxtwwzzic4fhd2i0sw9qrb33: failed to walk /var/lib/docker/tmp/buildkit-mount2057748808/build/libs: lstat /var/lib/docker/tmp/buildkit-mount2057748808/build/libs: no such file or directory

내가 생각한 것과 실제 결과 중에 다른 부분이 무엇일까? 

내가 의도한 순서는 아래와 같다.

[1]SpringBoot 애플리케이션을 빌드해서 jar로 만든다(이 때, jar 파일은 {서비스모듈명}/build/libs/xxx.jar 로 생성) > [2] jar 파일에 접근해서 해당 파일을 root에 복사한다. > [3]docker image build를 한다. > [4] build한 image를 private ECR에 push 한다. > ... 

현재 문제되는 부분은              색깔로 처리했다. 
잘 생각해보면 [1]과 [2] 사이에서 내가 캐치하지 못한 것이 있을 것이라 생각했다. 🤔

다시 deploy.sh (github action 배포 스크립트) 파일을 살펴봤다. 
현재 Job 구성을 (1) 빌드하여 jar 파일을 만듦 (서비스가 여러개일 경우, 여러개의 jar 파일을 우선적으로 다 만든다)
(2) 빌드가 끝나서 모든 서비스의 jar 파일을 다 만들면 Deploy를 시작한다. 

(1)과 (2)가 분리된 상황이라는 것을 이때 인지했다. 
즉. build-jar 잡을 수행한 결과로 얻은 jar들은 Deploy job이 실행될 때의 

각각의 Job은 서로 다른 환경에서 실행되는 것이고 서로 다른 환경이니 실행의 결과를 당연히 공유할리 없었다.
실제로 두 잡을 실행하기전 각각의 잡을 실행하기전 Checkout을 진행하는데 이 때의 식별 값(id?)이 다르다는 것을 확인할 수 있다.

build.jar 잡
Deploly 잡

결과적으로 Job과 Job 사이에 data를 공유할 수 있는 방법이 필요한 듯 한데, 결과적으로 나는 cache를 쓰는 방식을 사용했다.
github action script에 각각의 서비스를 빌드해서 만든 jar 파일을 cache에 저장하고, docker image로 build할 때는 cache에 저장했던 jar 파일을 꺼내오는 부분을 추가했다. 

작업내용: https://github.com/Rok93/physical-therapy/commit/22f913e8ecf6dcc3335b43a673a04fd9ba658b2d

 

chore: github action 배포 스크립트 수정 · Rok93/physical-therapy@22f913e

kyeongrok-kim committed Aug 13, 2023

github.com

 

후기

아! 그래서 바꿨으니 이제 잘 동작하냐고 궁금한 분이 있을 수 있을 것 같다. 
잘 된다. docker image build까지는... 이제 push가 잘 안된다. 🫠 
이제는 이 부분을 해결해야한다. 

 

Cache 외에도 Artifacts를 활용한 방식도있는 듯 하니 궁금하다면 해당 포스팅을 참고해보면 좋을 것 같다!

참고자료: https://levelup.gitconnected.com/github-actions-how-to-share-data-between-jobs-fc1547defc3e

 

GitHub Actions — How To Share Data Between Jobs

Lately, I’ve got the chance to work with GitHub Actions, I had to share my front-end project build between multiple jobs, I did the…

levelup.gitconnected.com

 

728x90