zaki work log

作業ログやら生活ログやらなんやら

[OpenShift] Webhookを使ってGitLab CEへpushされたら自動でS2Iビルド&デプロイする

自前のS2Iスクリプトを使ったイメージビルドをプライベートネットワーク上のGitLab CEのリポジトリ上のソースコードからビルド&デプロイする手順と、更にそれをWebhookを使ってpushをトリガーに自動でビルド&デプロイする設定について。

扱っているソース・やっている内容は前回の記事の続きです。

zaki-hmkc.hatenablog.com

リポジトリからのS2Iビルド自体は以下の記事と同じです。

zaki-hmkc.hatenablog.com

リポジトリにソース一式をpushする

GitLab CEはこの子です。

zaki-hmkc.hatenablog.com

まずGitLab CEでリポジトリを作成。
(以下、普通のGit/GitLab操作です)

f:id:zaki-hmkc:20200221152438p:plain

とりあえずサンプルなのでpublic設定で。

f:id:zaki-hmkc:20200221152545p:plain

ローカルのソースでS2Iした時のファイルpush(*.orgは削除した)。

[zaki@codeready s2isample]$ echo "# S2I sample script" > README.md
[zaki@codeready s2isample]$ find
.
./sockserv.pl
./.s2i
./.s2i/bin
./.s2i/bin/assemble
./.s2i/bin/run
./README.md
[zaki@codeready s2isample]$ git init
Initialized empty Git repository in /home/zaki/src/s2isample/.git/
[zaki@codeready s2isample]$ git remote add origin https://gitlab-ce.example.org:8443/zaki/s2i-sample.git
[zaki@codeready s2isample]$ git add .
[zaki@codeready s2isample]$ git commit -m "Initial commit"
[master (root-commit) af197a1] Initial commit
 4 files changed, 35 insertions(+)
 create mode 100644 .s2i/bin/assemble
 create mode 100644 .s2i/bin/run
 create mode 100644 README.md
 create mode 100644 sockserv.pl
[zaki@codeready s2isample]$ git push -u origin master
Username for 'https://gitlab-ce.example.org:8443': zaki
Password for 'https://zaki@gitlab-ce.example.org:8443': 
Counting objects: 8, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (8/8), 873 bytes | 0 bytes/s, done.
Total 8 (delta 0), reused 0 (delta 0)
To https://gitlab-ce.example.org:8443/zaki/s2i-sample.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

f:id:zaki-hmkc:20200221153351p:plain

ここまでは普通です。
これから、このリポジトリのソースを使ってS2Iします。

ビルド&デプロイ

以下、環境はOKD4.4です。

[zaki@okd4-manager ~]$ oc version
Client Version: 4.4.0-0.okd-2020-01-28-022517
Server Version: 4.4.0-0.okd-2020-01-28-022517
Kubernetes Version: v1.17.1

作業用プロジェクト

[zaki@okd4-manager ~]$ oc login -u zaki
Logged into "https://api.okd4.naru.jp-z.jp:6443" as "zaki" using existing credentials.

You don't have any projects. You can try to create a new project, by running

    oc new-project <projectname>

[zaki@okd4-manager ~]$ oc new-project s2i-git-perl
Now using project "s2i-git-perl" on server "https://api.okd4.naru.jp-z.jp:6443".

You can add applications to this project with the 'new-app' command. For example, try:

    oc new-app ruby~https://github.com/sclorg/ruby-ex.git

to build a new example application in Python. Or use kubectl to deploy a simple Kubernetes application:

    kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node

Gitリポジトリの証明書secretを作成

内容はここと一緒です。

[zaki@okd4-manager ~]$ oc create secret generic gitlabcert --from-file=ca.crt=gitlab-cert/gitlab-ce.example.org.crt
secret/gitlabcert created
[zaki@okd4-manager ~]$ oc describe secret gitlabcert 
Name:         gitlabcert
Namespace:    s2i-git-perl
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
ca.crt:  1822 bytes

new-app

これは足りない例

$ oc new-app https://gitlab-ce.example.org:8443/zaki/s2i-sample.git --source-secret=gitlabcert

カスタムスクリプトで実装している関係で、これだとS2Iによる言語の検知が動作しない(Perlならこのファイルがあるはず、という条件を満たしていない)ので、イメージを指定。

言語の検出については以下のドキュメント参照。

イメージを指定するには、リポジトリの前にイメージ名:tag~を付与。

[zaki@okd4-manager ~]$ oc new-app perl:5.26~https://gitlab-ce.example.org:8443/zaki/s2i-sample.git --source-secret=gitlabcert
--> Found image 57aa6a9 (3 weeks old) in image stream "openshift/perl" under tag "5.26" for "perl:5.26"

    Apache 2.4 with mod_perl/5.26 
    ----------------------------- 
    Perl 5.26 available as container is a base platform for building and running various Perl 5.26 applications and frameworks. Perl is a high-level programming language with roots in C, sed, awk and shell scripting. Perl is good at handling processes and files, and is especially good at handling text. Perl's hallmarks are practicality and efficiency. While it is used to do a lot of different things, Perl's most common applications are system administration utilities and web programming.

    Tags: builder, perl, perl526

    * A source build using source code from https://gitlab-ce.example.org:8443/zaki/s2i-sample.git will be created
      * The resulting image will be pushed to image stream tag "s2i-sample:latest"
      * Use 'oc start-build' to trigger a new build
    * This image will be deployed in deployment config "s2i-sample"
    * Port 8080/tcp will be load balanced by service "s2i-sample"
      * Other containers can access this service through the hostname "s2i-sample"

--> Creating resources ...
    imagestream.image.openshift.io "s2i-sample" created
    buildconfig.build.openshift.io "s2i-sample" created
    deploymentconfig.apps.openshift.io "s2i-sample" created
    service "s2i-sample" created
--> Success
    Build scheduled, use 'oc logs -f bc/s2i-sample' to track its progress.
    Application is not exposed. You can expose services to the outside world by executing one or more of the commands below:
     'oc expose svc/s2i-sample' 
    Run 'oc status' to view your app.

各種リソースが作成される。

[zaki@okd4-manager ~]$ oc get all
NAME                     READY   STATUS     RESTARTS   AGE
pod/s2i-sample-1-build   0/1     Init:0/2   0          6s

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/s2i-sample   ClusterIP   172.30.154.146   <none>        8080/TCP   6s

NAME                                            REVISION   DESIRED   CURRENT   TRIGGERED BY
deploymentconfig.apps.openshift.io/s2i-sample   0          1         0         config,image(s2i-sample:latest)

NAME                                        TYPE     FROM   LATEST
buildconfig.build.openshift.io/s2i-sample   Source   Git    1

NAME                                    TYPE     FROM   STATUS    STARTED   DURATION
build.build.openshift.io/s2i-sample-1   Source   Git    Pending             

NAME                                        IMAGE REPOSITORY                                                           TAGS   UPDATED
imagestream.image.openshift.io/s2i-sample   image-registry.openshift-image-registry.svc:5000/s2i-git-perl/s2i-sample          

Gitからソースをpullし、イメージのビルドもnew-appの実行の流れで行われる。

[zaki@okd4-manager ~]$ oc get buildconfig
NAME         TYPE     FROM   LATEST
s2i-sample   Source   Git    1
[zaki@okd4-manager ~]$ oc get build
NAME           TYPE     FROM   STATUS    STARTED   DURATION
s2i-sample-1   Source   Git    Pending             
[zaki@okd4-manager ~]$

しばらくまてば、、

[zaki@okd4-manager ~]$ oc logs build/s2i-sample-1
Cloning "https://gitlab-ce.example.org:8443/zaki/s2i-sample.git" ...
        Commit: af197a1d5eff7a46e46cf227d2e1797642d520c7 (Initial commit)
        Author: zaki <zaki.hmkc@gmail.com>
        Date:   Fri Feb 21 15:32:09 2020 +0900
Caching blobs under "/var/cache/blobs".
Getting image source signatures
Copying blob sha256:455ea8ab06218495bbbcb14b750a0d644897b24f8c5dcf9e8698e27882583412
Copying blob sha256:01ace4f1c1164bbc4513b616c5cff62585fde1dc198b7469c5bc5bc5355941da
Copying blob sha256:4e466ee901fb8e61b18a0b1c172c781c8cb3609060c441a3217b9ebd2cb971cd
Copying blob sha256:bb13d92caffa705f32b8a7f9f661e07ddede310c6ccfa78fb53a49539740e29b
Copying blob sha256:84e620d0abe585d05a7bed55144af0bc5efe083aed05eac1e88922034ddf1ed2
Copying config sha256:57aa6a9e95d366288608f9e224d70922eb6803d78a2e807338cb954d6d1d0629
Writing manifest to image destination
Storing signatures
Generating dockerfile with builder image image-registry.openshift-image-registry.svc:5000/openshift/perl@sha256:4dde5621a54dc0ef542d015b42a9e30d6ed45a185ceec7ae81be5b0da43c9e2c
STEP 1: FROM image-registry.openshift-image-registry.svc:5000/openshift/perl@sha256:4dde5621a54dc0ef542d015b42a9e30d6ed45a185ceec7ae81be5b0da43c9e2c
STEP 2: LABEL "io.openshift.build.commit.ref"="master" "io.openshift.build.commit.message"="Initial commit" "io.openshift.build.image"="image-registry.openshift-image-registry.svc:5000/openshift/perl@sha256:4dde5621a54dc0ef542d015b42a9e30d6ed45a185ceec7ae81be5b0da43c9e2c" "io.openshift.build.commit.author"="zaki <zaki.hmkc@gmail.com>" "io.openshift.build.commit.date"="Fri Feb 21 15:32:09 2020 +0900" "io.openshift.build.commit.id"="af197a1d5eff7a46e46cf227d2e1797642d520c7"
STEP 3: ENV OPENSHIFT_BUILD_NAME="s2i-sample-1" OPENSHIFT_BUILD_NAMESPACE="s2i-git-perl" OPENSHIFT_BUILD_SOURCE="https://gitlab-ce.example.org:8443/zaki/s2i-sample.git" OPENSHIFT_BUILD_COMMIT="af197a1d5eff7a46e46cf227d2e1797642d520c7"
STEP 4: USER root
STEP 5: COPY upload/scripts /tmp/scripts
STEP 6: COPY upload/src /tmp/src
STEP 7: RUN chown -R 1001:0 /tmp/scripts /tmp/src
STEP 8: USER 1001
STEP 9: RUN /tmp/scripts/assemble
STEP 10: CMD /tmp/scripts/run
STEP 11: COMMIT temp.builder.openshift.io/s2i-git-perl/s2i-sample-1:96c53677
Getting image source signatures
Copying blob sha256:35817540a17b5b90cb4426078d53813b16e70c75e1cce3db116d2fbbca7fbf10
Copying blob sha256:c7fbe90ae90e9c6452e5d809f069907907e6f32532565104921f600fb956306c
Copying blob sha256:74d760a83a4b8bcb3d01e7726e06c11469f0bb2ce4645474cb91a607c27bf482
Copying blob sha256:f1cc3f0b20053e48dc0f6505734d2f476e4fcd975df9791164bd749af9332401
Copying blob sha256:8995923ae10d45d1b79c0876141c62b891d258a68c8fc2ed53743acbc076ed5d
Copying blob sha256:bd6b846d7f3b84f9d8e9de2dd380e34a2baff06916e19fbf71394afb66c43736
Copying config sha256:f37c27b818ce7f115147e306f00c8e751af29e9202b92a621f5c6d393e2c2d4a
Writing manifest to image destination
Storing signatures
f37c27b818ce7f115147e306f00c8e751af29e9202b92a621f5c6d393e2c2d4a
f37c27b818ce7f115147e306f00c8e751af29e9202b92a621f5c6d393e2c2d4a

Pushing image image-registry.openshift-image-registry.svc:5000/s2i-git-perl/s2i-sample:latest ...
Getting image source signatures
Copying blob sha256:bd6b846d7f3b84f9d8e9de2dd380e34a2baff06916e19fbf71394afb66c43736
Copying blob sha256:01ace4f1c1164bbc4513b616c5cff62585fde1dc198b7469c5bc5bc5355941da
Copying blob sha256:455ea8ab06218495bbbcb14b750a0d644897b24f8c5dcf9e8698e27882583412
Copying blob sha256:bb13d92caffa705f32b8a7f9f661e07ddede310c6ccfa78fb53a49539740e29b
Copying blob sha256:4e466ee901fb8e61b18a0b1c172c781c8cb3609060c441a3217b9ebd2cb971cd
Copying blob sha256:84e620d0abe585d05a7bed55144af0bc5efe083aed05eac1e88922034ddf1ed2
Copying config sha256:f37c27b818ce7f115147e306f00c8e751af29e9202b92a621f5c6d393e2c2d4a
Writing manifest to image destination
Storing signatures
Successfully pushed image-registry.openshift-image-registry.svc:5000/s2i-git-perl/s2i-sample@sha256:c0cb8460b2dad54b76607978a1267313f22ad3383f325e56a13a7f764ffab4ab
Push successful

イメージのビルドが完了し、内部イメージレジストリへpushされる。

[zaki@okd4-manager ~]$ oc get build
NAME           TYPE     FROM          STATUS     STARTED              DURATION
s2i-sample-1   Source   Git@af197a1   Complete   About a minute ago   1m50s
[zaki@okd4-manager ~]$ 
[zaki@okd4-manager ~]$ oc get pod
NAME                  READY   STATUS              RESTARTS   AGE
s2i-sample-1-build    0/1     Completed           0          2m
s2i-sample-1-deploy   0/1     ContainerCreating   0          9s
[zaki@okd4-manager ~]$ 
[zaki@okd4-manager ~]$ oc get is
NAME         IMAGE REPOSITORY                                                           TAGS     UPDATED
s2i-sample   image-registry.openshift-image-registry.svc:5000/s2i-git-perl/s2i-sample   latest   13 seconds ago

さらに続けてdeploy podも動き出す。

[zaki@okd4-manager ~]$ oc get pod
NAME                  READY   STATUS              RESTARTS   AGE
s2i-sample-1-585bz    0/1     ContainerCreating   0          13s
s2i-sample-1-build    0/1     Completed           0          2m21s
s2i-sample-1-deploy   1/1     Running             0          30s

アプリケーションpodがRunningになる。

[zaki@okd4-manager ~]$ oc get pod
NAME                  READY   STATUS      RESTARTS   AGE
s2i-sample-1-585bz    1/1     Running     0          30s
s2i-sample-1-build    0/1     Completed   0          2m38s
s2i-sample-1-deploy   0/1     Completed   0          47s

アプリケーションpodが動作したので、exposeする。

[zaki@okd4-manager ~]$ oc get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
s2i-sample   ClusterIP   172.30.154.146   <none>        8080/TCP   3m16s
[zaki@okd4-manager ~]$
[zaki@okd4-manager ~]$ oc expose svc/s2i-sample
route.route.openshift.io/s2i-sample exposed
[zaki@okd4-manager ~]$ oc get route
NAME         HOST/PORT                                        PATH   SERVICES     PORT       TERMINATION   WILDCARD
s2i-sample   s2i-sample-s2i-git-perl.apps.okd4.naru.jp-z.jp          s2i-sample   8080-tcp                 None
[zaki@okd4-manager ~]$ 

アクセス

[zaki@okd4-manager ~]$ curl http://s2i-sample-s2i-git-perl.apps.okd4.naru.jp-z.jp
curl: (52) Empty reply from server
[zaki@okd4-manager ~]$ curl -v http://s2i-sample-s2i-git-perl.apps.okd4.naru.jp-z.jp
* About to connect() to s2i-sample-s2i-git-perl.apps.okd4.naru.jp-z.jp port 80 (#0)
*   Trying 172.16.0.50...
* Connected to s2i-sample-s2i-git-perl.apps.okd4.naru.jp-z.jp (172.16.0.50) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: s2i-sample-s2i-git-perl.apps.okd4.naru.jp-z.jp
> Accept: */*
> 
* Empty reply from server
* Connection #0 to host s2i-sample-s2i-git-perl.apps.okd4.naru.jp-z.jp left intact
curl: (52) Empty reply from server

ん…?

[zaki@okd4-manager s2isample]$ oc rsh s2i-sample-1-585bz bash
bash-4.2$ curl http://localhost:8080
カレーは汗をかくのでスポーツ
curl: (56) Recv failure: Connection reset by peer
bash-4.2$ 

接続まではできてるし、中のアプリは動いてはいるね。

[zaki@okd4-manager ~]$ curl -v http://s2i-sample-s2i-git-perl.apps.okd4.naru.jp-z.jp
* About to connect() to s2i-sample-s2i-git-perl.apps.okd4.naru.jp-z.jp port 80 (#0)
*   Trying 172.16.0.50...
* Connected to s2i-sample-s2i-git-perl.apps.okd4.naru.jp-z.jp (172.16.0.50) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: s2i-sample-s2i-git-perl.apps.okd4.naru.jp-z.jp
> Accept: */*
> 
< HTTP/1.1 502 Bad Gateway
< content-length: 107
< cache-control: no-cache
< content-type: text/html
< connection: close
< 
<html><body><h1>502 Bad Gateway</h1>
The server returned an invalid or incomplete response.
</body></html>
* Closing connection 0

たまにこういうレスポンスになる。
なんでや…?

そう。ソースコードを見直して思い出したけど、これ「TCPソケットサーバー」であって、別にHTTP喋ってないんですよね。
クライアントから接続があったら、文字列を接続元にただprintしてるだけで、HTTP/1.1 200 OKとかContent-typeとか何も言わずにぶっきらぼうに要件だけ喋っているコミュ障なので、routerで動作しているHAProxyさんがさばいてない状態。
(OpenShiftのrouteは、HTTP/HTTPSを処理する)

ということでバージョン1は「OpenShift的にpodのビルド&デプロイはできてる」けど、「アプリケーションは動作していない」ので、修正します。
※ アプリケーションとしては動いてないけど、oc new-appのみでpodのビルド&デプロイが完了してる。

リビルド

コード修正・push

というわけで、ソケットサーバーにHTTPを喋らせる処理を追加。

[zaki@codeready s2isample]$ git diff
diff --git a/sockserv.pl b/sockserv.pl
index bb81d2b..0843941 100644
--- a/sockserv.pl
+++ b/sockserv.pl
@@ -16,6 +16,8 @@ die "IO::Socket $!" unless $server;
 for (;;) {
     if (my $client = $server->accept()) {
         print "connected from " . $client->peerhost() . "\n";
+        print $client "HTTP/1.1 200 OK\n";
+        print $client "content-type: text/plain\n\n";
         print $client "カレーは汗をかくのでスポーツ\n";
         close $client;
         print "disconected...\n";

commit/pushする。

イメージのリビルド

BuildConfigにリポジトリの情報は含まれている。

[zaki@okd4-manager ~]$ oc describe bc s2i-sample
Name:           s2i-sample
Namespace:      s2i-git-perl
Created:        2 hours ago
Labels:         app=s2i-sample
                app.kubernetes.io/component=s2i-sample
                app.kubernetes.io/instance=s2i-sample
Annotations:    openshift.io/generated-by=OpenShiftNewApp
Latest Version: 1

Strategy:       Source
URL:            https://gitlab-ce.example.org:8443/zaki/s2i-sample.git
Source Secret:  gitlabcert
From Image:     ImageStreamTag openshift/perl:5.26
Output to:      ImageStreamTag s2i-sample:latest

:
:

なので、リビルドするには、start-buildでBuildConfigを指定すればOK

[zaki@okd4-manager ~]$ oc start-build s2i-sample 
build.build.openshift.io/s2i-sample-2 started
[zaki@okd4-manager ~]$ 
[zaki@okd4-manager ~]$ 
[zaki@okd4-manager ~]$ oc get build
NAME           TYPE     FROM          STATUS     STARTED       DURATION
s2i-sample-1   Source   Git@af197a1   Complete   2 hours ago   1m50s
s2i-sample-2   Source   Git           Pending                  
[zaki@okd4-manager ~]$ oc get pod
NAME                  READY   STATUS      RESTARTS   AGE
s2i-sample-1-585bz    1/1     Running     0          98m
s2i-sample-1-build    0/1     Completed   0          100m
s2i-sample-1-deploy   0/1     Completed   0          98m
s2i-sample-2-build    0/1     Init:0/2    0          5s

リポジトリからソースをpullし、イメージをビルド完了すれば、deploy podが起動し、アプリケーションpodを新しいイメージからデプロイする。

[zaki@okd4-manager ~]$ oc get build
NAME           TYPE     FROM          STATUS     STARTED              DURATION
s2i-sample-1   Source   Git@af197a1   Complete   2 hours ago          1m50s
s2i-sample-2   Source   Git@ae51ef0   Complete   About a minute ago   40s
[zaki@okd4-manager ~]$ oc get pod
NAME                  READY   STATUS        RESTARTS   AGE
s2i-sample-1-585bz    1/1     Terminating   0          99m
s2i-sample-1-build    0/1     Completed     0          101m
s2i-sample-1-deploy   0/1     Completed     0          99m
s2i-sample-2-build    0/1     Completed     0          61s
s2i-sample-2-deploy   1/1     Running       0          21s
s2i-sample-2-dzmwb    1/1     Running       0          12s

アプリケーションpodがデプロイまで完了し、Running状態になる。
さて、、、

[zaki@okd4-manager ~]$ curl http://s2i-sample-s2i-git-perl.apps.okd4.naru.jp-z.jp 
カレーは汗をかくのでスポーツ
[zaki@okd4-manager ~]$ curl -v http://s2i-sample-s2i-git-perl.apps.okd4.naru.jp-z.jp 
* About to connect() to s2i-sample-s2i-git-perl.apps.okd4.naru.jp-z.jp port 80 (#0)
*   Trying 172.16.0.50...
* Connected to s2i-sample-s2i-git-perl.apps.okd4.naru.jp-z.jp (172.16.0.50) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: s2i-sample-s2i-git-perl.apps.okd4.naru.jp-z.jp
> Accept: */*
> 
< HTTP/1.1 200 OK
< content-type: text/plain
< connection: close
< 
カレーは汗をかくのでスポーツ
* Closing connection 0
[zaki@okd4-manager ~]$ 

ちゃんと動きました(・∀・)

Webhook

最後にWebhookの設定。
これは、BuildConfigのトリガーにWebhookを設定することで、リポジトリにpushすることでpodのリビルド&デプロイを行うというもの。

なお、トリガーの設定はoc set triggerでできる。

初期状態

[zaki@okd4-manager ~]$ oc set triggers bc s2i-sample
NAME                     TYPE     VALUE                AUTO
buildconfigs/s2i-sample  config                        true
buildconfigs/s2i-sample  image    openshift/perl:5.26  true
buildconfigs/s2i-sample  webhook  <secret>             
buildconfigs/s2i-sample  github   <secret>  

BuildConfigに設定を追加する

[zaki@okd4-manager ~]$ oc set triggers bc s2i-sample --from-gitlab 
buildconfig.build.openshift.io/s2i-sample triggers updated

BuildConfigの設定はこれだけ。

[zaki@okd4-manager ~]$ oc set triggers bc s2i-sample
NAME                     TYPE     VALUE                AUTO
buildconfigs/s2i-sample  config                        true
buildconfigs/s2i-sample  image    openshift/perl:5.26  true
buildconfigs/s2i-sample  webhook  <secret>             
buildconfigs/s2i-sample  github   <secret>             
buildconfigs/s2i-sample  gitlab   <secret>     

gitlabの設定が追加されている。
BuildConfigの内容は-o yamlで確認すれば以下の部分が追加されている。

   triggers:
   - github:
       secret: ********************
     type: GitHub
   - generic:
       secret: ********************
     type: Generic
   - type: ConfigChange
   - imageChange:
       lastTriggeredImageID: image-registry.openshift-image-registry.svc:5000/openshift/perl@sha256:4dde5621a54dc0ef542d015b42a9e30d6ed45a185ceec7ae81be5b0da43c9e2c
     type: ImageChange
+  - gitlab:
+      secret: ********************
+    type: GitLab

このsecretの値をGitLabの設定で使用する。
また、BuildConfigをoc describeで確認すると、以下のように出力される。

Build Run Policy:       Serial
Triggered by:           Config, ImageChange
Webhook GitLab:
        URL:    https://api.okd4.naru.jp-z.jp:6443/apis/build.openshift.io/v1/namespaces/s2i-git-perl/buildconfigs/s2i-sample/webhooks/<secret>/gitlab
Webhook GitHub:
        URL:    https://api.okd4.naru.jp-z.jp:6443/apis/build.openshift.io/v1/namespaces/s2i-git-perl/buildconfigs/s2i-sample/webhooks/<secret>/github
Webhook Generic:
        URL:            https://api.okd4.naru.jp-z.jp:6443/apis/build.openshift.io/v1/namespaces/s2i-git-perl/buildconfigs/s2i-sample/webhooks/<secret>/generic
        AllowEnv:       false
Builds History Limit:
        Successful:     5
        Failed:         5

この中の、Webhook GitLabのURLの<secret>となっている個所に、前述-o yamlで確認したsecretの値に置き換えたURLをGitLab CEに設定する。

GitLabにWebhookの設定追加

初めに作成したs2i-sampleプロジェクトをGitLab CEで開き、メニューの"Settings"->"Integrations"を開く。

f:id:zaki-hmkc:20200221190138p:plain

設定画面のURLに、前述のsecret込みURLを入力する。
(字が似てるので、間違えてGitHubの値を混ぜないように注意。私はこれで時間を溶かしました)

それ以外にTriggerのチェックは設定変更無し・Enable SSL verificationは(OpenShiftクラスタの証明書をGitLab CEリポジトリ側に設定していなければ)チェックを外し、ページの中央付近にある"Add webhook"を押下。


※ GitLab CEでは、ローカルネットワークでのWebhookはデフォルト禁止になっているため、以下のエラーが出る場合は、admin設定で制限を外す必要がある。

Url is blocked: Requests to the local network are not allowed

taikii.net

f:id:zaki-hmkc:20200221191906p:plain

これにチェックしておく。


Webhookが追加されたら、Push eventsのTestを行う。

f:id:zaki-hmkc:20200221192329p:plain

設定がうまくいっていれば、200 OKになる。

f:id:zaki-hmkc:20200221192438p:plain

これで準備OK

というかこのTestでダミーのpush eventが発行されているので、OpenShift側ではBuildConfigの設定によってこのイベントを検知し、リポジトリからソースをpullしてイメージのリビルド・デプロイが行われている。

[zaki@okd4-manager ~]$ oc get pod
NAME                  READY   STATUS      RESTARTS   AGE
s2i-sample-1-build    0/1     Completed   0          3h16m
s2i-sample-1-deploy   0/1     Completed   0          3h14m
s2i-sample-2-build    0/1     Completed   0          95m
s2i-sample-2-deploy   0/1     Completed   0          95m
s2i-sample-3-build    0/1     Completed   0          4m27s
s2i-sample-3-deploy   0/1     Completed   0          3m44s
s2i-sample-3-nwsxg    1/1     Running     0          3m35s
[zaki@okd4-manager ~]$ oc get dc
NAME         REVISION   DESIRED   CURRENT   TRIGGERED BY
s2i-sample   3          1         1         config,image(s2i-sample:latest)

バージョンが2になっている。

コードを修正しpushする

というわけで本番。
また分かりやすいように文言を更新。

[zaki@codeready s2isample]$ git diff
diff --git a/sockserv.pl b/sockserv.pl
index 0843941..7961e7e 100644
--- a/sockserv.pl
+++ b/sockserv.pl
@@ -18,7 +18,7 @@ for (;;) {
         print "connected from " . $client->peerhost() . "\n";
         print $client "HTTP/1.1 200 OK\n";
         print $client "content-type: text/plain\n\n";
-        print $client "カレーは汗をかくのでスポーツ\n";
+        print $client "カレーは時に甘く時に辛いので人生\n";
         close $client;
         print "disconected...\n";
     }

commit & pushする。

[zaki@codeready s2isample]$ git add sockserv.pl
[zaki@codeready s2isample]$ git commit -m "update: 文言変更"
[zaki@codeready s2isample]$ git push

これだけ。 Gitにpushするだけで、新しいBuildが動き出す

[zaki@okd4-manager ~]$ oc get build
NAME           TYPE     FROM          STATUS     STARTED          DURATION
s2i-sample-1   Source   Git@af197a1   Complete   3 hours ago      1m50s
s2i-sample-2   Source   Git@ae51ef0   Complete   2 hours ago      40s
s2i-sample-3   Source   Git@af197a1   Complete   10 minutes ago   42s
s2i-sample-4   Source   Git@5c7b4f5   Pending      
[zaki@okd4-manager ~]$ oc get pod
NAME                  READY   STATUS      RESTARTS   AGE
s2i-sample-1-build    0/1     Completed   0          3h22m
s2i-sample-1-deploy   0/1     Completed   0          3h20m
s2i-sample-2-build    0/1     Completed   0          101m
s2i-sample-2-deploy   0/1     Completed   0          101m
s2i-sample-3-build    0/1     Completed   0          10m
s2i-sample-3-deploy   0/1     Completed   0          9m46s
s2i-sample-3-nwsxg    1/1     Running     0          9m37s
s2i-sample-4-build    0/1     Init:1/2    0          10s

しばらく待てば

[zaki@okd4-manager ~]$ oc get pod
NAME                  READY   STATUS              RESTARTS   AGE
s2i-sample-1-build    0/1     Completed           0          3h22m
s2i-sample-1-deploy   0/1     Completed           0          3h20m
s2i-sample-2-build    0/1     Completed           0          102m
s2i-sample-2-deploy   0/1     Completed           0          101m
s2i-sample-3-build    0/1     Completed           0          11m
s2i-sample-3-deploy   0/1     Completed           0          10m
s2i-sample-3-nwsxg    1/1     Running             0          10m
s2i-sample-4-build    0/1     Completed           0          45s
s2i-sample-4-deploy   0/1     ContainerCreating   0          3s
[zaki@okd4-manager ~]$
[zaki@okd4-manager ~]$ oc get pod
NAME                  READY   STATUS        RESTARTS   AGE
s2i-sample-1-build    0/1     Completed     0          3h23m
s2i-sample-1-deploy   0/1     Completed     0          3h21m
s2i-sample-2-build    0/1     Completed     0          102m
s2i-sample-2-deploy   0/1     Completed     0          102m
s2i-sample-3-build    0/1     Completed     0          11m
s2i-sample-3-deploy   0/1     Completed     0          10m
s2i-sample-3-nwsxg    1/1     Terminating   0          10m
s2i-sample-4-build    0/1     Completed     0          71s
s2i-sample-4-deploy   0/1     Completed     0          29s
s2i-sample-4-mk5s4    1/1     Running       0          20s

また新しいpodがRunningになった。

webアクセスすると

[zaki@okd4-manager ~]$ curl http://s2i-sample-s2i-git-perl.apps.okd4.naru.jp-z.jp
カレーは時に甘く時に辛いので人生

新しいバージョンになりました。


まとめ

ということで、Webhookの設定を行ったBuildConfigとGitリポジトリを組み合わせることで、ocコマンドを使ったオペレーション無しに任意のアプリケーションをビルド&デプロイできるようになりました。
またGitLab CEを使うことで、クローズドな環境のリポジトリでも利用できます。

これがGitOpsの入り口なんですね…

f:id:zaki-hmkc:20200221194950p:plain