Github Actions 빌드 산출물 다운로드 시 주의할 점

필자는 Github Actions의 @actions/upload-artifact와 @actions/download-artifact 를 활용하여 각 작업 간 빌드 산출물을 공유할 수 있도록 하였다.

etc-image-0etc-image-1
build 파일을 업로드 하는 job(좌), build 파일을 다운로드하는 job(우)

 

이를 통해, 산출물을 빌드하는 작업과 해당 산출물을 통해 도커 이미지를 빌드하고 푸시하는 작업을 분리할 수 있다.
다만 해당 명령어를 사용하는 데 있어서 주의해야 할 점이 있다.

 

1. download-artifact의 path는 아티팩트가 저장되는 경로

etc-image-2
초기에 작성했던 잘못된 코드

필자는 처음에 다음과 같이 작성했었다. 이렇게 작성한 의도는 다음과 같았다.

  1. 이전 job에서 빌드한 *.jar 파일을 업로드하였고, 해당 파일을 다운로드 받는다.
  2. 다운로드 받은 *.jar 파일을 ./build/libs 폴더에 app.jar라는 이름으로 저장한다.

하지만 공식 문서에서는 다음과 같이 나와있다.

etc-image-3

아티팩트가 저장되는 경로를 지정하는 것이므로 위 사진과 같이 작성할 경우, app.jar라는 폴더에 저장하고 말 것이다.
사실 path라는 이름을 통해 바로 알 수 있는 내용임에도 도커 파일에서 COPY 명령어를 사용하는 것과 혼동했던 것 같다...

 

# Github Actions에서 다운로드한 빌드 산출물을 빌드용 컨테이너에 복사
COPY ./build/libs/*.jar app.jar

-> 로컬 파일을 복사함과 동시에 컨테이너에 새로운 이름으로 저장 가능

 

이처럼 도커 파일에서 사용되는 COPY 명령어는 파일을 복사함과 동시에 새로운 이름으로 지정이 가능하다. 무의식적으로 Github Actions에서도 이렇게 해도 될줄 알았나보다...

 

etc-image-4etc-image-5
수정 전(좌), 수정 후(우)

 

다운로드한 빌드 산출물을 확인하기위해 ls -l 명령어를 수행했을 때도 오른쪽과 같이 실행가능한 jar 파일이 보여야 정상이다. 왼쪽 사진은 app.jar라는 폴더가 생성되어있다. 물론 리눅스의 권한체계를 잘 알았더라면 금방 해결했을 수도 있다.

  • d로 시작한다면 이는 Directory(폴더)를 의미 (ex. drwxr-xr-x)
  • -로 시작한다면 이는 File을 의미 (ex. -rw-r--r--)

오른쪽 사진과 같이 폴더가 아닌 파일이 저장되어 있어야 올바른 것이다.
 
따라서 EC2에서 빌드한 이미지를 실행했을 때, 계속 실행이 되지 않았다.
또한 docker logs <컨테이너 이름> 을 실행했을 때 이런 에러가 났던 것이다.

etc-image-6

2. mkdir -p 명령어를 통해 빌드 산출물 다운로드할 폴더 생성

Github Action Runner 서버에는 로컬에 있지 않은 폴더를 직접 생성해야 한다.
이 때, mkdir 명령어에 -p 옵션을 주어 생성한다.

mkdir 명령어의 p 옵션
-p, --parents no error if existing, make parent directories as needed

 

etc-image-7
폴더에 존재하지 않는 build 및 하위 폴더 libs 생성

build 폴더가 없는 상태에서 p 옵션 없이 명령어를 수행할 경우, No such file ~ 에러가 발생한다.
libs 폴더를 생성하기에 앞서 build라는 폴더가 존재하지 않기 때문이다.
따라서 특정 폴더를 생성에 필요한 상위 폴더까지 자동으로 생성하기 위해 p 옵션을 줘야 한다.
(기존에 폴더가 있더라도 에러가 발생하지 않기 때문에 p 옵션을 주는게 좋다.)
 
 
참고:
https://stackoverflow.com/questions/22737933/mkdirs-p-option

mkdir's "-p" option

So this doesn't seem like a terribly complicated question I have, but it's one I can't find the answer to. I'm confused about what the -p option does in Unix. I used it for a lab assignment while

stackoverflow.com

https://github.com/actions/download-artifact

GitHub - actions/download-artifact

Contribute to actions/download-artifact development by creating an account on GitHub.

github.com