PipeCDを使ったGitOpsによる継続的デリバリー
アプリケーションリポジトリの作成
サンプルアプリケーション(Hello App)を用意します。gkuga/hello-appにサンプルアプリケーションがありますので、自分のアカウントにコピーします。都合上Forkではなくあなたのアカウントにhello-appという名前でPublicでリポジトリを作成してプッシュしてください。以下のようなコマンドを実行するとコピーできます。
# あなたのGitHubアカウントに空のhello-appリポジトリを作成後 $ git clone git@github.com:gkuga/hello-app.git $ cd hello-app $ git remote set-url origin git@github.com:<あなたのアカウント名>/hello-app.git $ git push orgin main
このアプリケーションは/helloにアクセスするとHello, world!という文字列が返ってくる簡単なWebアプリケーションです。リポジトリに含まれるRELASEファイルでバージョン情報を管理しています。
Hello Appリポジトリに以下のコマンドでGitタグを作成しておいてください。
$ git tag v0.0.0 $ git push origin v0.0.0
以降はRELASEファイルに記述されたバージョンを書き換えると自動でタグとGitHubリリースが作成されるようになります。
注意
2021年9月時点においてフォーク先からフォーク先のPRでもActionsが実行されないようです。ワークアラウンドとして.github/workflows内の対象ファイルを上書きすると実行されるようになります。Publicリポジトリにするのは今回のデモの都合上です。
CIの動作確認
Hello Appリポジトリでは既にGitHub Actionsで継続的インテグレーションのための設定が以下のようにされています。
- PRを出すとビルドとテストが実行される
- マージされるとDockerイメージが作成され、GCHRにプッシュされる
- RELEASEファイルでバージョンを上げるとGitHubリリースが作成され、Dockerイメージが作成され、GHCRにプッシュされる
以上の設定を確認しましょう。/hello/fooにアクセスするとHello, foo!が帰ってくるように変更します。main_test.goに次の行を追加しPRを作成してください。
// main_test.go 22行目に以下を追加
{method: "GET", target: "/hello?name=foo", wantStatus: http.StatusOK, wantBody: "Hello, foo!"},
変更によりmain_test.goのDiffは以下のようになります。
PRを作成するとGitHub Actionsの実行が失敗します。main.goを次のように変更してください。
// main.go 34行目を削除
io.WriteString(w, "Hello, world!")
// 以下に変更
io.WriteString(w, "Hello, ")
q := r.URL.Query()
if name := q.Get("name"); name == "" {
io.WriteString(w, "world!")
} else {
io.WriteString(w, name+"!")
}
変更によりmain.goのDiffはこのようになります。
変更を反映するとGitHub Actionsの実行が成功します。確認したらPRをマージしてください。マージ後にしばらく待つとGHCR[注7]にv0.0.0-xxxというような形式でDockerイメージが作成されています。次にRELEASEファイルをv0.0.0からv0.0.1に変更してPRを作成してください。
RELASEファイルを変更しPRを作成するとChangelog since v0.0.0というようなタイトルでPRにコメントされます。PRをマージしてしばらくすると、v0.0.1のGitHubリリースが作られます。同時にv0.0.1というタグが付けられたDockerイメージが作成されたら成功です。このチェンジログやリリースがされる仕組みはPipeCD actions-gh-releaseというGitHub Actionsによるものです。このようにPipeCDではGitOpsを支援するGitHub Actionsを提供しています。
[注7] https://github.com/<あなたのGitHubアカウント名>/hello-app/pkgs/container/hello-appというようなURLにアクセスすると確認できます。
設定リポジトリの作成
次にアプリケーションの設定用のリポジトリ(Hello App Config)を作成します。gkuga/hello-app-configを自分のアカウントへForkしてください。こちらはGitHub ActionsがありませんのでForkで大丈夫です。
Hello App Configリポジトリでは既にPipeCDによる継続的デリバリーのための設定が以下のようにされています。
- dev環境では変更があればすぐにdevネームスペースにデプロイする
- prod環境では変更があれば承認を待ち、承認されるとprodネームスペースにデプロイする
リポジトリにはdev環境用のディレクトリとprod環境用のディレクトリがあります。どちらのディレクトリにも.pipe.yamlファイルがあります。このファイルはPipedエージェントが参照するファイルで、どのようにアプリケーションをデプロイするかが記述された設定ファイルです。prod/.pipe.yamlファイルを見てください。
apiVersion: pipecd.dev/v1beta1
kind: KubernetesApp
spec:
input:
manifests:
- deployment.yaml
- service.yaml
pipeline:
stages:
- name: WAIT_APPROVAL
- name: K8S_PRIMARY_ROLLOUT
stagesでデプロイされるまでにPipedエージェントが行う処理(ステージ)をリスト形式で指定します。prod環境ではデプロイに承認が必要なので、WAIT_APPROVALというステージがあります。承認された後、K8S_PRIMARY_ROLLOUTステージにより、最新の変更をロールアウトします。また、dev環境の設定であるdev/.pipe.yamlではstagesはありません。stagesがない場合は変更があればすぐにデプロイ(Quick Sync)されます。
PipeCDでは監視するリポジトリに変更があった時に、その変更された状態にするまでの処理のステップをステージとして定義します。この一連のステージをパイプラインと呼びます。
Hello App Configリポジトリのdev/deployment.yamlとprod/deployment.yamlに記述されているimage: ghcr.io/<あなたのGitHubアカウント名>/hello-app:v0.0.1を先程作成されたDockerイメージのURLに変更してください。
最後にSSH鍵を作成し、ForkしたHello App ConfigリポジトリのDeploy Keyに公開鍵を登録してください。この時にAllow write accessにチェックを入れるのを忘れないでください。書き込み権限は後ほど行うイメージタグの自動更新で必要になります。Pipedエージェントは登録されたSSH鍵を使いリポジトリの変更を監視します。
