Infra

[Trouble Shooting] Windows와 Linux의 파일 권한 차이

yerinpark 2024. 2. 20. 15:04

문제점 발생

Jenkins에서 파일 실행 권한이 없어서 gradlew 스크립트를 실행할 수 없는 문제

 

Windows에서 개발한 프로젝트를 github에 업로드 후 Jenkins에 다운로드 받은

-rw-r--r-- 1 jenkins jenkins 8692 Feb 20 05:12 gradlew 의 권한과

 

Windows에서의

rwxr-xr-x 1 Admin 197121 8692 Feb 20 09:17 gradlew* 권한이 달랐다.

 

그 이유는

Windows와 Unix 계열 운영체제(예: Linux, macOS)에서는 파일 권한 표현 방식이 다르기 때문이다.

  • Windows에서는 **rwxr-xr-x**와 같이 표현하지 않는 대신에 파일 속성을 통해 권한을 설정하고
  • Unix 계열 운영체제에서는 **rwxr-xr-x**와 같은 표기법을 사용하여 각각의 권한을 표현한다.

파일 속성과 권한 표현법이 다르기 때문에, Git 저장소를 Windows에서 Clone한 경우에는 해당 파일들이 Windows 스타일의 권한을 가지게 된다. 그러나 Jenkins 서버에서는 Unix 계열 운영체제를 사용 중이므로 Jenkins에서는 파일 실행 권한이 없어서 gradlew 스크립트를 실행할 수 없게 된다.

 

해결 방법은 다음과 같이 적용해주면 된다.

  1. gradlew 스크립트 실행 권한 추가: chmod +x gradlew 이 명령을 gradlew 스크립트가 있는 디렉토리에서 실행하여 gradlew 파일에 실행 권한을 추가한다.
  2. chmod +x gradlew
  3. 변경된 파일을 Git에 커밋 및 푸시:
  4. 변경된 권한을 Git에 커밋하고, Jenkins에서 이를 다시 Clone할 때 변경된 권한이 적용된다.
git add gradlew
git commit -m "Add execute permission to gradlew"
git push

이렇게 하면 Jenkins에서 gradlew 스크립트를 실행할 때 권한 문제가 발생하지 않는다.

 

해결 방법(git bash)

Admin@1-28 MINGW64 /c/cloud/04.spring/step06_ci_test (main)
$ git ls-tree HEAD
100644 blob 7f915e854f0f664ece4c9307c07fb647cc1869b0    .gitignore
100644 blob d5ad0a9ae1f1a996a49b1c6d50ea655c7bac8c89    README.md
100644 blob 498675c2bc091d1599cca09b2fc0b62f22fe70bb    build.gradle
040000 tree 55db975f04cca2f3a8faf1f93ee2fd8abff54f39    gradle
100644 blob 1aa94a4269074199e6ed2c37e8db3e0826030965    gradlew
100644 blob 93e3f59f135dd2dd498de4beb5c64338cc33beeb    gradlew.bat
100644 blob 0763b5e1987100709136c8449f8a1a9353886a92    settings.gradle
040000 tree 9d3abd93a049704863950cd69f59734980e032f0    src

Admin@1-28 MINGW64 /c/cloud/04.spring/step06_ci_test (main)
$ git update-index --add --chmod=+x gradlew

Admin@1-28 MINGW64 /c/cloud/04.spring/step06_ci_test (main)
$ git status
On branch main
Your branch is up to date with 'origin/main'.

Changes to be committed:
  (use "git restore --staged ..." to unstage)
        modified:   gradlew

Admin@1-28 MINGW64 /c/cloud/04.spring/step06_ci_test (main)
$ git add .

Admin@1-28 MINGW64 /c/cloud/04.spring/step06_ci_test (main)
$ git status
On branch main
Your branch is up to date with 'origin/main'.

Changes to be committed:
  (use "git restore --staged ..." to unstage)
        modified:   gradlew

Admin@1-28 MINGW64 /c/cloud/04.spring/step06_ci_test (main)
$ git commit -m "[Update] gradlew 실행 권한"
[main f80c7d4] [Update] gradlew 실행 권한
 1 file changed, 0 insertions(+), 0 deletions(-)
 mode change 100644 => 100755 gradlew

Admin@1-28 MINGW64 /c/cloud/04.spring/step06_ci_test (main)
$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

Admin@1-28 MINGW64 /c/cloud/04.spring/step06_ci_test (main)
$ git push origin main
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 258 bytes | 258.00 KiB/s, done.
Total 2 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To <https://github.com/parfait2/fisa240220.git>
   2e9bcc6..f80c7d4  main -> main

Admin@1-28 MINGW64 /c/cloud/04.spring/step06_ci_test (main)
$ git status
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

 

이제 Jenkins에서 실행 권한이 부여된 것을 확인할 수 있다.