継続的インテグレーション (CI) では、プロジェクト内のメイン Git ブランチにマージする前に機能ブランチを自動でテストして、 不具合が発生するような変更でコードベースが更新されることを防ぎます。 一方、継続的デリバリー (CD) では CI をベースとして各ブランチやメイン ブランチのリリースを自動化することで、 アジャイル ソフトウェア開発の理念どおり、小規模な増分更新をスピーディにユーザーに届けます。
今回の記事では、GitHub と連携した環境での CI/CD プロセスについてご説明します。 CI パイプラインのデモには Python アプリケーションを使用します。
以下の手順に沿って説明していきます。
- シンプルな Python アプリケーション (Flask を使用) を作成する
- このアプリのテストを作成する
config.yml
ファイルを追加する- GitHub にプッシュする
- CircleCI を構成する
- バッジで
README
を更新する - プル リクエストを作成して CircleCI の動作を確認する
シンプルな Python アプリを作成する
前提条件
このチュートリアルを進めるには、いくつかの準備が必要です。
アプリの作成
シンプルにするために、Flask でアプリを作成します。 Flask は Python のマイクロフレームワークです。 このチュートリアルでは、フレームワークの知識はほとんど必要ありません。 こちらのドキュメントのサンプルを使用します。
まず、プロジェクト ディレクトリ (フォルダー) を作成し、cd
でそこに移動します。 具体的には、ターミナルに以下を入力します。
mkdir python_app && cd $_/
次に、任意のエディターを開いて hello.py
ファイルを作成します。 そのファイルに以下の行をコピーします。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
Python の仮想環境
Python で作業する場合、仮想環境を使用することを強くお勧めします。 そうすれば、Python パッケージをローカル マシン全体に対してではなく、抽象化された環境内にインストールすることができます。 そのためには virtualenv
や、さらに便利な virtualenvwrapper
を使用するのが一般的です。 ここでは、Python3 の一部として提供されるモジュール venv
を使用します。 使用方法は次のとおりです。
- 仮想環境を作成する
python3 -m venv venv
次の例のように、仮想環境には venv とは違う名前を付けることもできます。
python3 -m venv Env
- この環境をアクティブ化する
source venv/bin/activate
仮想環境に別の名前を付けた場合は、venv の部分をその名前に置き換えてください。 シェル プロンプトの先頭にその環境名が表示されます。これは、その仮想環境がアクティブになっていることを示しています。 インストールされている Python パッケージがすべて、この環境にインストールされます。 なお、以下を実行するだけで、この環境を非アクティブ化できます。
deactivate
アプリの実行
では、エディターで requirements.txt
ファイルを作成しましょう。 ファイルに Flask
という語を追加して保存します。
Flask
次に、仮想環境内で以下を実行して、パッケージをインストールします。
pip install -r requirements.txt
最後に、以下のコマンドでアプリを実行します。
FLASK_APP=hello.py flask run
http://localhost:5000/にアクセスすると、ブラウザーでアプリケーションの実行を確認できます。
テストを作成する
エディターで tests.py
ファイルを作成し、そのファイルに以下の行を貼り付けます。
from hello import app
with app.test_client() as c:
response = c.get('/')
assert response.data == b'Hello World!'
assert response.status_code == 200
テストの詳細については、下記の関連ページをご覧ください。
次はテストの実行です。 ターミナルを開いて以下を実行します。
python3 tests.py
ターミナルには何も返ってこないはずです。 なぜなら、 この Flask アプリは成功時にターミナルに出力を行うように構成されていません。 つまり、テストは成功したということです。 前述の関連ページには、テストが成功または失敗したときのターミナルの処理例も示されていますが、このチュートリアルではこれで十分でしょう。
CircleCI 設定ファイルを追加する
.circleci
フォルダーを作成します。その中に config.yml
ファイルを作成し、 以下の行を貼り付けます。
version: 2
jobs:
build:
docker:
- image: circleci/python:3.6
steps:
- checkout
- restore_cache:
key: deps1-{{ .Branch }}-{{ checksum "requirements.txt" }}
- run:
command: |
python3 -m venv venv
. venv/bin/activate
pip install -r requirements.txt
- save_cache:
key: deps1-{{ .Branch }}-{{ checksum "requirements.txt" }}
paths:
- "venv"
- run:
name: テストの実行
command: |
. venv/bin/activate
python3 tests.py
- store_artifacts:
path: test-reports/
destination: python_app
この config
ファイルの詳細については、https://circleci.com/docs/ja/language-python/ を参照してください。
GitHub にプッシュする
本来なら、コードを早期に頻繁にコミットするという理念に基づいて、このプロセスのもっと早い段階で Git を初期化して、こまめにコミットできるようにしておくべきですが、 CircleCI と GitHub の連携についてのチュートリアルであるため、意図的にここまで触れてきませんでした。
現在、コードは次のような構成になっています。
エディターを開き、作業ディレクトリに .gitignore
ファイルを作成して、 Git にコミットしたくないファイルやフォルダーを指定します。 このファイルには以下の行を貼り付けます。
# バイトコンパイル済みファイル/最適化されたファイル/DLL ファイル
__pycache__/
*.py[cod]
# 仮想環境
venv/*
これで、以下のコマンドを実行してコードをコミットできるようになりました。
git add .
git commit -m "Initial commit"
まだ GitHub アカウントを持っていない場合は、GitHub のサイトにアクセスして、アカウントを作成してください。 GitHub を初めて使用する場合は、こちらのチュートリアル(英語)をお読みになることをお勧めします。 次に、リポジトリを作成します。
新しいリポジトリを作成すると、次のようなページが表示されます。
2 つ目の […push an existing repository (既存のリポジトリをプッシュ)] オプションを選択します。 以下を実行します。
git remote add origin https://github.com/NdagiStanley/python_app.git
git push -u origin master
CircleCI を構成する
リポジトリを GitHub に作成したので、これで CircleCI を構成して CI を完成させることができます。 CircleCI のユーザー登録ページにアクセスし、 GitHub アカウントで CircleCI にサインアップします。
ログインしたら、このチュートリアルで使用する自身の GitHub アカウントがアクティブになっていることを確認します。 複数の GitHub 組織がある場合、そのうちの 1 つがアクティブになっているはずです。 左上のドロップダウン メニューをクリックし、自身の GitHub ユーザー名を選択します。 次に [Add Projects (プロジェクトの追加)] をクリックします。 最新のプロジェクト「python_app」が表示されます。
プロジェクトが表示されている行の右側にある [Set up Project (プロジェクトのセットアップ)] をクリックします。 リダイレクト先のページに [Next Steps (次のステップ)] セクションが表示されます。 使用する .circleci/config.yml
ファイルを用意していない場合は、1 番のステップから始めますが、 config.yml
ファイルは既に用意してあるので、このチュートリアルでは 5 番までスクロールして、[Start building (ビルドの開始)] をクリックします。
すぐにビルドが処理され、 完了です。
右上の [Settings (設定)] 歯車アイコンをクリックします。 次に左側の [Projects (プロジェクト)] をクリックして、最後に [python_app] をクリックします。
circleci.com/gh/<ユーザー名>/python_app
のようなパスになるはずです。 今回の私のパスは https://circleci.com/gh/NdagiStanley/python_app
となっています。 リポジトリ [python_app] の横の歯車アイコンをクリックします。
今回のプロジェクトに関して、ユーザーが変更できる設定を理解しておくことは重要であるため、 関連する設定についてここで触れておきます。
[Advanced Settings (詳細設定)] では、[Only build pull requests (プル リクエストのみビルド)] がオフになっています。 つまり、プル リクエストを含め、GitHub へのすべてのプッシュが CircleCI で実行されるということです。
README をステータス バッジで更新する
ローカル マシン上で次のコマンドを実行して、別の Git ブランチにチェックアウトします。
git checkout -b add_readme
エディターを開いて README.md
ファイルを作成します。 以下の行をコピーしてファイルに貼り付けます。
README.md
# PYTHON アプリケーション
この Python アプリケーションのリポジトリは、GitHub と CircleCI の連携を説明するために作成されました。
[![CircleCI](https://circleci.com/gh/NdagiStanley/python_app.svg?style=svg)](https://circleci.com/gh/NdagiStanley/python_app)
タイトルと簡単な説明を追加しました。
ここで、以下のコマンドを実行します。
git add .
git commit -m "Add README"
git push -u origin add_readme
https://github.com/<username>/python_app にアクセスすると、新しいブランチ add_readme
が作成されているのがわかります。 [Compare & pull request (比較してプル リクエスト)] をクリックします。
プル リクエストを作成する
以下のようにプル リクエストをセットアップしました。
[Create pull request (プル リクエストを作成)] をクリックすると、瞬時に以下のようになります。
ビルドに成功しました。 [Show all checks (すべてのチェックを表示)] をクリックすると、 CircleCI からのチェックであることがわかります。
ブラウザーのタブのファビコンにも、成功したことを示すマークが表示されます。
[Details (詳細)] をクリックすると、CircleCI のビルドにリダイレクトされます。
こちらのファビコンにも、ビルドが成功したことが示されています。
上部の [python_app] をクリックします。
このプロジェクトのビルドにリダイレクトされます。
おわりに
これですべての手順が完了しました。 GitHub と CircleCI を連携させました。 要約すると、Python アプリをセットアップし、テストを作成しました。 さらに、CircleCI の設定ファイルを作成し、コードベースを GitHub にプッシュしました。 最後に、作成した GitHub リポジトリと CircleCI の接続を確認しました。
着実に手順を踏んでいけば、GitHub に独自のプロジェクトを立ち上げて、CircleCI で CI ビルドを構成できることがおわかりいただけたでしょうか。 以下のリンクは、この記事の執筆時に参考にしたドキュメントです。
- https://circleci.com/docs/ja/configuration-reference/#example-full-configuration
- https://circleci.com/docs/ja/configuration-reference/
Stanley 氏は、ソフトウェア エンジニアであり、テクニカル コピーライターでもあります。また、テクニカル チームの統括やコミュニティ エンゲージメントなど、さまざまな仕事に従事しています。 氏は digerati (デジタル界の知識人) を自任しています。