CircleCI DockerイメージのCI/CDパイプラインの作成方法

CircleCIのDockerイメージをテストおよびデプロイする方法を探している場合、CI/CDパイプラインを作成することで、ソフトウェアの提供を改善するために大いに役立ちます。

このチュートリアルでは、CircleCIを使用してDockerイメージのCI/CDパイプラインを開発する方法について学びます。

続けて読んで、テストをパスした場合にのみDockerイメージをデプロイしましょう!

前提条件

このチュートリアルは実践的なデモンストレーションです。一緒に進める場合は、次のものが必要です:

  • Dockerがインストールされていること。

PythonベースのアプリケーションのDockerイメージの作成

CI/CDパイプラインの作成に入る前に、まずWebブラウザ上でテキストを表示するPythonアプリケーションをベースにしたDockerイメージを作成します。アプリケーションのビルド方法を簡単に説明し、アプリケーションのテストケースを作成し、アプリケーションをコンテナ化します。

1. ターミナルを開き、以下のコマンドを実行して、FlaskPytestinstallしてください。 FlaskはPythonでWebアプリケーションを構築するためのフレームワークで、PytestはPythonコードのテストに使用されます。

pip install flask pytest

2. 次に、プロジェクトディレクトリを好きな名前で作成しますが、このデモではプロジェクトディレクトリをflask-circleciと呼びます。このディレクトリにはこのチュートリアルのリソースを保存します。

mkdir flask-circleci

3. flask-circleci/main.pyというファイルを作成し、以下のコードを記入します。

以下のコードは、ブラウザのホームページに「Welcome to my Flask App」と表示されます。

from flask import Flask

app = Flask(__name__) # 作成したFlaskクラスのインスタンスを作成

@app.route('/')
def main():
    # ホームページに文字列を表示
    return "Welcome to my Flask App"

4. そして、別のファイルflask-circleci/test_main.pyを作成し、以下のコードをコピー/貼り付けます。

以下のコードは、アプリケーションのためのテストクライアントを作成します。

Pytestは、以下に示すように、テストファイルの名前がtest_で始まる必要があります。

from main import app

def test_main():
		# このアプリケーションのテストクライアントを作成します。
    response = app.test_client().get('/') 

		# ページ('/')のステータスコードが200であることをアサートします。
    assert response.status_code == 200 
		# ページへの戻りステートメントをアサートします
    assert response.data == b'Welcome to my Flask App' 

5. プロジェクトディレクトリ(flask-circleci)に移動して、プロジェクトのテストを実行するには、次のコマンドを実行します。

cd flask-circleci
pytest

テストが成功した場合、以下に示すように100%の進捗が表示されます。

Running Test for the Project

6. 次に、ルートディレクトリに依存関係を文書化するためのテキストファイル(requirements.txt)を作成し、以下のテキストを記述します。このファイルは、Dockerイメージを正しく構築する際に必要です。

Flask==2.0.3
pytest==6.2.5

7. 最後に、新しいファイル(flask-circleci/Dockerfile)を作成し、以下の手順をDockerfileに記述して、Dockerイメージを構築します。

Dockerfileの手順は、以下の作業を実行します:

  • イメージ内にファイルを作成します。
  • 現在のディレクトリ(flask-circleci)のファイルをすべてコピーします。
  • コードを実行します
# あなたのイメージが構築されるベースイメージを設定します
FROM python:3.8 
# ルートにflask-circleciというディレクトリを作成します。
# このディレクトリには現在存在するコードが含まれます
RUN mkdir /flask-circleci

# /flask-circleciを作業ディレクトリにします
WORKDIR /flask-circleci

# 要件ファイルを作成したディレクトリにコピーします
COPY requirements.txt /flask-circleci 

RUN pip install -r requirements.txt

# ローカルマシンの現在のディレクトリを/flask-circleciにイメージ内にコピーします
ADD . /flask-circleci

EXPOSE 5000

CMD python main.py

CircleCI CI/CD パイプラインの作成

今、Docker イメージが準備できました。コードをテストする CI/CD パイプラインを作成し、すべてのテストが合格した場合は Docker イメージが Docker Hub にプッシュされます。Docker Hub は、GitHub と同様のサービスですが、Docker イメージ用であり、チームや他の開発者とコンテナイメージを見つけたり共有したりするのに役立ちます。

CI/CD パイプラインを作成するには、以下の手順に従ってください。

1. お気に入りのウェブブラウザを開き、Docker Hub アカウント にログインします。

2. Docker Hub ホームページで、リポジトリの作成 オプションをクリックして、Docker Hub にリポジトリを作成します。

Creating a Repository

3. リポジトリに固有の名前を設定してください。このチュートリアルでは、以下に示すようにcircleci-tutorialと呼ばれるリポジトリが使用されています。

Naming and Creating the Docker Hub Repository

4. プロジェクトのルートに新しいファイル(flask-circleci/config.yml)を作成し、以下のコードをconfig.ymlファイルにコピー/貼り付けてください。

以下のコードは、準備ができたPythonイメージを取得し、それを使用して依存関係をインストールし、ユニットテストを実行してDockerイメージをビルドし、リポジトリDocker Hubにプッシュします。

通常、本番のプロジェクトでは、CircleCI内部またはおそらく.envファイル内にユーザー名とパスワードを保護する必要があります。

version: 2  # CircleCIのバージョン
jobs:
  build:
    docker:
      - image: python:3.8
    steps:
      - checkout

      - run:
        # プロジェクト用の仮想環境を作成します。
				# それに依存関係をインストールし、テストを実行します。
          name: Run unit tests
          command: |
            python3 -m venv venv
            . venv/bin/activate
            pip install -r requirements.txt
            pytest
			# Dockerコマンドを実行するために構成されたリモートDocker環境を作成します。
      - setup_remote_docker 
       
      - run:
        # Dockerコマンドを実行するために使用するDockerクライアントをインストールします。
          name: Install Docker client
          command: |
            set -x
            VER="17.03.0-ce"
            curl -L -o /tmp/docker-$VER.tgz https://get.docker.com/builds/Linux/x86_64/docker-$VER.tgz
            tar -xz -C /tmp -f /tmp/docker-$VER.tgz
            mv /tmp/docker/* /usr/bin
      - run:
         # Docker HubにプッシュするためのDockerイメージをビルドします。
				 # タグ(-t)のパターンは以下のようになります。
				 # CircleCIは現在のディレクトリからDockerfileを取得します。
         # <docker_hub_username/docker-hub-password:version>。
          name: Build Docker image
          command: docker build -t khabdrick/circleci-tutorial:v1 .

      - run:
        # 作成したDockerイメージをDocker Hubにプッシュします。
        # khabdrick/circleci-tutorial:v1を以下のように置き換えてください。
				# 上記でビルドしたイメージに使用した<docker_hub_username/docker-hub-password:version>
          name: Push to Docker Hub
          command: |
            docker login -u username -p password
            docker push khabdrick/circleci-tutorial:v1

5. 最後に、プロジェクトのルートで以下のコマンドを実行して、コードをcommitしてpushします(flask-circleci/config.yml)GitHubリポジトリに。

git add . # 変更をステージングエリアに追加
git commit -m "update" # 変更をコミット
git push # GitHubにプッシュ

CircleCI CI/CD Pipeline

あなたはたった今、CircleCI CI/CD パイプラインを作成しましたが、現時点ではそれがただそこにあってそれほど活動していません。CircleCI アカウントでプロジェクトを設定して、パイプラインをアクティブにする必要があります。

1. ウェブブラウザーでGitHub アカウントでCircleCI アカウントにログインします。

2. 次に、左パネルのプロジェクトタブをクリックし、プロジェクトの右側にあるプロジェクトをセットアップボタンをクリックして、プロジェクト上のCircleCI パイプラインをアクティブにします。

GitHub アカウントで CircleCI にログインしたので、プロジェクトは以下の画像のように CircleCI と同期されます。

Setting up a Project

3. ダッシュボードタブに戻り、成功ステータスが表示されます。 成功ステータスは、すべてが予想どおりに実行され、イメージが Docker Hub リポジトリにプッシュされたことを示します。

ビルドをクリックして、パイプラインで実行されたすべてのステップを表示できます。

Viewing Project Status

以下では、CircleCI がパイプラインを実行するために実行した手順のリストを確認できます。

Viewing Steps that Ran the Pipeline

4. 最後に、Docker Hub リポジトリに切り替えると、CircleCI パイプラインを介して Docker Hub にプッシュしたイメージが表示されます。

Viewing Pushed circleci docker images in Docker Hub Repository

GitHub に変更をプッシュして CircleCI パイプラインをトリガーする

今では、すでに動作するCircleCIパイプラインを持っています。しかし、おそらくあなたのプロジェクトに変更を加えました。そうした場合、パイプラインがまだ動作しているかどうかをどのように知るのでしょうか? GitHubリポジトリに変更をプッシュしてCircleCIをトリガーし、テストが成功するかどうかを確認できます。

1. ローカルマシンで、test_main.pyにあるコードを以下のコードで置き換えます。以下のコードは、ステータスコードが200から400に変更されたため、テストが失敗するようにわざと設定されています。

from main import app

def test_main():
		# このアプリケーションのテストクライアントを作成します。
    response = app.test_client().get('/') 

		# ページ('/')のステータスコードが400でない場合に失敗するように断言します。
		# テストを失敗させる。
    assert response.status_code == 400 
		# ページの戻りステートメントをアサートします
    assert response.data == b'Flask App' 

2. 次に、Dockerイメージを構築してDocker Hubにプッシュするconfig.ymlstepsを以下のコードで置き換えます。

以下のコードでは、バージョンを変更して、新しい変更のみがGitHubリポジトリにプッシュされるようにしています。

      - run:
          name: Build Docker image
          command: docker build -t khabdrick/circleci-tutorial:v2 .

      - run:
          name: Push to DockerHub
          command: |
            docker login -u username -p password
            docker push khabdrick/circleci-tutorial:v2

3. プロジェクトのルートで次のコマンドを実行して、コードをGitHubリポジトリにcommitしてpushします。

git add . # 変更をステージングエリアに追加
git commit -m "v2" # 変更をコミット
git push # GitHubにプッシュ

4. そして、CircleCIダッシュボードに移動すると、以下のようにビルドがFailedと表示されます。

ビルドをクリックして、変更が行われたステップを表示し、ビルドが失敗した原因を確認してください。

Viewing Project Status (Failed)
Showing Failed Tests

5. 最後に、Docker Hub リポジトリに移動し、変更がプッシュされていないことを確認してください。

以下の画像でわかるように、テストが失敗したため、v2 はアップロードされませんでした。

Viewing Repository in Docker Hub

結論

このチュートリアルでは、テストの書き方と Python アプリケーションの Docker 化方法を学びました。CircleCI を使用してアプリケーションのテストを実行し、Docker イメージを Docker Hub にプッシュする CI/CD パイプラインを作成しました。

この時点で、CircleCI を使用した CI/CD パイプラインの基礎知識をすでに持っています。では、この新しい知識をどのように活用する予定ですか?おそらく、Docker イメージを Heroku にデプロイする CI/CD パイプラインを作成するでしょうか?

Source:
https://adamtheautomator.com/circleci-docker-images/