最近「DockerCon」イベントで,ほとんど手间をかけずにCI / CDパイプラインをコードベースに実装する方法を中心に讲演しました。このブログでは,讲演で使用したデモコードとCircleCIのコンフィグについて说明し,CI / CDパイプラインをコードベースに実装する方法をデモします。

このブログでは以下について说明します。

  • Python的瓶アプリケーションの简単な単体テスト
  • プロジェクトでCircleCIのコンフィグファイルを使用してコードベースにCI / CDパイプラインを実装する方法
  • 泊坞窗イメージのビルド
  • 泊坞枢纽への泊坞窗イメージのプッシュ
  • 数字海洋サーバーの泊坞窗コンテナでアプリケーションを実行するデプロイスクリプトの开始

前提条件

このブログの操作を始める前に,以下の設定が必要です。

  • 泊坞枢纽アカウント
  • CircleCIダッシュボードで泊坞枢纽のユーザー名とパスワードを指定するプロジェクト环境変数の设定します。
  • クラウドサーバーへのSSHアクセス.CircleCIポータルから自分のアカウントにSSHキーを追加できます。このブログでは,数字海洋のサーバーを使用しますが,お好きなサーバー/クラウドプロバイダーを自由に使用できます。
  • また,このアプリケーションのデプロイに使用されるデプロイスクリプトをホストサーバーに配置する必要があります。ここで使用するサンプルのデプロイスクリプトは,deploy_app.shです。

すべての前提条件を満たしたら,次のセクションに进みましょう。

アプリ

このブログでは,シンプルなPython烧瓶を使用します。このプロジェクトの完全なソースコードはここから入手でき,git的克隆コマンドを使用してローカルに展開できます。このアプリは,リクエストが送信されたときに html を返却する単純な Web サーバーです。Flask アプリケーションはhello_world.pyファイルに存在します。

从烧瓶中导入烧瓶应用程式=烧瓶(__ name__)DEF wrap_html(消息):HTML = “””< html >风格=“字体大小:120像素;”><中心><图像高度=“200”宽度=“800”src =“https://infosiftr.com/wp content/uploads/2018/01/unnamed - 2. png”>点击{0}点击> < /中心"".format(message) return html @app.route('/') def hello_world(): message = 'Hello DockerCon 2018!' html = wrap_html(消息)返回html,如果剩余域名__ ='剩余域名__':app.run(主机='0.0.0.0',端口=5000)

このコードの重要なポイントは,hello_world ()関数内の信息変数です。この変数により文字列値が指定され、この変数値が一致するかどうかを単体テストでテストします。

テストコード

すべてのコードをテストして,高品质で安定したコードがリリースされているかを确认する必要があります.Pythonには单元测试という名前のテストフレームワークが付属しており,このブログではこのフレームワークを使用します。完全な瓶アプリケーションを准备できましたので次はこのアプリケーションをテストし,设计どおりに机能することを确认するための単体テストが必要です。単体テストファイルtest_hello_world.pyは,このhello_world.pyアプリのための単体テストです。では,コードを见ていきましょう。

进口程序hello_world进口单元测试类TestHelloWorld(unittest.TestCase生成):DEF设定(自):self.app = hello_world.app.test_client()self.app.testing =真DEF test_status_code(个体):响应= self.app.get('/')self.assertEqual(response.status_code,200)DEF test_message(个体):响应= self.app.get( '/')消息= hello_world.wrap_html( '你好DockerCon 2018!')self.assertEqual(响应。数据,消息)如果__name__ == '__main__':unittest.main()
进口程序hello_world进口单元测试

进口ステートメントを使用して你好,世界アプリケーションをインポートします。これによりテストで,hello_world.pyのコードにアクセスできます次。に,单元测试モジュールをインポートし,アプリケーションのテストカバレッジの定义を开始します。

类TestHelloWorld (unittest.TestCase):TestHelloWorldは,テストの最小単位である基本クラスunittest.Testからインスタンス化されます。これは,特定の入力セットに対する特定の応答をチェックします。单元测试は,新しいテストケースの作成に使用できる基本クラスである测试用例を提供します。

DEF设定(自):self.app = hello_world.app.test_client()self.app.testing =真

设置()は,テストフィクスチャを准备するために呼び出されるクラスレベルのメソッドです。これは,テストメソッドを呼び出す直前に呼び出されます。この例では,应用という変数を作成して定義し,hello_world.pyコードのapp.test_client()オブジェクトとしてインスタンス化します。

DEF test_status_code(个体):响应= self.app.get( '/')self.assertEqual(response.status_code,200)

test_status_code ()はメソッドであり,テストケースをコードで记述します..このテストケースは,瓶アプリケーションに対する得到リクエストを作成し,アプリケーションの応答をキャプチャして,响应変数に入れます。self.assertEqual(response.status_code,200)は,response.status_codeの结果の値を,得到リクエストが成功したことを示す期待値200と比较します。サーバーが200以外のSTATUS_CODEで応答した场合,テストは失败します。

DEF test_message(个体):响应= self.app.get( '/')消息= hello_world.wrap_html( '你好!DockerCon 2018')self.assertEqual(response.data,消息)

test_message()は,异なるテストケースを记述している别のメソッドです。このテストケースは,hello_world.pyコードのhello_world ()メソッドで定义されている信息変数の値をチェックするように设计されています。前のテストと同様に,アプリに対して得到リクエストが行われ,结果がキャプチャされ响应変数に入れられます。次の行を见てみましょう。

消息= hello_world.wrap_html( '你好DockerCon 2018!')

この信息変数には,程序hello_worldアプリで定义されているhello_world.wrap_html()ヘルパーメソッドで生成されたHTMLが割り当てられます。你好DockerCon 2018という文字列がwrap_html()メソッドに提供され,HTMLに插入されて返されます。test_message()は,アプリのメッセージ変数がこのテストケースで期待される文字列と一致するかどうかを確認します。文字列が一致しない場合,テストは失敗します。

CI / CDパイプライン

アプリケーションと単体テストについて说明しましたので,次は,継続的インテグレーション/継続的デプロイメント(CI / CD)パイプラインをコードベースに実装しましょう.CircleCIを使用すると,CI / CDパイプラインを简単に実装できます。続行する前に,以下の操作を行っていることを确认してください。

CI / CDパイプラインの実装

プロジェクトをCircleCIプラットフォームでセットアップすると,アップストリームにプッシュされたコミットが検出され,CircleCIはconfig.ymlファイルで定义されたジョブを自动的に実行します。

まず,リポジトリのルートに新しいディレクトリを作成し,このディレクトリ内にYAMLファイルを作成する必要があります新しいアセットは,プロジェクトのGIT中リポジトリ内で,ディレクトリ:.circleci /ファイル:config.ymlの命名スキーマに従う必要があります。このディレクトリとファイルは,基本的にCircleCIプラットフォームのCI / CDパイプラインとコンフィグを定义します。

config.ymlファイル

config.ymlは,CI / CDのすべての高度な机能が取り込まれています。以下は,このサンプルファイルの使用例です。この构文でどのような处理が行われているかを简単に说明します。

版本:2个作业:build: docker: - image: circleci/python:2.7.14环境:FLASK_CONFIG:测试步骤:- checkout - run: name: Setup VirtualEnv命令:| echo的导出标签=0.1${CIRCLE_BUILD_NUM}' >> $BASH_ENV echo 'export IMAGE_NAME=python-circleci-docker' >> $BASH_ENV virtualenv helloworldhelloworld/bin/activate pip install—no-cache-dir -r requirementsrs .txt—run: name: run Tests命令:|。helloworld/bin/activate python test_hello_world.py - setup_remote_docker: docker_layer_caching: true - run: name: Build and push Docker image command: |。helloworld/bin/activate pyinstaller -F hello_world.py docker build -t ariv3ra/$IMAGE_NAME:$TAGecho $DOCKER_PWD | docker login -u $DOCKER_LOGIN -password-stdin docker push ariv3ra/$IMAGE_NAME:$TAG - run: name: Deploy app to Digital Ocean Server通过docker命令:| ssh -o StrictHostKeyChecking=no root@hello.dpunks.org "/bin/bash ./deploy_app.sh ariv3ra/$IMAGE_NAME:$TAG"

职位:キーは,実行されるジョブのリストを表します。ジョブは,実行されるアクションをカプセル化したものです。実行するジョブが1つしかない场合は,ジョブにキー名建立:を付ける必要があります。ジョブとビルドの詳細については,ここを参照してください。

建立:キーは,いくつかの要素から構成されます。

  • 泊坞窗:
  • 脚步:

泊坞窗:キーは,CircleCIに泊坞窗执行人を使用するように指示します。つまり,多克尔コンテナを使用してビルドが実行されます。

图片:circleci / python: 2.7.14は,ビルドが使用する泊坞イメージを指定します。

脚步:

脚步:キーは,このビルドで実行されるすべてのコマンドを指定するコレクションです。最初のアクションは,基本的にビルド环境に自分のコードの混帐克隆を実行する- 查看コマンドです。

——运行:キーは,ビルド内で実行するコマンドを指定します.RUNキーには名称:パラメーターがあり,コマンドグループにラベルを付けることができます。たとえば,名称:运行测试は,テスト関連のアクションをグループ化し,CircleCIダッシュボード内でビルドデータを整理および表示するのに役立ちます。

重要な注記:ブロックは,个々のシェルまたはターミナルに相当します。构成または実行されたコマンドは,后の运行ブロックでは保持されません。ヒントとコツのセクションで说明している$ BASH_ENVのワークアラウンドを使用します

-名称设置VIRTUALENV命令|回声 '出口TAG = 0.1。$ {} CIRCLE_BUILD_NUM' >> $ BASH_ENV回声 '出口IMAGE_NAME =蟒蛇-circleci-泊坞窗' >> $ BASH_ENV的HelloWorld的virtualenv。helloworld / bin /激活PIP安装--no-缓存目录-r requirements.txt

この运行ブロックの命令:キーには,実行するコマンドのリストが含まれます。これらのコマンドにより,このビルド全体で使用されるカスタム环境変数$ TAGおよびIMAGE_NAMEが设定されます。残りのコマンドは,python virtualenvをセットアップし,ファイルで指定されている必要な依存ライブラリをインストールします。

- 运行:名称:运行测试命令:|。的HelloWorld /斌/激活蟒蛇test_hello_world.py

この运行ブロックで,このコマンドがアプリケーションでテストを実行します。これらのテストが失败すると,ビルド全体が失败することになり,开発者はコードを修正して再コミットする必要があります。

- setup_remote_docker: docker_layer_caching: true

この运行ブロックは,setup_remote_docker:キーを指定します。このキーの机能により,多克尔执行人ジョブ内からの泊坞イメージのビルド,実行,レジストリへのプッシュが可能になります.docker_layer_cachingが真に设定されている场合,CircleCIは以前のジョブまたはワークフローでビルドされた泊坞イメージ(レイヤー)の再利用を试みますつまり,前のジョブでビルドしたすべてのレイヤーにリモート环境でアクセスできますただし,コンフィグで,docker_layer_caching:。真が指定されている场合でも,クリーンな环境でジョブが実行される场合があります。

このアプリの泊坞イメージをビルドし,イメージを泊坞中心にプッシュしているため,setup_remote_docker:が必要です。

-名称建立和推动码头工人形象命令|。helloworld / bin /激活pyinstaller - f hello_world.py搬运工构建-t ariv3ra / $ IMAGE_NAME:$ TAG。DOCKER_LOGIN -u $DOCKER_LOGIN -password-stdin码头工人推ariv3ra / $ IMAGE_NAME: $标签

建立和推动码头工人形象の运行ブロックは,pyinstallerを使用してアプリケーションを単一のバイナリにパッケージ化するコマンドを指定した后に,多克尔イメージのビルドプロセスに进みます。

搬运工构建-t ariv3ra / $ IMAGE_NAME:$ TAG。DOCKER_LOGIN -u $DOCKER_LOGIN -password-stdin码头工人推ariv3ra / $ IMAGE_NAME: $标签

これらのコマンドは,リポジトリに含まれるDockerfileに基づいて码头工人イメージをビルドします。Dockerfileには,多克尔イメージのビルド方法に关する指示が记述されています。

在Python:2.7.14 RUN的mkdir /选择/ hello_word / WORKDIR /选择/ hello_word / COPY requirements.txt。COPY DIST /程序hello_world /选择/ hello_word /曝光80 CMD [ “./hello_world”]

DOCKER_LOGIN -u $DOCKER_LOGIN -password-stdinコマンドは,CircleCIダッシュボードで设定された$ DOCKER_LOGINおよび$ DOCKER_PWD环境変数を认证情报としてログインし,このイメージを泊坞中心にプッシュします。

-名称通过泊坞窗部署应用数字海洋服务器命令|ssh -o StrictHostKeyChecking=no root@hello.dpunks.org "/bin/bash ./deploy_app.sh ariv3ra/$IMAGE_NAME:$TAG"

最後の実行ブロックでは,新しいコードを数字海洋プラットフォームのサーバーにデプロイします。リモートサーバーでデプロイスクリプトを作成していることを确认します的.sshコマンドでリモートサーバーにアクセスし,このサーバーでdeploy_app.shスクリプトを実行し,ariv3ra / $ IMAGE_NAME: $标签を指定します。これにより,泊坞枢纽からプルおよびデプロイするイメージが指定されます。

ジョブが正常に完了すると,config.ymlで指定したターゲットサーバーで新しいアプリケーションが実行されます。

まとめ

このブログでは,CI / CDパイプラインをコードとして実装する方法について说明しました。このサンプルでは,巨蟒テクノロジーを使用してビルドが行われていますが,一般的なビルド,テスト,およびデプロイのコンセプトをお好きな言语やフレームワークを使用して,简単に実装できます。このブログのサンプルは简単なものですが,このサンプルを拡张して,自分のパイプラインに合わせて调整することができます。CircleCIは有用なドキュメントを提供していますので,ドキュメントサイトをぜひご覧ください。操作方法が分からずに作业が中断してしまう场合には,https://discuss.www.drag240sx.com/社区/论坛(英语)サイトからCircleCIコミュニティで対応策を闻いてみることもできます。