CI - 지속적 통합 도구, 오픈소스 공개

Gitple이 사용하는 간단한 CI(Continuous Integration)를 공개합니다.
이전 블로그글 CI - 지속적 통합 에서 설명했던 내용을 적용하기 위해 간단히 만든 도구입니다.

https://github.com/gitple/ci

Github을 이용하시는 분들은 리눅스 서버에 손쉽게 적용할 수 있습니다.
전체 흐름을 이해하기 쉽도록 동작 순서대로 나열해 보았습니다.

  1. 대상 git 저장소: git push
  2. Github: 사용자가 등록한 CI의 URL로 webhook 전달
  3. CI: webhook push 이벤트 받음
  4. CI: 빌드 및 유닛 테스트 작업등을 수행
  5. CI: 결과 저장 및 Web 으로 조회 가능
  6. Slack: 실패할 경우 슬랙 알람 노티

주요 기능은

  • Github 에 코드 push 될 때 마다 빌드를 하고 단위 테스트등의 다양한 작업을 수행할 수 있습니다.
  • 수행된 작업이 실패하거나 지속적으로 실패하다가 성공하면 , Slack 을 통해 노티합니다.

CI 작업 결과 로그 파일

  • 수행된 작업의 결과를 웹으로 확인 할 수 있습니다.

CI 작업 결과 로그 파일

사전 작업

Gitple CI 저장소clone하고, 필요한 node module을 설치합니다.

1
2
3
$ git clone https://github.com/gitple/ci.git
$ cd ci
$ npm install

HTTPS를 위한 개인키(key.pem)와 공개키를(cert.pem) 현재 디렉토리에 둡니다. 다음 명령으로 self-signed 키를 생성할 수 있습니다.

1
$ npm cert

Github 설정 하기

대상 저장소 -> Settings -> Webhooks

1
2
3
4
5
6
Payload URL: http://your_ci_server.example.com:{ci listening port}/
Content type: application/json
Secret: **your_secret**
[v] Just the push event.
[v] Active
Press "Disable SSL verification" on self-signed certification.

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
2
3
4
5
6
7
8
9
10
11
./app.js -h
Usage: app [options]
Options:
-c, --config <path> set config path. default ./config.json
-p, --port <n> listening port(required)
-w, --webport <n> web listing port. default 443
-n, --files <n> the max number of log files to keep. default 100
-s, --secret <secret> webhook secret. use CI_SECRET env if not defined
-h, --help output usage information

다음의 수행명령 예를 설명하겠습니다.

먼저 이미 PORT 51234 를 listen하고 있는 프로세스가 있다면, 종료 후 수행합니다.

비밀번호는 secretpass 이며, PORT 51234 에서 github webhook을 기다립니다. https://{your_host}:8443 에 접속하면 작업 수행 로그를 확인할 수 있습니다. 이때 계정은 admin, 암호는 secretpass 입니다.

1
2
3
# kill running ci process.
$ CI_PID=`lsof -i :51234 | grep LISTEN | awk '{print $2}'`; [ -n "$CI_PID" ] && kill -9 "$CI_PID"
$ CI_SECRET="secretpass" ./app.js -p 51234 -w 8443 -c ./config.json &

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"notification": {
"selection": "slack",
"slack": {
"webhookurl": "_your_webhook_url_",
"channel": "_your_channel_to_be_notified_"
}
},
"repoPath": "_your_git_repo_path_to_build_and_test_",
"jobs": [
{
"targets": "*",
"commands": "git pull"
},
{
"targets": [ "server/app", "server/lib" ],
"commands": [
"cd `git rev-parse --show-toplevel`/deploy; make app;",
"cd `git rev-parse --show-toplevel`/deploy; sleep 5; npm test"]
}
]
}

마치면서…

Gitple 팀은 앞으로도 다양한 오픈소스를 공개할 예정입니다.

공유하기