ということがわからずにしばらく時間を使ってしまったので、ちょっと調べた内容の解説など。

以下、GitLab RunnerはRunnerと記述します。

結論


初めに結論から書くと、Runner側からGitLabを定期的にポーリングしてます。

まえおき


その昔、Jenkinsではリポジトリが変更されたかどうかをどのようにして検知していたかというと、Jenkins側から定期的にポーリングするという形で実現していました。最近のCIはJenkinsも含めてGitサーバにpushするとWebhookでGitサーバ側からCIサーバ側に通知するという方法が一般的だと思います。

そのため、GitLab側からRunner側に通知が行くものだと思い込んで作業してました。いや、思い込みってあかんすね。

GitLabCI と GitLabRunner


GitLabCIはGitLab本体に組み込まれていて、Runnerはビルド環境です。まだ実際に使うまで至ってないのでよくわかってないですが、RunnerをセットアップしないとGitLabでのCIは行えないのではないかと思われます。

環境


RunnerからGitLabにポーリングするという形なので、RunnerからGitLabに接続できればよいです。その逆は必要ありません。ということで、今回は自前で構築せずにサービスとして提供されているGitLabを利用しました。[1]

また、GitLabとRunnerのセットアップ手順は今回は割愛します。

調べてみる


前述のとおり、RunnerはDockerで構築しています。このRunnerのコンテナに潜り込んでss -lで待ち受けているポートを確認してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ ss -l
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
nl UNCONN 0 0 rtnl:1504 *
nl UNCONN 0 0 rtnl:kernel *
nl UNCONN 768 0 tcpdiag:kernel *
nl UNCONN 4352 0 tcpdiag:ss/44 *
nl UNCONN 0 0 xfrm:kernel *
nl UNCONN 0 0 audit:kernel *
nl UNCONN 0 0 fiblookup:kernel *
nl UNCONN 0 0 nft:kernel *
nl UNCONN 0 0 uevent:kernel *
nl UNCONN 0 0 genl:kernel *
udp UNCONN 0 0 127.0.0.11:46751 *:*
tcp LISTEN 0 128 127.0.0.11:39481 *:*

見てのとおり、Runner側でそれっぽく待ち受けているものが見当たらないです(39481は待ち受けていますが関係ないです)てっきりGitLab側から通知が来るものだと思い込んでいたので、ここでしばらく時間を使ってしまいました。

Runner側で待ち受けていないということは、RunnerからGitLabに対してポーリングしているのでは??ということでss -pt4で確認してみると…

1
2
3
4
$ ss -pt4
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 172.18.0.2:58138 35.231.145.151:https
users:(("gitlab-runner",pid=6,fd=3))

gitlab-runnerのプロセスがIPアドレス35.231.145.151と接続確立しているのがわかりました。(※LocalAddressが172.18.0.xなのはDockerコンテナ内だからです)

この35.231.145.151gitlab.comなのかどうか念のため確認してみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ dig gitlab.com

; <<>> DiG 9.11.3-1ubuntu1.2-Ubuntu <<>> gitlab.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3075
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;gitlab.com. IN A

;; ANSWER SECTION:
gitlab.com. 35 IN A 35.231.145.151

;; Query time: 15 msec
;; SERVER: 192.168.10.1#53(192.168.10.1)
;; WHEN: Thu Dec 13 16:01:05 JST 2018
;; MSG SIZE rcvd: 55

WireSharkで確認してみる


WireSharkでパケットキャプチャしながらRunnerを起動してみました。192.168.10.9は私のローカルマシンのIPアドレスです。これを見るとgitlab.com(35.231.145.151)に対して接続しに行っていることがわかると思います。接続確立後はKeepAliveのパケットを送り続けています。

この後しばらく眺めていると、gitlab.com(35.231.145.151)に対して定期的にApplicationDataを送る様子が確認できます。


  1. 一応、自前でもVPS上にGitLabたててはいるのですが… ↩︎