젠킨스 Freestyle project
아이템을 이용해 CI/CD 환경 구축을 하고 있었습니다. 저희가 만들어야하는 서버 아키텍처는 다음과 같아요.
그런데 문제는 젠킨스를 도커로 실행했기 때문에 Gitlab
에서 Webhook을 통해 프로젝트가 전송되는 위치도 젠킨스 컨테이너인 Guest OS에 저장됩니다. 그림으로 보면 이런 느낌이죠.
위의 사진처럼 Gitlab
에서 특정 브랜치에 푸쉬 이벤트가 발생하면 젠킨스가 이를 인식하고 해당 브랜치의 프로젝트 파일들을 fetch
합니다. 그리고 그 프로젝트 파일들은 젠킨스 컨테이너 내부에 저장이 돼요. 근데 저희가 원하는건 저 프로젝트 파일들이 젠킨스 내부가 아니라 Host OS에 저장되는거에요.
이를 해결하기 위해 젠킨스에는 Publish Over SSH
라는 플러그인을 이용해요. 연결할 서버의 SSH 접속 정보를 입력하면 필요할 때 해당 서버와 커넥션을 맺을 수 있는 플러그인이에요.
저도 Publish Over SSH
플러그인을 사용해서 프로젝트 파일들을 압축하고 Host OS의 지정 위치로 파일을 전송시키려고 했어요. 그런데 다음과 같은 에러가 발생했어요 😢
문제의 원인을 바로 얘기하자면, 젠킨스 컨테이너에서 전송할 때 사용할 권한은 uid=1000(jenkins)
인 일반 권한인데 파일이 저장될 Remote Directory의 권한이 달라서 발생했어요.
jenkins-test라는 디렉토리가 Remote Directory인데 보시면 root:root 권한으로 되어있는 걸 알 수 있죠. 젠킨스의 권한으로는 저 디렉토리에 파일을 전송할 수가 없어서 발생한 에러였죠.
해결법은 간단해요! 저 Remote Directory의 권한을 젠킨스의 권한과 똑같이 맞춰주면 되죠. 명령어는 sudo chown 1000:1000 jenkins-test
라고 입력해주면 됩니다.
그러면 jenkins-test 디렉토리의 권한이 바뀐 것을 확인할 수 있습니다!! (ubuntu 계정의 uid도 1000번이기 때문에 같은 권한입니다!)
이 상태로 젠킨스를 다시 빌드해보면!!
파일이 성공적으로 전송된걸 확인할 수 있습니다!!
이제 CI/CD 구축을 할 수 있을 것 같네요!!!!!!!!!!