[Jenkins] 깃허브와 연동하여 엔진엑스-리액트 자동배포 하기
서론
프로젝트를 진행하면서 업데이트가 있을 때마다 배포하는 과정은 매우 번거롭다. 특히 한창 개발 중인데 https 연결이 필요한 기능을 테스트하기 위해서는 반드시 서버에 배포가 된 상태여야 한다. 그래서 프론트엔드 담당이 어떤 부분을 수정하면 백엔드 담당이 매번 재배포했어야 하기 때문에 번거롭기도 하고 실시간으로 소통이 안되면 작업이 지연될 수 밖에 없어서 이를 해결하고자 자동배포를 구축하였다.
+) 실제로 설정한 순서대로 하다보니 설정 중간중간에 작업해주는 과정이 몇 번 있다. 젠킨스 프로젝트 설정을 한번에 하고 싶다면 2, 4, 6번을 먼저 진행해준 뒤 1번부터 읽으면 된다.
본론
1. 젠킨스에 프로젝트 추가
젠킨스 페이지에 접속해서 새로운 Item으로 들어간다.
이름을 적어주고, Freestyle project를 선택한다.
General에 필요한 부분이 있으면 채워주고, 소스 코드 관리에서 깃을 선택하고 Repository URL과 Credentials을 선택해준다. Credentials이 없다면 2번을 따라 만들어준다.
2. 젠킨스 깃허브 Credentials 생성
Dashboard -> admin -> Credentials -> User -> Global credentials에 들어가서, adding some credentials을 눌러준다.
Kind는 Username with password로 설정하고, Username은 깃허브 아이디, Password는 깃허브에서 토큰을 발급받아 넣어준다(깃허브 정책 변경에 의해 토큰 방식으로 로그인해야한다.)
그럼 아래와 같이 Credentials이 생성된다.
3. 젠킨스 프로젝트 설정 - 1
프로젝트 설정에서 빌드 유발에서 GitHub hook trigger for GITScm polling을 선택해준다. 깃허브 master에 업데이트가 있을 때마다 자동으로 빌드하기 위한 과정이다.
4. 노드 플러그인 설치
Dashboard -> Plugin Manager에서 설치 가능 탭을 누르고 node를 검색하면 NodeJS가 나온다. 이걸 설치해준다.
설치가 완료되었으면 NodeJS 설정을 해줘야 한다. Global Tool Configuration으로 들어간다.
아래로 내리다 보면 NodeJS 부분이 있다. Add NodeJS를 눌러준다.
노드의 이름을 적고 버전을 선택해준다. 필요한 부분이 있다면 추가로 설정하고 저장한다.
5. 젠킨스 프로젝트 설정 - 2
다시 프로젝트 설정으로 돌아와서, Provide Node & npm bin/ folder to PATH를 선택하고 조금 전에 설정해 둔 노드를 선택해준다.
Build에서 빌드를 위한 명령어들을 넣어준다. 기본적으로 깃허브에 업데이트가 있으면 /var/lib/jenkins/workspace/[젠킨스 프로젝트 이름]에 pull이 된다.
6. 빌드 후 작업을 위한 플러그인 설치
빌드 후 명령어들을 동작시키기 위해서 플러그인 설치에서 post build task를 설치받는다.
7. 젠킨스 프로젝트 설정 - 3
빌드 후 조치에서 post build task를 선택한다. 필요한 부분을 채워준다.
script 부분에는 빌드 후에 어떤 작업을 할지 적어준다. Run script only if all previous steps were successful을 선택해주면 순서대로 동작하면서 fail 발생 시 작업을 멈춘다.
8. 깃허브와 연동
젠킨스 프로젝트와 연결한 레포지토리로 가서, Setting에 들어간다.
Code and automation - Webhooks로 들어간다.
webhook을 추가한다.
젠킨스와 연결된 ip주소 뒤에 /github-webhook/ 을 넣어서 Payload URL을 채워준다(슬래시까지 넣어야 한다.)
Content type은 application/json을 선택해주고 나머지 설정을 해준다.
이제 깃허브에 업데이트가 있을 때마다 설정해 둔대로 빌드와 배포가 이뤄진다.
+) 젠킨스가 서버의 관리자 권한이 필요할 때
빌드 후 조치에서 sudo 명령어를 사용하려면 젠킨스에게 관리자 권한을 부여해주어야 한다. 이때는 아래와 같이 해준다.
1. 관리자 권한 설정 파일을 연다
sudo vim /etc/sudoers
2. Jenkins에게 관리자 권한을 준다.
jenkins ALL=(ALL) NOPASSWD: ALL
결론
프로젝트를 진행하는게 굉장히 편리해졌다. 자동배포의 중요성.