Azure エキスパートへの道

Azure で、Azure Expert (AZ-400) の合格を目指して頑張るブログ

【Azure DevOps】Azure DevOps Demo Generator で、Django-based-python プロジェクトを作成

1. 初めに

最近 Azure を使うことが多い私ですが、いつも驚かされるのはそのスピードの速さです。

Azure DevOps, Microsoft が力を入れていることがうかがわされるサービスですね。

Microsoft Azure DevOpsがサービス開始されたのは、以下の記事にある通り、2018年9月10日のこと。

www.atmarkit.co.jp

当初触ったときには、まだできたばかりで足らないところも多い感じだったのが、今ではかなり充実していますね。

また、DevOps や CI/CDに慣れていない人向けの学習サイトも充実しているのにも驚かされます。

Azure learn, Azure DevOps Labs など、実際に触って、デモを作って、理解することができるサイトが数多く用意されています。今日は、Azure DevOps Labs の中の一つで、「Deploying a CD pipeline for a Django-based Python app」を実際に触ってみようと思います。

2. Azure DevOps Demoの事前準備

事前準備として、やらないといけないのが、

Azure Accountの準備と、 Azure DevOps Accountの準備。 

そのあたりは、こちらのサイトを見て実行。

www.azuredevopslabs.com

3. Azure Demo Generator でプロジェクト作成

まずは、Azure DevOps Demo Generatorで、 Python テンプレートを利用し、Django-based-python Project というのを作成します。

f:id:asato418:20191117232111p:plain

Demo用テンプレートもかなり充実しています。

f:id:asato418:20191117232600p:plain

しばらくすると、処理が完了し、自分の Azure DevOps アカウント上にプロジェクトが作成されます。 こちらにある、オレンジのDマークアイコンがついているプロジェクトが作成されました。

f:id:asato418:20191117233422p:plain

4. Project の設定。

4.1 用意されたテンプレートの確認

まずは、3. で作成したプロジェクトを開き、

f:id:asato418:20191117233550p:plain

左側の Repos をクリックすると、用意されたテンプレートのリポジトリが参照できます。

f:id:asato418:20191117233631p:plain

詳細なフォルダ構成は、こちら。

f:id:asato418:20191117233804p:plain

Application フォルダに、サンプルアプリケーションが展開されており、 Tests フォルダの下には、functional_tests , unit_tests の2つのテスト関連のフォルダも用意されているのがわかります。

4-2. ビルドパイプライン設定

次に、画面左の Pipeline → Builds をクリックすると、Python-CI のビルド画面になりますが、この段階では、ビルドの定義は何もない状態です。

f:id:asato418:20191117234217p:plain

なので、画面右上の Edit ボタンを押して、設定画面を開きます。

f:id:asato418:20191117234420p:plain

そして、画面左の Use Python 2.x を選択し、使用する Pythonのバージョンを設定します。

f:id:asato418:20191117234636p:plain

設定したら、次は、Install-dependencies を選択します。 (ここでは、右側に、コマンドで pip install -r ・・・・とありますが、これは、python のライブラリのインストールコマンド(pip install) で、pythonに必要なライブラリなどをインストールする設定をしています)

f:id:asato418:20191117234810p:plain

次に、画面左の pytest を選択。pytest というのは、pythonを使っている人であればご存知の、python用の単体テスト等の実行コマンドです。画面右に、pytest 自身のインストールと、pytest コマンドによるテストが設定されているのがわかります。

f:id:asato418:20191117235027p:plain

次に、画面左、Publish Test Resultsを選択します。 テスト結果をどういうフォーマットで出力するかが定義されています。

f:id:asato418:20191117235400p:plain

そして次、Archive application をクリックすると、ディレクトリ下のApplication を zip 圧縮する定義が設定されているのがわかります。

f:id:asato418:20191117235543p:plain

そしてその次、Archive Tests をクリックすると、ディレクトリ下のTestsをzip圧縮する定義がされているのがわかります。

f:id:asato418:20191117235903p:plain

その次、Publish Artifact をクリック。Artifacts を publish する定義がされています。

f:id:asato418:20191118000111p:plain

次に、Trigger タブをクリックし、Enable continuous integration のチェックボックスをチェックします。

f:id:asato418:20191118000349p:plain

ここまでを行ったら、画面上部の Save & queue → Save を押して、保存します。

4-3. リリースパイプライン設定。

次は、ビルドパイプラインと同様に、リリースパイプラインの設定を行います。 画面左、Releases を選択し、画面右上の Edit を選択。

f:id:asato418:20191118000924p:plain

表示された、Devの下の、1job 7 tasks という場所をクリック。

f:id:asato418:20191118001227p:plain

次のように、タスクが表示されます

f:id:asato418:20191118001319p:plain

そして、 Azure CLI をクリックし、画面右で使用可能なサブスクリプションを選択後、Authorize ボタンを押します。

f:id:asato418:20191118001721p:plain

すると、Azure へのログイン認証が要求されるので、ログインを実行。

次に、Variables タブを開きます。

f:id:asato418:20191118001955p:plain

Location など、変更が必要な場所を変更。(リソースグループも、先にPythonというリソースグループをAzure上に作っておいた方が良いのかな。。と思い作成しました。)

Tasksに戻り、画面右でInstall Python Extensionsを開き、必要な設定を行います。

  1. サブスクリプションを設定
  2. Action は Install Extensions
  3. App Service Name は $(appservice-name)
  4. Install Extensions は、Python 3.5.4 x86 を選択

f:id:asato418:20191118002329p:plain

次、Azure App Service Deploy の設定。

こちらも、ほぼ同様。サブスクリプションの設定と、App Servce Name へ $(appservice-name) を設定します。

f:id:asato418:20191118002752p:plain

そして、画面左、Run functional tests を選択。

設定を確認後、Pipeline Tab に戻り、Python-CI のタスクの右上のイナズママーク(Continuous Deployment Trigger)を押します。

f:id:asato418:20191118003143p:plain

画面右、上部の Creates a release every time a new build is available. を Enable にした後、画面上部の Saveボタンを押してセーブ。・・・と手順には書いてあったんですが、セーブが押せませんね。

f:id:asato418:20191118003305p:plain

Agent Phase の所が設定できておらず、セーブができませんでした。

Agent Phaseの所を設定。ここの解説がなかったので、Agent specificationを適当に、Ubuntuとかにしたら、Pipeline が通りませんでした。正解はvs2017-win2016の模様。

f:id:asato418:20191118013121p:plain

で、セーブ。

f:id:asato418:20191118012942p:plain

4-4. ソース更新、パイプライン実行。

設定のセーブをしたら、ソースを更新して、パイプラインを実行してみます。

修正はまあどこでも良いのですが、アプリケーションには影響のない部分、index.html を修正します。 Repos → Application → templates/app の下にある、index.htmlを選択し、

f:id:asato418:20191118013403p:plain

画面上部のEditを押し、32行あたりにある、Continuous Delivery を Continuous Delivery for Pythonに変更し、画面上部のCommit を押します。

コメントなどは適当にいれ、commit を実行。

画面左のPipelinesを選択、画面右で、実行されているタスクを選択すると、 ビルド&Testフェーズが実行されている状況が見えます。

f:id:asato418:20191118013814p:plain

すべて正常終了した画面がこちら。

f:id:asato418:20191118013847p:plain

ビルド&Testが正常終了したので、画面左の Pipeline → Release を見てみると、同じようにリリースパイプラインが動いているのを見ることができます。

f:id:asato418:20191118014045p:plain

すべて正常終了した画面がこちら。

f:id:asato418:20191118014250p:plain

ちゃんとリリースした後の Functional Test では、Seleniumを使ったテストも実行されていますね。素晴らしい。

そして、リリースが終了したということは、Azure の Python リポジトリ上に、アプリケーションがデプロイされているということです。Azure の方を見てみましょう。

4-5. Azure で、デプロイされたアプリを確認

Pythonリポジトリを見てみると、ちゃんとアプリケーションがデプロイされていますね。

f:id:asato418:20191118014440p:plain

デプロイされた App Service をクリックし、

f:id:asato418:20191118014537p:plain

AppServiceの画面上の 'Browse’メニューをクリックしてみると、

デプロイされたアプリケーションが表示されます。

f:id:asato418:20191118014650p:plain

ちゃんと修正したた部分も、「Continuous Delivery for Python」と表示されていますね。

5. 感想

さて、今回 Azure DevOps Labo に載っている、Demoを実行しただけですが、サンプルが非常に良いですね。 PythonDjangoという Webフレームワークのアプリケーションを AppService にデプロイして実行しているんですが、ちゃんとビルド、ユニットテストを実行し、出来上がったものに関しても、デプロイし、Seleniumを使った 機能テストも行っています。

とても良いと思うのは、こういったテンプレートを使ってアプリケーションを学んだ人は、ビルド時の Unit Test, リリース時の 機能テストは当然やるのが当たり前という習慣を持つことができそうな点です。

30年以上この業界で働いていますが、まだまだ自動Functional Test どころか、Unit Test すら当たり前に実施しているプロジェクトがどれだけあるかはちょっと疑問を持ったりしています。

(10年くらい前に、某プロジェクトに新しく入った時に、単体テストくらいはやった方が良くないですか?と言ったら、Unit Test を書くのであれば、コードが約2倍になりますから、2倍発注してくれないと仕事を受けられないという答えが返ってきて愕然としたのはまだ覚えてます(笑))

うちの会社の中でもこういったテンプレートを利用する人が増えて、単体テスト、機能テストは実施するのが当たり前になり、技術も品質も上がっていくのを期待しております。