SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

GitOpsで実現する継続的デリバリー

「PipeCD」で始める継続的デリバリー~GitOpsとプログレッシブデリバリーの実践

GitOpsで実現する継続的デリバリー 第3回

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
// main_test.go 22行目に以下を追加
{method: "GET", target: "/hello?name=foo", wantStatus: http.StatusOK, wantBody: "Hello, foo!"},

 変更によりmain_test.goのDiffは以下のようになります。

main_test.go 変更
main_test.go 変更

 PRを作成するとGitHub Actionsの実行が失敗します。main.goを次のように変更してください。

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はこのようになります。

main.go 変更
main.go 変更

 変更を反映するとGitHub Actionsの実行が成功します。確認したらPRをマージしてください。マージ後にしばらく待つとGHCR[注7]v0.0.0-xxxというような形式でDockerイメージが作成されています。次にRELEASEファイルをv0.0.0からv0.0.1に変更してPRを作成してください。

RELASE 変更
RELASE 変更

 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ファイルを見てください。

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.yamlprod/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鍵を使いリポジトリの変更を監視します。

次のページ
PipeCDを使ったGitOpsによる継続的デリバリー

この記事は参考になりましたか?

GitOpsで実現する継続的デリバリー連載記事一覧

もっと読む

この記事の著者

安井 岳(株式会社サイバーエージェント)(ヤスイ ガク)

 サイバーエージェントに中途入社し、社内基盤である継続的インテグレーションシステムの開発と運用に従事。現在は社内基盤のフィーチャーフラグ・ABテストシステムの開発と組織のデリバリーパフォーマンスの向上を支援する活動がメイン。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/14811 2021/10/18 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー