CircleCI Dockerイメージをテストしてデプロイする方法を探している場合は、CI / CDパイプラインを作成すると、ソフトウェア配信を改善するのに長い道のりが必要になります。
このチュートリアルでは、CircleCIを使用してDockerイメージのCI/CDパイプラインを開発する方法を学習します。
テストに合格した場合にのみ、Dockerイメージを読んでデプロイしてください!
前提条件
このチュートリアルは、実践的なデモンストレーションになります。フォローする場合は、次のものがあることを確認してください。
- GitHub アカウントとGitHubリポジトリ すでに設定されています。
- GitHubアカウントにリンクされたCircleCIアカウント。
- DockerHubアカウント。
- Dockerがインストールされています。
- Linuxマシン–このチュートリアルでは Ubuntu20.04.3LTSを使用します。
PythonベースのアプリケーションのDockerイメージの作成
CI / CDパイプラインの作成にジャンプする前に、まずWebブラウザにテキストを表示するPythonアプリケーションに基づいてDockerイメージを作成します。アプリケーションの構築方法を簡単に説明し、アプリケーションのテストケースを作成してから、アプリケーションをコンテナ化します。
1.ターミナルを開き、次のコマンドを実行してinstall
を実行します フラスコとPytest。 FlaskはPythonでWebアプリケーションを構築するために使用されるフレームワークであり、PytestはテストPythonコードを作成するために使用されます。
pip install flask pytest
2.次に、好みの名前でプロジェクトディレクトリを作成しますが、プロジェクトディレクトリの名前はflask-circleci
です。 このデモでは。このディレクトリは、このチュートリアルのリソースを保存する場所です。
mkdir flask-circleci
3. flask-circleci / main.pyというファイルを作成します 次のコードを入力します。
以下のコードは、ブラウザのホームページに「Welcome tomyFlaskApp」というテキストを表示します。
from flask import Flask
app = Flask(__name__) #create an instance of the Flask class you just imported
@app.route('/')
def main():
# display a string in the home page
return "Welcome to my Flask App"
4.次に、 flask-circleci / test_main.pyという別のファイルを作成し、次のコードをコピーして貼り付けます。
以下のコードは、アプリケーションのテストクライアントを作成します。
Pytestでは、以下に示すように、テストファイルの名前がtest_で始まる必要があります。
from main import app
def test_main():
# Creates a test client for this application.
response = app.test_client().get('/')
# assert the stutus code of the page('/') is 200
assert response.status_code == 200
# assert the return statement to the page
assert response.data == b'Welcome to my Flask App'
5.次のコマンドを実行して、プロジェクトディレクトリ(flask-circleci
)に移動します。 )、プロジェクトのテストを実行します。
cd flask-circleci
pytest
テストが成功すると、以下に示すように、100%の進捗が得られます。
6.次に、テキストファイル( requirements.txt )を作成します )ルートディレクトリに依存関係を文書化し、以下のテキストを入力します。このファイルは、Dockerイメージをビルドして正しく機能するようにするために不可欠です。
Flask==2.0.3
pytest==6.2.5
7.最後に、新しいファイル( flask-circleci / Dockerfile)を作成します。 、以下の手順を Dockerfileに書き込みます。 Dockerイメージをビルドします。
Dockerfileの手順 次の手順を実行します:
- 画像にファイルを作成します。
- 現在のディレクトリ内のファイル内のすべてのファイルをコピーします( flask-circleci 。
- コードを実行する
# set the Base Image from which your image will be built on
FROM python:3.8
# create a directory called flask-circleci in root.
# This directory will contain the code which currently resides in
RUN mkdir /flask-circleci
# make /flask-circleci the working directory
WORKDIR /flask-circleci
# copy your requirements file to the directory you just created
COPY requirements.txt /flask-circleci
RUN pip install -r requirements.txt
# copy the current directory in you local machine to /flask-circleci in your image
ADD . /flask-circleci
EXPOSE 5000
CMD python main.py
CircleCI CI/CDパイプラインの作成
Dockerイメージの準備ができたら、コードをテストするためのCI / CDパイプラインを作成し、すべてのテストがDockerイメージに合格してDockerHubにプッシュされた場合。 Docker HubはGitHubのようなサービスですが、Dockerイメージの場合、コンテナーイメージを見つけて、チームや他の開発者と共有するのに役立ちます。
CI / CDパイプラインを作成するには、以下の手順に従います。
1.お気に入りのWebブラウザーを開き、DockerHubアカウントにログインします。
2. Docker Hubホームページで、リポジトリの作成をクリックします。 DockerHubにリポジトリを作成するオプション。
3.リポジトリに一意の名前を設定します。このチュートリアルでは、 circleci-tutorialというリポジトリを使用します 、以下に示すように。
4.新しいファイルを作成します( flask-circleci / config.yml) プロジェクトのルートで、以下のコードをコピーして config.ymlに貼り付けます ファイル。
以下のコードは、既製のPythonイメージを取得し、それを使用して依存関係をインストールし、単体テストを実行してDockerイメージをビルドしてリポジトリDockerHubにプッシュします。
通常、ライブプロジェクトの場合、ユーザー名とパスワードをCircleCI内、または.envファイルで保護する必要があります。
version: 2 # Version of CircleCI
jobs:
build:
docker:
- image: python:3.8
steps:
- checkout
- run:
# creates a virtual environment for you project,
# install dependencies in it and run tests
name: Run unit tests
command: |
python3 -m venv venv
. venv/bin/activate
pip install -r requirements.txt
pytest
# Creates a remote Docker environment configured to execute Docker commands.
- setup_remote_docker
- run:
# installs a docker client that will be used to run the docker commands
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:
# Builds a docker image to push to Docker Hub
# Tag (-t) pattern is below, where CircleCI
# to get the Dockerfile from the current directory.
# <docker_hub_username/docker-hub-password:version>.
name: Build Docker image
command: docker build -t khabdrick/circleci-tutorial:v1 .
- run:
# Pushes the Docker image you created to the Docker Hub.
# Replace khabdrick/circleci-tutorial:v1 with the
# <docker_hub_username/docker-hub-password:version> you used to build the image above
name: Push to Docker Hub
command: |
docker login -u unsername -p password
docker push khabdrick/circleci-tutorial:v1
5.最後に、プロジェクトのルートで次のコマンドを実行して、commit
を実行します およびpush
コード( flask-circleci / config.yml )GitHubリポジトリに。
git add . # adds changes to staging area
git commit -m "update" # commits your changes
git push # Push to GitHub
CircleCI CI/CDパイプラインのアクティブ化
CircleCI CI / CDパイプラインを作成したばかりですが、現在はそこに座っているだけで、あまり機能していません。 CircleCIアカウントでプロジェクトを設定して、パイプラインをアクティブ化する必要があります。
1.WebブラウザのGitHubアカウントでCircleCIアカウントにログインします。
2.次に、プロジェクトをクリックします 左側のパネルのタブをクリックし、プロジェクトの設定をクリックします プロジェクトの右側にあるボタンをクリックして、プロジェクトのCircleCIパイプラインをアクティブにします。
GitHubアカウントでCircleCIにログインしたため、プロジェクトは下の画像のようにCircleCIと同期されます。
3.ダッシュボードに戻ります タブをクリックすると、成功が表示されます 状態。 成功 statusは、すべてが期待どおりに実行され、イメージがDockerHubリポジトリにプッシュされたことを示します。
ビルドをクリックして、パイプラインで実行されたすべてのステップを確認します。
以下に、CircleCIがパイプラインを実行するために実行した手順のリストを示します。
4.最後に、Docker Hubリポジトリに戻ると、CircleCIパイプラインを介してDockerHubにプッシュしたイメージが表示されます。
CircleCIパイプラインをトリガーするためにGitHubに変更をプッシュする
これで、CircleCIパイプラインがすでに機能しています。しかし、おそらくあなたはあなたのプロジェクトに変更を加えました。もしそうなら、パイプラインがまだ機能していることをどうやって知ることができますか?変更をGitHubリポジトリにプッシュして、CircleCIをトリガーし、テストが成功するかどうかを確認できます。
1.ローカルマシンで、 test_main.pyにあるコードを置き換えます 以下のコードで。以下のコードは、ステータスコードが200
から変更されたため、意図的にテストが失敗することを保証します。 400
へ 。
from main import app
def test_main():
# Creates a test client for this application.
response = app.test_client().get('/')
# assert the status code of the page('/') is 400 when it isn't,
# causing the test to fail.
assert response.status_code == 400
# assert the return statement ton the page
assert response.data == b'Flask App'
2.次に、steps
を置き換えます config.yml内 これにより、Dockerイメージがビルドされ、以下のコードを使用してDockerHubにプッシュされます。
以下のコードでは、バージョンを変更するだけで、新しい変更のみがGitHubリポジトリにプッシュされるようになっています。
- run:
name: Build Docker image
command: docker build -t khabdrick/circleci-tutorial:v2 .
- run:
name: Push to DockerHub
command: |
docker login -u khabdrick -p Muhammed-1998
docker push khabdrick/circleci-tutorial:v2
3.プロジェクトのルートで次のコマンドを実行してcommit
およびpush
GitHubリポジトリへのコード。
git add . # adds changes to staging area
git commit -m "v2" # commits your changes
git push # Push to GitHub
4.次に、CircleCIダッシュボードに移動すると、ビルドが失敗であることがわかります。 、以下に示すように。
ビルドをクリックして、変更をプッシュするために実行した手順を確認し、ビルドが失敗した原因を確認します。
5.最後に、Docker Hubリポジトリに移動して、変更がプッシュされていないことを確認します。
下の画像でわかるように、テストが失敗したため、v2はアップロードされませんでした。
結論
このチュートリアルを通じて、テストの作成方法とPythonアプリケーションのDocker化の方法を学びました。アプリケーションのテストを実行し、DockerイメージをDockerHubにプッシュするCircleCIを使用してCI/CDパイプラインを作成しました。
この時点で、CircleCIを使用してCI/CDパイプラインを開発するための基礎知識がすでにあります。では、この新しく発見された知識をどのように使用するつもりですか?おそらく、DockerイメージをHerokuにデプロイするCI / CDパイプラインを作成しますか?