duck8823 / duci Goto Github PK
View Code? Open in Web Editor NEWThe simple ci server
License: MIT License
The simple ci server
License: MIT License
こんなイメージ
package clock
import "time"
var now = time.Now
func Now() time.Time {
return now
}
にしといて export_test.go
で
package clock
func SetNowFunc(f func () time.Time) {
now = f
}
わかりにくくなってるしリファクタリングしたい
サーバー側でタイムアウトを設定
GITHUB_API_TOKEN
から取得しているけど、
設定ファイルから取得できるようにしたい。デフォルトは GITHUB_API_TOKEN
でいい。
こんな感じにしようと思いました。
minimal-ci
├── infrastructure # 共通の基盤部分
├── service # 再利用しやすい形でさらにパッケージわける
├── presentation
│ └── controller # ≒ hander
└── main.go
webhooks が timeout になるので非同期にする。
wenhooks はジョブのIDを返して、後から結果とログを取得できるようにしよう。
今は push
とか pr/test
/ とかしか表示してないけどわかりにくいから
duci/push
, duci/pr/test
にしよう。
設定しよう
SHA が 0000000000000000000000000000000000000000
になってしまっている.
なおす
いくつか高速化をためす
runner 実行時に並列数を設定できるようにする。
OSS の場合、 http でクローンできるようにする。
configファイルで http と ssh で選べるようにしよう。
payload を確認したところ、head_commit.sha が存在しない。
コミットハッシュは head_commit.id で取得できる。
今はインメモリな leveldb に保存しているが、ファイルに保存できるようにする。
ファイルパスは設定ファイルで変更できるようにする。
GitLabにも対応したい。
じゃないと何で失敗したかわからないね。
minimal-ci から変えよう
指定されたブランチのチェックアウト後最新のコミットハッシュに対して実行しているが、
Runner にコミットハッシュを渡してそれをチェックアウトできるようにする。
それを使って Runner内で commit status を生成するようにし、プレゼンテーション層での commit status の作成はしないようにする。
coveralls を実行する go のバージョンを指定する
GitHub の ChecksAPI について調べる。
使えそうだったら使う。
が サブコマンド でできると導入コストがグッと減っていいと思った。
イメージとしては
duci init
で ssh key を作って GitHub に登録
duci add duck8823/duci
で webhooks に登録
duci server
で サーバー起動
アプリ起動用の Dockerfile は multi stage build を利用する
以下のログのあとジョブが実行されない。
[08654e00-ac53-11e8-87b2-90223981f97b] 2018-08-30 12:48:48.871 [INFO] Compressing objects: 100% (170/170)
[08654e00-ac53-11e8-87b2-90223981f97b] 2018-08-30 12:48:48.871 [INFO] Compressing objects: 100% (170/170), done.
[08654e00-ac53-11e8-87b2-90223981f97b] 2018-08-30 12:48:48.983 [INFO] Total 240 (delta 95), reused 146 (delta 47), pack-reused 0
[08654e00-ac53-11e8-87b2-90223981f97b] 2018-08-30 12:48:48.999 [ERROR] reference not found
github.com/duck8823/duci/infrastructure/git.(*sshGitClient).Clone
/home/ubuntu/go/src/github.com/duck8823/duci/infrastructure/git/git.go:37
github.com/duck8823/duci/application/service/runner.(*DockerRunner).run
/home/ubuntu/go/src/github.com/duck8823/duci/application/service/runner/runner.go:85
github.com/duck8823/duci/application/service/runner.(*DockerRunner).Run.func1
/home/ubuntu/go/src/github.com/duck8823/duci/application/service/runner/runner.go:50
runtime.goexit
/home/ubuntu/.goenv/versions/1.10.3/src/runtime/asm_amd64.s:2361
github.com/duck8823/duci/application/service/runner.(*DockerRunner).run
/home/ubuntu/go/src/github.com/duck8823/duci/application/service/runner/runner.go:87
github.com/duck8823/duci/application/service/runner.(*DockerRunner).Run.func1
/home/ubuntu/go/src/github.com/duck8823/duci/application/service/runner/runner.go:50
runtime.goexit
/home/ubuntu/.goenv/versions/1.10.3/src/runtime/asm_amd64.s:2361
[08654e00-ac53-11e8-87b2-90223981f97b] 2018-08-30 12:48:49.216 [ERROR] Failed to create commit status: POST https://api.github.com/repos/duck8823/duci/statuses/0000000000000000000000000000000000000000: 422 No commit found for SHA: 0000000000000000000000000000000000000000 []
現在並列数を指定しているが、前のジョブが終わってから次のジョブを実行して初めて pending の Commit Status がつく。
キューに入ったことが分かりづらいのでコミットステータスをつけるようにする。
テスト実行時に ホスト と volume を共有したい。
(ホスト依存のテスト書いてて本来はよくないけどそれは別でやる)
.duci/config.yml
に以下のように記述するとコンテナに渡すようにする。
---
volumes:
- /path/to/host:/path/to/container:ro
push 毎にもタスクを実行できるようにする。
push の場合は Dockerfile の CMD で実行するようにする。
例えば、
ENTRYPOINT: ["mvn"]
CMD: ["test"]
としておけば、 push 毎に mvn test
が実行される。
設定ファイルで指定した他のコンテナイメージを利用できるようにしちゃう?
GitHubからリンクを辿れるようにしよう。
ホストURLはリクエストの中に含まれるものを使うか、設定ファイルで管理できるようにするか。
リクエスト毎に生成したUUIDでなくGitHubから送信される値を使った方が良さそう。
パッケージ名とインスタンス生成メソッドの命名について考える
コンテナとイメージの削除をしないとディスクが圧迫している。
ジョブが終わったコンテナは削除しないとすぐ溜まってしまう。
再実行した時に最初から Finshed が true のままなのでリフレッシュされない。
#1 で非同期にしたけど、後からログが取得できないので取得できるようにしてあげよう。
リクエストごとに生成する UUID でも返して、 logs/{UUID}
あたりで取得できるようにすればいい。
infrastructure/docker/docker.go:9:2: code in directory /go/src/github.com/moby/moby/client expects import "github.com/docker/docker/client"
ヘルスチェック用のエンドポイントを作成する
time.Now()
を直接使ってるとテストしにくい。
related #88
マージ後の push event などでは head_commit が null の場合がある。
その場合に適切にスキップするようにする
_testパッケージになっていないものに関してtestパッケージにする。
export_test.go
を活用する。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.