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


이를 통해, 산출물을 빌드하는 작업과 해당 산출물을 통해 도커 이미지를 빌드하고 푸시하는 작업을 분리할 수 있다.
다만 해당 명령어를 사용하는 데 있어서 주의해야 할 점이 있다.
1. download-artifact의 path는 아티팩트가 저장되는 경로

필자는 처음에 다음과 같이 작성했었다. 이렇게 작성한 의도는 다음과 같았다.
- 이전 job에서 빌드한 *.jar 파일을 업로드하였고, 해당 파일을 다운로드 받는다.
- 다운로드 받은 *.jar 파일을 ./build/libs 폴더에 app.jar라는 이름으로 저장한다.
하지만 공식 문서에서는 다음과 같이 나와있다.

아티팩트가 저장되는 경로를 지정하는 것이므로 위 사진과 같이 작성할 경우, app.jar라는 폴더에 저장하고 말 것이다.
사실 path라는 이름을 통해 바로 알 수 있는 내용임에도 도커 파일에서 COPY 명령어를 사용하는 것과 혼동했던 것 같다...
# Github Actions에서 다운로드한 빌드 산출물을 빌드용 컨테이너에 복사
COPY ./build/libs/*.jar app.jar
-> 로컬 파일을 복사함과 동시에 컨테이너에 새로운 이름으로 저장 가능
이처럼 도커 파일에서 사용되는 COPY 명령어는 파일을 복사함과 동시에 새로운 이름으로 지정이 가능하다. 무의식적으로 Github Actions에서도 이렇게 해도 될줄 알았나보다...


다운로드한 빌드 산출물을 확인하기위해 ls -l 명령어를 수행했을 때도 오른쪽과 같이 실행가능한 jar 파일이 보여야 정상이다. 왼쪽 사진은 app.jar라는 폴더가 생성되어있다. 물론 리눅스의 권한체계를 잘 알았더라면 금방 해결했을 수도 있다.
- d로 시작한다면 이는 Directory(폴더)를 의미 (ex. drwxr-xr-x)
- -로 시작한다면 이는 File을 의미 (ex. -rw-r--r--)
오른쪽 사진과 같이 폴더가 아닌 파일이 저장되어 있어야 올바른 것이다.
따라서 EC2에서 빌드한 이미지를 실행했을 때, 계속 실행이 되지 않았다.
또한 docker logs <컨테이너 이름> 을 실행했을 때 이런 에러가 났던 것이다.

2. mkdir -p 명령어를 통해 빌드 산출물 다운로드할 폴더 생성
Github Action Runner 서버에는 로컬에 있지 않은 폴더를 직접 생성해야 한다.
이 때, mkdir 명령어에 -p 옵션을 주어 생성한다.
mkdir 명령어의 p 옵션
-p, --parents no error if existing, make parent directories as needed

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