카테고리 보관물: Jenkins

Jenkins – Publish over SSH 플러그인 키 설정

Publish over SSH는 Jenkins에서 빌드를 마치고, 특정 서버로 배포를 할 때 사용하는 플러그인이다.

SSH 접속을 위해서는 User ID와 비밀번호 또는 개인키/공개키가 필요하다. 우리는 개인키/공개키를 사용할 것이므로 비밀번호는 필요하지 않다.

혹여나 사용하는데 필요한 개인키/공개키 쌍이 준비되어 있지 않다면, 그림 1과 같이 ssh-keygen을 이용해서 키 쌍을 준비해야 한다.

그림 1. ssh-keygen 이용하여 개인키/공개키 쌍 만들기

* Publish over SSH 플러그인을 우선 설치한다.

* Jenkins 관리 > 시스템 설정 > SSH Servers로 이동한다.

* SSH Servers에 항목이 없다면, “추가” 버튼을 클릭한 후, 아래의 내용을 기입한다.

Name에는 식별할 수 있는 이름을 적어준다.
Hostname에 접속할 IP나 도메인을 적어준다.
Username에는 접속할 사용자 이름을 적어준다.
Remote Directory에는 접속하고자 하는 디렉토리를 입력한다.

그림 2. SSH Server 기본 정보 입력 예시

* 우측 하단에 있는 “고급” 버튼을 누르면 고급 항목들이 펼쳐진다.

그림 3. 고급 버튼 위치

* “Use password authentication, or use a different key” 여기에 체크를 해 준 후,
Key에 SSH에 사용할 개인키를 붙여넣어주면 Jenkins 상의 개인키 설정이 끝난다.

그림 4. 개인키 입력 화면

* 배포 대상인 서버로 접속한 후, 그림 5와 같이 사용하려는 공개키를 ssh-rsa부터 끝까지 모두 복사해서 ~/.ssh/authorized_keys 파일에 공개키를 한 줄 추가해 준다. authorized_keys 파일이 없다면 새로 작성하면 된다.

그림 5. 공개키 내용 열람

* Jenkins의 SSH Server 항목 우측 하단에 Test Configuration 버튼을 누른다.

그림 6. Test Configuration 버튼 위치

* 왼쪽에 Success라고 뜨는지 확인했다면 SSH 접속을 위한 개인키/공개키 설정이 끝난다.

그림 6. 성공 메시지

만약 성공하지 못한다면, Success 라는 내용 대신에 오류 메시지로 문제점을 알려줄 것이다. 해당 오류에 대해 구글링 후 문제를 해결하면 된다.

Bitbucket 저장소와 Jenkins webhook 연동 – proxy

Jenkins와 Bitbucket Repository를 Webhook으로 연동했을 때의 문제는 webhook 조건을 pull request merged로 설정하면 브랜치 여부에 관계없이 webhook을 날린다는 것이다. 필자가 앞서 포스팅 한 글(https://blog.osg.kr/archives/80)에서 사용하는 방법도 마찬가지다.

안드로이드 프로젝트의 dev 브랜치가 pull request 됐을 때 개발용 앱을 빌드하고, master 브랜치에는 tag가 push 됐을 때 상용 앱을 빌드하도록 하고 싶다면? 어떻게 해야 할까? 이는 실제 필자가 서비스 개발에서 활용하고 있는 방법이다.

필자는 Proxy 서버를 Node.js로 간단히 구축하여 개발서버에서 구동하고 있다. Bitbucket에서는 webhook을 날리는 request body를 로그로 남겨준다. 로그에 기록된 body를 참조해서 해당 json을 파싱해서 활용하면 된다.

프록시 작동 원리는 다음과 같다. 개발용 앱 빌드의 경우 Bitbucket에서는 브랜치에 상관없이 pull request가 merge되면 webhook을 Node.js로 구축한 Proxy 서버에 보낸다. 프록시 서버는 body의 내용을 확인해서 dev 브랜치로 머지된 것인 경우에만 Jenkins 서버로 다시 Webhook을 걸어준다.

상용 앱 릴리즈 시에는 Bitbucket에 tag가 push되면 Proxy로 일단 webhook이 걸린다. 프록시 서버에서 body의 내용을 확인해서 master branch에 태깅됐을 경우에만 Jenkins로 webhook을 걸어준다.

단순히 도식화하면 아래와 같다.

Bitbucket Webhook > Node.js proxy > Jenkins task item

물론 Proxy 서버는 꼭 Node.js를 쓸 필요는 없다. 자신이 쓰기 편한 프레임워크를 사용하면 된다.