LoginSignup
1
1

More than 1 year has passed since last update.

【三日目】最小限の構成でdocker-composeからKubernetesにデプロイする勉強会

Last updated at Posted at 2020-07-19

概要

表題の勉強会を行った三日目の内容を記載します。全日の内容は以下のまとめページをご覧ください。

【まとめ】最小限の構成でdocker-composeからKubernetesにデプロイする勉強会

三日目のできたこと

  • テスト用のコンテナイメージの作成
  • CI/CD pipelinesにテストを組み込む

三日目の内容

テスト用のコンテナイメージの作成

image.png

簡単なテストを実行するコンテナを作成します。pythonを使ってリクエスト送り、その結果を判別します。具体的に処理を説明する、リクエストに返ってきた内容でぷよぷよという文字列が含まれていればsys.exit(0)で正常終了。逆に含まれてなければsys.exit(1)で異常終了になります。これは後のGitLab CI/CDにつながります。

import os
import requests
import sys

url = os.getenv('URL', 'http://localhost:3000')
check_str = os.getenv('CHECK_STR', 'ぷよぷよ')

try:
    r_get = requests.get(url)
    response = True if r_get.ok else r_get.reason
    print(r_get.text)
    if r_get.text.find(check_str) == -1:
        print(check_str + "ではないので問題です!!")
        sys.exit(1)
    else:
        print(check_str + "なので大丈夫です。")
        sys.exit(0)
except requests.exceptions.RequestException as e:
    response = str(e)
    sys.exit(1)

pythonだけでテストを試す

このテストはローカルのpythonでも実行できます。予めローカルのpythonの環境で、requestsImportしておく必要があります。以下の手順でテストを実行できます。

  • Pythonをインストール
    • requestsがない場合はpip install requests
  • docker-composeappupしておく
    • 一番上のフォルダに移動
    • docker-compose up -d app
    • http://localhost:3000でアクセスできることを確認
  • ローカルのpythonでテストを実行
    • python test/test.py

docker-compose.ymlにtestを追加

まずはコンテナを作るためにDockerfileを準備します。alpineにはrequestsは含まれていないのでインストールしています。

■ Dockerfile

FROM python:3.6-alpine

WORKDIR /app

COPY ./*.py /app/

RUN pip install requests

CMD ["python", "test.py" ]

このDockerfileを元にdocker-compose.ymlでtestのサービスを追加します。

■ docker-compose.yml

version: '3'
services:
  app:
    build:
      context: ./app      # Dockerfile保存場所
    image: registry.gitlab.com/tamoco-mocomoco/k8s-test/express:latest
    ports:                          # ポート接続
      - 3000:5000
    environment:
      PORT: 5000

  test:
    build:
      context: ./test
    environment:
      URL: http://app:5000
      CHECK_STR: "ぷよぷよ"

環境変数で接続先のURLやチェックする文字列を上書きしています。ここで注目すべきはコンテナの中から接続するため、appだったりポートがアプリ内のポート番号である5000になっている点です。先ほどのローカルのpythonで実行した場合は、docker-composeで転送された後のURLやポート番号にアクセスしていましたが、コンテナの中から接続するところを意識することが重要になります。

docker-comopseでテストを実行する(テスト用コンテナで実行)

docker-compose でコンテナを作成してテストすることができます。

■ コンテナでテストを実行する(成功)

$ docker-compose run test
<!DOCTYPE html>
<html>
  <head>
    <title>ぷよぷよワダオ</title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1>ぷよぷよワダオ</h1>
    <p>Welcome to ぷよぷよワダオ</p>
  </body>
</html>

ぷよぷよなので大丈夫です。

コンテナで実行する場合は、元のソースが変更した場合はbuildしなおす必要があります。ここらへんはホットリロード(自動的にコンテナ内のソースを更新する仕組み)などの機能を追加した方がよさそうです。

ちなみにテストを失敗させたい場合はapp/express/routes/index.jsぷよぷよという文字列をむきむきなどに変更すると失敗します。

■ コンテナでテストを実行する(失敗)

$ docker-compose run test
<!DOCTYPE html>
<html>
  <head>
    <title>むきむきワダオ</title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1>むきむきワダオ</h1>
    <p>Welcome to むきむきワダオ</p>
  </body>
</html>

ぷよぷよではないので問題です!!

CI/CD pipelinesにテストを組み込む

.gitlab-ci.ymlにテスト用のコンテナでテストする仕組みを追加します。テストがパスすればコンテナイメージをbuildするようにしました。

■ .gitlab-ci.yml

image: docker:latest

stages:
  - test
  - build

variables:
  DOCKER_DRIVER: overlay

services:
- docker:dind

before_script:
- docker info
- apk update
- apk upgrade
- apk add docker-compose
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker-compose build

test:
  stage: test
  script:
  - docker-compose up -d app
  - sleep 5s
  - docker-compose run test

build:
  stage: build
  script:
  - docker-compose push

Pipelineを確認する

以下の画像のとおりテストが実行されていることが確認できました。

コメント 2020-07-16 232531.jpg

成功した場合は以下のような実行結果が確認できます。

image.png

失敗した場合は以下のような実行結果が確認できます。

image.png

三日目を振り返って

当初はシェルスクリプトでcurlを実行して結果を判別するカンタンなテストを準備していました。apk add curlを実行してCI上のコンテナにcurlを追加してテストする仕組みを想定していましたが、若干ハマってしまったのでpythonで小さく作ることにしました。

実際にテスト用のコンテナを作る場合は、cypressなどのe2eのテストを実行できるコンテナを使うのがよいと思います。

cypress

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1