Git Action "Gradle script is not executable" 에러 해결
실행 환경
- AWS EC2 - Ubuntu 22.04
- window
- Git Action
- Spring Boot
에러 파악
Git Action을 이용해 SpringBoot gradle 빌드를 진행 했습니다.
Action에서 제공하는 yml을 사용하여 build를 했는데 gradlew를 실행할 수 없다는 에러가 발생했습니다.
gradle 동작 방식을 몰라서 삽질을 좀 했습니다.
Error: Gradle script '/home/runner/work/cloud-skills-sample-spring-boot-app/cloud-skills-sample-spring-boot-app/gradlew' is not executable.
원인 분석
찾아보니 gradlew 파일에 대한 실행 권한이 없어서 발생한 에러였습니다.
Action이 동작할 때 레포지토리의 파일을 클론하여 실행합니다.
이때 레포지토리에 올라가 있는 gradlew 파일의 실행 퍼미션이 없는 것입니다.
git ls-files --stage
우선 git에 저장된 gradlew 파일의 권한을 확인해보니 644입니다.
참고로 로컬에 저장된 gradlew의 권한은 777입니다.
레포지토리에 존재하는 파일의 권한과 로컬(window)에서의 권한이 다릅니다.
해결 방안
해결 방안 1
# workflow yaml에 추가
- name: Run chmod to make gradlew executable
run: chmod +x ./gradlew
코드를 직접 수정할 수 없는 경우 workflow에 권한을 주는 step을 추가해 build 할 수 있습니다.
깃헙에 있는 gradlew 파일 자체에 권한을 주는 것이 아니라 workflow가 실행되는 host에서 clone한 파일에 권한을 주는 것입니다.
(workflow에서 checkout을 통해 runs-on으로 지정한 호스트에 git clone합니다.)
빌드가 동작하는 것을 확인했습니다.
yml 파일에서 해당 step 삭제 시 다시 빌드 실패합니다.
해결 방안2
# 로컬에서 작업
git update-index --chmod=+x gradlew
update-index 명령을 사용해 스테이징 영역의 파일을 직접 조작할 수 있습니다.
update 된 파일에 대한 실행 권한을 설정하고 레포지토리에 push 합니다.
따라서 레포지토리 접근 권한이 없으면 이 방식을 사용할 수 없습니다.
스테이징 영역의 gradlew 파일의 권한은 644(rw-r--r--)입니다.
실행 권한을 추가하고 권한이 755(rwxr-xr-x)로 변경된 것을 확인했습니다.
빌드가 제대로 동작합니다.
혹시나 해서 확인해봤는데 git repository의 파일에 권한이 추가된 것이기 때문에 다시 clone해도 gradlew의 파일 권한은 그대로 유지됩니다.
해결 방안3
# 로컬에서 작업
chmod +x /path/to/gradlew
로컬에서 동작시킬 때 gradlew에 권한을 추가합니다.
EC2에서 직접 빌드할 때 빌드가 성공한 이유
Action yml 파일을 작성하기 전, EC2에서 git clone하여 직접 빌드를 먼저 시도했었습니다.
sudo apt-get update
sudo apt-get install openjdk-11-jdk
# 설치 확인
java -version
# spring boot 실행에 필요한 툴 설치
sudo apt install gradle
git clone https://github.com/Jeromy0515/cloud-skills-sample-spring-boot-app.git
gradle clean build
# cloud-skills-sample-spring-boot-app내에서 빌드하면 build/libs/내부에 jar파일 생성
nohup java -jar build/libs/cloud_skills_spring_boot_exam-0.0.1-SNAPSHOT.jar &
직접 빌드할 때는 에러가 발생하지 않았습니다.
- name: Build with Gradle
uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0
with:
arguments: build
action yml에서는 왜 gradle build에서 에러가 발생할까요.
https://github.com/gradle/gradle-build-action
공식 레포지토리를 먼저 확인했는데, gradle이 아닌 gradlew로 동작하는 것 같지만 확신이 서지는 않습니다.
그래서 문제 해결 후 workflow 로그에서 gradlew build 명령인 것으로 확인했습니다.
EC2에 git clone한 파일에는 당연히 gradlew에 실행 권한이 없습니다.
여기서 gradlew는 gradle wrapper의 줄임말이며 gradle을 조금 더 편하게 쓰기 위해 사용합니다.
개발자마다 로컬에 설치된 gradle과 java 버전이 다르고 프로젝트를 빌드할 때마다 변경하기는 어렵습니다.
그래서 gradlew가 등장했고, config 파일에 버전을 명시해 gradlew build를 하면 해당 버전으로 빌드됩니다.
직접 빌드할 때는 gradle build 명령을 주었고, action에서는 gradlew build 명령을 줍니다.
EC2에서 gradlew 명령을 해봤는데, 역시 찾을 수 없다고 나옵니다.
gradlew 파일에 실행 권한이 없기 때문입니다.
퍼미션 할당 후 gradlew를 사용해 빌드할 수 있습니다.
EC2에서 직접 빌드하는 방식이 가능했던 이유는 gradle을 직접 설치해서 gradle build를 했기 때문이었습니다.
그냥 sdkman으로 설치한 gradle의 실행권한을 직접 찾아봤습니다...
참고
https://bcp0109.tistory.com/362
https://spacetech.dk/error-gradle-script-home-runner-work-gradlew-is-not-executable.html
액션 뚱땅뚱땅하니까 재밌네요 「( ・∇・)「