Gitple이 사용하는 간단한 CI(Continuous Integration)를 공개합니다.
이전 블로그글 CI - 지속적 통합 에서 설명했던 내용을 적용하기 위해 간단히 만든 도구입니다.
Github을 이용하시는 분들은 리눅스 서버에 손쉽게 적용할 수 있습니다.
전체 흐름을 이해하기 쉽도록 동작 순서대로 나열해 보았습니다.
- 대상 git 저장소:
git push
- Github: 사용자가 등록한 CI의 URL로 webhook 전달
- CI: webhook push 이벤트 받음
- CI: 빌드 및 유닛 테스트 작업등을 수행
- CI: 결과 저장 및 Web 으로 조회 가능
- Slack: 실패할 경우 슬랙 알람 노티
주요 기능은
- Github 에 코드 push 될 때 마다 빌드를 하고 단위 테스트등의 다양한 작업을 수행할 수 있습니다.
- 수행된 작업이 실패하거나 지속적으로 실패하다가 성공하면 , Slack 을 통해 노티합니다.
- 수행된 작업의 결과를 웹으로 확인 할 수 있습니다.
사전 작업
Gitple CI 저장소를 clone
하고, 필요한 node module을 설치합니다.
1 | $ git clone https://github.com/gitple/ci.git |
HTTPS를 위한 개인키(key.pem)와 공개키를(cert.pem) 현재 디렉토리에 둡니다. 다음 명령으로 self-signed 키를 생성할 수 있습니다.
1 | $ npm cert |
Github 설정 하기
대상 저장소
-> Settings
-> Webhooks
1 | Payload URL: http://your_ci_server.example.com:{ci listening port}/ |
Deploy key 등록
공개되지 않은 저장소인 경우, 암호 입력없이 접근할 수 있도록 Deploy key를 생성하여 등록합니다.
대상 저장소
-> Settings
-> Deploy keys
Token 을 생성하여, token을 url에 포함하는 방법도 있습니다.
방화벽 허용
- Webhook 포트는 github의 IP대역(
192.30.252.0/22
)으로부터의 접속만 허용해야 합니다.
https://help.github.com/articles/about-github-s-ip-addresses/
- 또한, 작업로그를 확인하는 웹포트도 제한적으로 허용해야 합니다.
사용법
Command line
옵션 사용법입니다.
1 | ./app.js -h |
다음의 수행명령 예를 설명하겠습니다.
먼저 이미 PORT 51234 를 listen
하고 있는 프로세스가 있다면, 종료 후 수행합니다.
비밀번호는 secretpass
이며, PORT 51234 에서 github webhook을 기다립니다. https://{your_host}:8443 에 접속하면 작업 수행 로그를 확인할 수 있습니다. 이때 계정은 admin
, 암호는 secretpass
입니다.
1 | # kill running ci process. |
CI_SECRET
환경변수로 비밀번호를 지정합니다.-s
옵션을 사용할 수도 있지만, command line에 노출되지 않도록하기 위함입니다. 아래에 설명할 Github webhook에서 지정한 값과 동일해야 합니다. 또한, 이 값은 웹접속시의 인증암호로도 사용됩니다.
CI 작업 설정
config.json
파일을 설정합니다.
notificaiton
- 현재 Slack만 지원합니다.
- Slack의 webhook url과 채널을 지정합니다. 예)
#dev_ci
jobs
jobs
: 수행할 작업 어레이. 나열된 순서대로 수행됩니다.repoPath
: 대상 저장소를 clone한 디렉토리의 절대 경로를 지정.targets
: 스트링 혹은 어레이. 커밋된 소스코드 파일 중 지정된 경로로 시작하면(OR
조건임),commands
에 지정된 명령을 수행합니다.*
이면, 무조건commands
에 지정된 명령을 수행합니다.commands
: 스트링 혹은 어레이.targets
에 지정된 조건에 부합되는 경우, 주어진 명령어를 순서대로 수행합니다. 이때 명령어가 실패 하면 바로 멈추고 Slack 노티를 보냅니다.
config.json 예
1 | { |
마치면서…
Gitple 팀은 앞으로도 다양한 오픈소스를 공개할 예정입니다.