스프링부트 프로젝트 레포지토리에 깃허브 액션을 달아서 커밋시 ./gradlew build를 하고 도커 이미지로 빌드하여 자동으로 도커허브로 배포하는 작업을 진행중이었다. 다른 모든 job들은 성공을하는데 계속해서 빌드를 하는 과정에서 no such file or directory 에러가 났다.
괜히 worflows.yaml의 들여쓰기도 고쳐보고 도커파일도 수정해보고 경로도 수정해보고 시도를 하였지만 모두 실패
Error: buildx failed with: ERROR: failed to solve: lstat /tmp/buildkit-mount2454880079/build/libs: no such file or directory
그러다가 스프링부트 프로젝트를 빌드를 할 때의 폴더는 현재 폴더 경로의 build/libs인데 도커를 빌드 할 때에는 /tmp/buildkit-mount... 이라는 폴더에서 build/libs를 찾는것을 보았고 이 /tmp/buildkit이라는 폴더가 어떤 것인지 찾아보았다. 결국에는 이 폴더가 도커를 빌드할때 임시로 만들어지는 공간이라는것을 알았고 이 차이 때문에 build/libs를 못 찾고 있다는 것을 알게 되었다. 그래서 결국 도커 빌드를 하는 job의 폴더 위치를 context를 이용하여 gradlew build가 된 위치와 동일한 현재 경로를 설정해 주었더니 드디어 workflow가 성공할 수 있었다.
## githubactions workflows
name: Build and Push Docker Image
on:
push:
branches:
- main
jobs:
build-and-push-image:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name : Build with Gradle
run : ./gradlew build
- name: Check build result
run: |
if [ -d build/libs ]; then
echo "Contents of build/libs:"
ls -al build/libs
else
echo "build/libs directory not found"
exit 1
fi
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
id: docker_build
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: ggprgrkjh/kubernetes-spring-mysql-demo:latest