継続的インテグレーション (CI) では、プロジェクト内のメイン Git ブランチにマージする前に機能ブランチを自動でテストして、 不具合が発生するような変更でコードベースが更新されることを防ぎます。 一方、継続的デリバリー (CD) では CI をベースとして各ブランチやメイン ブランチのリリースを自動化することで、 アジャイル ソフトウェア開発の理念どおり、小規模な増分更新をスピーディにユーザーに届けます。
今回の記事では、GitHub と連携した環境での CI/CD プロセスについてご説明します。 CI パイプラインのデモには Python アプリケーションを使用します。
以下の手順に沿って説明していきます。
- シンプルな Python アプリケーション (Flask を使用) を作成する
- このアプリのテストを作成する
config.yml
ファイルを追加する- GitHub にプッシュする
- CircleCI を構成する
- バッジで
README
を更新する - プル リクエストを作成して CircleCI の動作を確認する
シンプルな Python アプリを作成する
前提条件
このチュートリアルを進めるには、いくつかの準備が必要です。
アプリの作成
シンプルにするために、Flask でアプリを作成します。 Flask は Python のマイクロフレームワークです。 このチュートリアルでは、フレームワークの知識はほとんど必要ありません。 こちらのドキュメントのサンプルを使用します。
まず、プロジェクト ディレクトリ (フォルダー) を作成し、cd
でそこに移動します。 具体的には、ターミナルに以下を入力します。
次に、任意のエディターを開いて hello.py
ファイルを作成します。 そのファイルに以下の行をコピーします。
Python の仮想環境
Python で作業する場合、仮想環境を使用することを強くお勧めします。 そうすれば、Python パッケージをローカル マシン全体に対してではなく、抽象化された環境内にインストールすることができます。 そのためには virtualenv
や、さらに便利な virtualenvwrapper
を使用するのが一般的です。 ここでは、Python3 の一部として提供されるモジュール venv
を使用します。 使用方法は次のとおりです。
- 仮想環境を作成する
次の例のように、仮想環境には venv とは違う名前を付けることもできます。
- この環境をアクティブ化する
仮想環境に別の名前を付けた場合は、venv の部分をその名前に置き換えてください。 シェル プロンプトの先頭にその環境名が表示されます。これは、その仮想環境がアクティブになっていることを示しています。 インストールされている Python パッケージがすべて、この環境にインストールされます。 なお、以下を実行するだけで、この環境を非アクティブ化できます。
アプリの実行
では、エディターで requirements.txt
ファイルを作成しましょう。 ファイルに Flask
という語を追加して保存します。
次に、仮想環境内で以下を実行して、パッケージをインストールします。
最後に、以下のコマンドでアプリを実行します。
http://localhost:5000/にアクセスすると、ブラウザーでアプリケーションの実行を確認できます。
テストを作成する
エディターで tests.py
ファイルを作成し、そのファイルに以下の行を貼り付けます。
テストの詳細については、下記の関連ページをご覧ください。
次はテストの実行です。 ターミナルを開いて以下を実行します。
ターミナルには何も返ってこないはずです。 なぜなら、 この Flask アプリは成功時にターミナルに出力を行うように構成されていません。 つまり、テストは成功したということです。 前述の関連ページには、テストが成功または失敗したときのターミナルの処理例も示されていますが、このチュートリアルではこれで十分でしょう。
CircleCI 設定ファイルを追加する
.circleci
フォルダーを作成します。その中に config.yml
ファイルを作成し、 以下の行を貼り付けます。
この config
ファイルの詳細については、https://circleci.com/docs/ja/language-python/ を参照してください。
GitHub にプッシュする
本来なら、コードを早期に頻繁にコミットするという理念に基づいて、このプロセスのもっと早い段階で Git を初期化して、こまめにコミットできるようにしておくべきですが、 CircleCI と GitHub の連携についてのチュートリアルであるため、意図的にここまで触れてきませんでした。
現在、コードは次のような構成になっています。
エディターを開き、作業ディレクトリに .gitignore
ファイルを作成して、 Git にコミットしたくないファイルやフォルダーを指定します。 このファイルには以下の行を貼り付けます。
これで、以下のコマンドを実行してコードをコミットできるようになりました。
まだ GitHub アカウントを持っていない場合は、GitHub のサイトにアクセスして、アカウントを作成してください。 GitHub を初めて使用する場合は、こちらのチュートリアル(英語)をお読みになることをお勧めします。 次に、リポジトリを作成します。
新しいリポジトリを作成すると、次のようなページが表示されます。
2 つ目の […push an existing repository (既存のリポジトリをプッシュ)] オプションを選択します。 以下を実行します。
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 ブランチにチェックアウトします。
エディターを開いて README.md
ファイルを作成します。 以下の行をコピーしてファイルに貼り付けます。
タイトルと簡単な説明を追加しました。
ここで、以下のコマンドを実行します。
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 (デジタル界の知識人) を自任しています。
ソフトウェアエンジニアであり、テクニカルコピーライターでもあるスタンリーは、技術チームのリーダーシップやコミュニティへの参加など、さまざまな役割を担ってきました。 彼は自分のことをdigerati(デジタル空間のリテラシー)と言っています。