AzureへのAzure Pipelinesを使ったアプリ(functions)とインフラ(Bicepメイン)のCICD / PullRequestをトリガーに独立環境を展開する

現在業務でAzureをプラットフォームにしたシステムの開発をしています。.netのコードがありそれがAzure functionsに展開されて動いている感じです。「何を作るか」「どうやって作るか」などかなりの部分を私がコントロール可能な状況にさせてもらってるので、色々とやりたいことが実現出来て素敵な感じです。 そんな中、アプリ開発はチームメンバーに任せて、私は主にインフラ周りのコードなどを書いてます。これまで個人でボッチ開発しかまともにしたことが無かったのでgitでbranchの扱いとか、commit履歴のコントロールとか色々と勉強になっております。 そして、開発基盤にAzure DevOpsを使っております。GitレポジトリもAzure Repos, パイプラインもAzure Pipelinesを使っています。 そこで、PullRequestの生成をトリガーに完全に独立した環境を構築してそこで事前確認ができる環境を作ってみました。レポジトリが1つなら簡単だったのですが、アプリケーションのレポジトリとインフラ展開のレポジトリを分割している状況であまり直接的な例が見つけられずかなり苦労してしまいました。多分丸4日くらいかかりました…。 次回以降簡単に実装できるように記録しておきたいと思います。 なお、私はまだまともなAzure Pipelines歴は3ヶ月くらいなので効率的じゃない部分多いかと思います。アドバイスありましたらコメントいただけると嬉しいです。 レポジトリ構成 AppRepo - .netのアプリケーションのコードが書かれている- InfraRepo - インフラ展開周りのコードが書かれている できるようにしたこと アプリもインフラも更新があったら最新のコードでメインの環境が更新される- アプリもインフラもPullRequestがあったらPullRequestに対応した独立環境が作成される。PullRequestに使われたBranchに更新があったらその更新も反映される。これによりmainブランチにマージする前にAzureの環境上で実際の動作を確認できる。 もうちょっと詳しいできるようにしたこと AppRepoのmainレポジトリに更新があったら自動でビルド&テスト。ビルド&テストがOKなら最新のインフラのコードとともにメイン環境に展開(更新)。- InfraRepoのmainレポジトリに更新があったら自動で最新のアプリのビルドとともにメイン環境に展開(更新)。- AppRepoにPullRequestがあったらPullRequestのbranchの最新のアプリのコードで自動でビルド&テスト。ビルド&テストがOKなら最新のインフラのコードとともにPullRequestのIDから作成した新規のリソースグループに最新のインフラのコードとともに展開(新規作成)。- PullRequestのbranchに更新があったらその最新のコードで自動で自動でビルド&テスト。ビルド&テストがOKなら最新のインフラのコードとともにPullRequestのIDから作成したリソースグループの環境をインフラもアプリも更新(更新)。- InfraRepoにPullRequestがあったらPullReqestのbranchの最新のインフラのコードでPullRequestのIDから作成した新規のリソースグループにmainブランチの最新のアプリのコードとともに展開(新規作成)。 実装アイデアおよび苦労した点 PipelineはAppRepoにパイプライン1つ、InfraRepoにパイプライン1つという形で実装しました。ほかにも良いやり方がある気がしましたが、色々と悩んだ末…。- Pipelineが起動された時、特にインフラ側のPipelineが起動された時にそれがどういうパターンで起動されたのかを判別させる部分で苦労しました。下記4パターンがあります。具体的な判別のさせ方はPipelineの中身のコードの方で解説します。1. AppRepoのPipelineが直接起動されたか、mainブランチの更新で起動されてビルドに成功した結果としてInfraRepoのパイプラインが起動された場合- 2. AppRepoのPipelineがPullRequestで起動された結果ビルドに成功し、その結果としてInfraRepoのパイプラインが起動された場合- 3. InfraRepoのパイプラインが直接あるいはmainブランチの更新によって起動された場合- 4. InfraRepoのパイプラインがPullRequestにより起動された場合- Azure PipelinesのPipeline間で情報を連携する良い方法がわからなくて苦労しました。結局ビルド結果やほかの方法での受け渡し方がわからなかったのでPullRequestのIDを書いたテキストも一緒にZipで固めてArtifactsとして発行し、インフラ展開側のPipelineでダウンロードして利用しました。(※PullRequestIDの受け渡しはもっと良い方法が明らかにある気がしています。) 具体的なやり方 AppRepoのPipeline n t v s a r a t m i b b p r - e - - # - - # - e g a r a i p : g t a i - t e a n v s t d i t d i P s c t d i 発 p d a e c n n h x b a a : a i n a i n u c o a i n 行 u i r $ r h c c m s c - l m l s s p c p a s s p c p a l r n s s p r i a a r b s t ( : : h l a : l e e u k p u o r r k p u o r r l i d k p u o n r r e l p i D e u i u R s : e : l t m o g : l t m o g R p i : l t o c c c p i l f a t s d n d E : : a s m j u a s m j u e t t a s t l h h l s a a t r : e e A v D y : a e m D y : a e m q : i A y : F u i i a h y c e u : : D m " o N n c e o N n c e u o r N o d v v c : N t : e M I w t a d t n t a d t n e e n c a l e e e e a : y E m i N m : s t N m : s t s c : h m d R T F E $ m y . a n e e : s e e : s t h i e e o y i x ( e d y m g d t : " : t : ' : I o e v : r o p l i B : r y d e o C b C t D q e O t e e s u o M w o B u o T e も " ( F " r F : : t i C p M s r u i r e s 保 $ v i A F o i l r d - e i l o e s t - 存 ( a l r i l z $ n d e d l C l d u C t ' * c し s r e c l d i ( g . a ) a L d " . t L T o て y i s h e e p B A A t . t I c p I e n お s a @ i : r u r r e $ e @ a s u @ s f く t b 2 v : i c t ( s 2 n p t 2 t i e l e " l h i f R t d r . g m e $ f d i f u e " o $ c u . s F ( a . v a n v R j ( s r p [ i S l A e c c : e ' S p a u ' l y s r : t t r s y r t l B e s e t S i ) t s o i l u s t i t t o o t j o R i " e f r a n r e ' n e l m a u g e m q d . c e i a . R u . D t n p D e e R e S g p e l s e f t D f e t a a a i a a a . s u g r r u s p o l i e t l e u n t n c i t ' l ' W g t f W l ] o D o a o R , r i r c r e k r y t k q ' i e ) i u P n c / n e u g t $ g s l D o ( D t l i r B i I R r y u r d e e ) i e ) q c / l c " u t $ d t e o ( . o > s r B B r t y u u y $ ' ) i i ) ( ) / l l / S p d d p y u . I u s b B d b t l u ) l e i i . i m s l z s . h d i h D _ I p _ e o d o f u ) u a t . t u p z p l u i u t t p t W " o r - k c i o n n g f D i i g r u e r c a t t o i r o y n ) / R p e u l b e l a i s s e h _ o u t p u t / p u l l r e q u e s t I D . t x t ほとんど素直にビルド、テストしたうえでArtifactを発行しているだけですが下記の部分で「PullRequestで起動された場合にはPullRequestのIDをpullrequestID.txtというテキストファイルに書いて一緒に発行されるようにしています。 ...

July 17, 2022 · 19 min · 胡田昌彦