Upgrade to Pro — share decks privately, control downloads, hide ads and more …

未来を見据えた CI/CD ~ 10年後も使える ビルド・テスト パイプライン ~

未来を見据えた CI/CD ~ 10年後も使える ビルド・テスト パイプライン ~

Snona

May 02, 2024
Tweet

More Decks by Snona

Other Decks in Technology

Transcript

  1. © 2022 CASAREAL,inc.    2 / 35    自分について 株式会社カサレアル

    プロフェッショナルソリューション技術部  Cloud Native Chief Architect 野中 翔太 Nonaka Shota
  2. © 2022 CASAREAL,inc.    3 / 35    株式会社カサレアル 設立

    1999年7月2日 資本金 5,000万円 従業員数 75名(2022年4月現在) 代表者 代表取締役社長 窪 伸一郎 株主構成 テクマトリックス株式会社(東京証券取引所市場第一部:3762) 所在地 東京都港区三田3-11-24 国際興業三⽥第2ビル ※ 2022年12月に移転予定: 東京都港区港南1-2-70 品川シーズンテラス
  3. © 2022 CASAREAL,inc.    4 / 35    社名の由来 スペイン語で「真の家」という意味を持ちます

    ここに多くの人々が集まり 世の中に貢献できる多くの技術者と事業者を育て 世の中を支えるシステムを構築していく という意味が込められています これはカサレアルの目標でもあります
  4. © 2022 CASAREAL,inc.    5 / 35    株式会社カサレアル -

    SERVICE - 3つの事業をワンストップで提供 ラーニング サービス クラウドネイティブ 推進支援サービス ビジネス ソリューション
  5. © 2022 CASAREAL,inc.    6 / 35    ラーニングサービス 研修事業

    オープン研修 カスタムメイド研修 新入社員研修 技術支援/内製化支援
  6. © 2022 CASAREAL,inc.    7 / 35    クラウドネイティブ推 進支援サービス

    プロフェッショナルサービス クラウドネイティブ推進支援 DevOps 環境構築支援 開発プロセスやテストの自動化 支援 クラウドネイティブ道場
  7. © 2022 CASAREAL,inc.    8 / 35    ビジネスソリューショ ン

    受託開発・SES システム構築サービス 開発支援サービス パッケージサービス
  8. © 2022 CASAREAL,inc.    9 / 35    CI/CD って?

    ソフトウェア開発におけるビルド・テストやデプロイを自動化し、これらを継続的に行う仕組み。 用語 意味 主なタスク例 CI 継続的インテグレーション JUnit テスト Gradle ビルド Docker イメージビルド&プッシュ CD 継続的デリバリー デプロイ etc…
  9. © 2022 CASAREAL,inc.    9 / 35    CI/CD って?

    ソフトウェア開発におけるビルド・テストやデプロイを自動化し、これらを継続的に行う仕組み。 用語 意味 主なタスク例 CI 継続的インテグレーション JUnit テスト Gradle ビルド Docker イメージビルド&プッシュ CD 継続的デリバリー デプロイ etc…
  10. © 2022 CASAREAL,inc.    10 / 35    CI/CD は必要?

    ビジネスの価値をより確実かつ迅速にエンドユーザーに届けるために必要です。 CI/CD の役割
  11. © 2022 CASAREAL,inc.    10 / 35    CI/CD は必要?

    ビジネスの価値をより確実かつ迅速にエンドユーザーに届けるために必要です。 CI/CD の役割 ビルド・テスト・デプロイの高速化(自動化) 自動化に伴う人的エラーの防止
  12. © 2022 CASAREAL,inc.    10 / 35    CI/CD は必要?

    ビジネスの価値をより確実かつ迅速にエンドユーザーに届けるために必要です。 CI/CD の役割 ビルド・テスト・デプロイの高速化(自動化) 自動化に伴う人的エラーの防止 リリースサイクルを高速化することで、ビジネスの価値をより確実かつ迅速にエ ンドユーザーに届けることができます。
  13. © 2022 CASAREAL,inc.    11 / 35    CI/CD を実現するツール

    CNCF Cloud Native Interactive Landscape (https://landscape.cncf.io/)
  14. © 2022 CASAREAL,inc.    11 / 35    CI/CD を実現するツール

    CNCF Cloud Native Interactive Landscape (https://landscape.cncf.io/)
  15. © 2022 CASAREAL,inc.    12 / 35    何を選ぶのがベスト? もちろん、ご自身のプロダクトに合ったツールを選択するのは前提ですが、

    そもそも… ベストの順位は時間経過(ユーザのニーズやビジネスモデルの変化)によって変動しません か?
  16. © 2022 CASAREAL,inc.    12 / 35    何を選ぶのがベスト? もちろん、ご自身のプロダクトに合ったツールを選択するのは前提ですが、

    そもそも… ベストの順位は時間経過(ユーザのニーズやビジネスモデルの変化)によって変動しません か? 何を選択したとしても、ツールに依存しないようにパイプラインを作成しておくことが重要で はないでしょうか?
  17. © 2022 CASAREAL,inc.    12 / 35    何を選ぶのがベスト? もちろん、ご自身のプロダクトに合ったツールを選択するのは前提ですが、

    そもそも… ベストの順位は時間経過(ユーザのニーズやビジネスモデルの変化)によって変動しません か? 何を選択したとしても、ツールに依存しないようにパイプラインを作成しておくことが重要で はないでしょうか? 何を選択したとしても、我々はプロダクトの成長を止めないことに全力を尽くすべきではない でしょうか?
  18. © 2022 CASAREAL,inc.    13 / 35    今、求められていることは? 様々なツールの選択肢であふれている今の時代、

    10年後も廃れないプロダクトであり続けるためには、 が重要ではないでしょうか。
  19. © 2022 CASAREAL,inc.    13 / 35    今、求められていることは? 様々なツールの選択肢であふれている今の時代、

    10年後も廃れないプロダクトであり続けるためには、 数多くの選択肢に惑わされないこと が重要ではないでしょうか。
  20. © 2022 CASAREAL,inc.    13 / 35    今、求められていることは? 様々なツールの選択肢であふれている今の時代、

    10年後も廃れないプロダクトであり続けるためには、 数多くの選択肢に惑わされないこと ビルド・テスト・デプロイといった普遍的なフローを再利用可能な資産にし ておくこと が重要ではないでしょうか。
  21. © 2022 CASAREAL,inc.    13 / 35    今、求められていることは? 様々なツールの選択肢であふれている今の時代、

    10年後も廃れないプロダクトであり続けるためには、 数多くの選択肢に惑わされないこと ビルド・テスト・デプロイといった普遍的なフローを再利用可能な資産にし ておくこと が重要ではないでしょうか。 Dagger はその手助けをしてくれます。
  22. © 2022 CASAREAL,inc.    14 / 35    Dagger とは

    ポータブルな CI/CD 開発キットというコンセプトの OSS(Apache License 2.0)
  23. © 2022 CASAREAL,inc.    14 / 35    Dagger とは

    ポータブルな CI/CD 開発キットというコンセプトの OSS(Apache License 2.0) Docker の生みの親( Solomon Hykes )がプロジェクトを推進している
  24. © 2022 CASAREAL,inc.    14 / 35    Dagger とは

    ポータブルな CI/CD 開発キットというコンセプトの OSS(Apache License 2.0) Docker の生みの親( Solomon Hykes )がプロジェクトを推進している 一度パイプラインを作成すれば、どこでも(ローカルでも)実行できる
  25. © 2022 CASAREAL,inc.    14 / 35    Dagger とは

    ポータブルな CI/CD 開発キットというコンセプトの OSS(Apache License 2.0) Docker の生みの親( Solomon Hykes )がプロジェクトを推進している 一度パイプラインを作成すれば、どこでも(ローカルでも)実行できる パイプラインは CUE 言語または Go 言語で記述する(他の言語の SDK もサポート予定)
  26. © 2022 CASAREAL,inc.    15 / 35    Dagger は何を解決するか

    GitHub Actions Jenkins Local Dagger Build & Test & Deploy
  27. © 2022 CASAREAL,inc.    15 / 35    Dagger は何を解決するか

    様々な CI/CD ツールにロックインしない ツールを Dagger 置き換えるのではなく、普遍的なフローを再利用可能にする GitHub Actions Jenkins Local Dagger Build & Test & Deploy
  28. © 2022 CASAREAL,inc.    15 / 35    Dagger は何を解決するか

    様々な CI/CD ツールにロックインしない ツールを Dagger 置き換えるのではなく、普遍的なフローを再利用可能にする ローカルで CI/CD を実行できる 記述したパイプラインの動作確認が容易 GitHub Actions Jenkins Local Dagger Build & Test & Deploy
  29. © 2022 CASAREAL,inc.    15 / 35    Dagger は何を解決するか

    様々な CI/CD ツールにロックインしない ツールを Dagger 置き換えるのではなく、普遍的なフローを再利用可能にする ローカルで CI/CD を実行できる 記述したパイプラインの動作確認が容易 既存の Dockerfile の記述をそのまま利用することもできる(互換性) 今ある資産も無駄にならない GitHub Actions Jenkins Local Dagger Build & Test & Deploy
  30. © 2022 CASAREAL,inc.    16 / 35    Dagger を使ってみる

    いくつかデモンストレーションを実施します。 1. Dagger で Gradle ビルドしてみる 2. Dagger で Docker ビルドしてみる 3. Dagger で Docker イメージをロードしてみる 4. Dagger で Docker プッシュしてみる 5. GitHub Actions で Dagger を実行してみる
  31. © 2022 CASAREAL,inc.    17 / 35    デモンストレーションの実施環境 バージョ

    ン 補足 Ubuntu(ホスト OS) 22.04 WSL 上の Docker コンテナ Dagger v0.2.36 Gradle 7.5.1 ビルド環境として DockerHub の gradle:7.5.1-jdk17 を使用 Corretto (OpenJDK のディストリビューシ ョン) 17 Java 実行環境として DockerHub の amazoncorretto:17 を使用 ECR - AWS のマネージドなコンテナレジストリサービス
  32. © 2022 CASAREAL,inc.    18 / 35    デモンストレーションのディレクトリ構成 主に、

    dagger.cue を編集する。 ├── build.gradle ├── dagger.cue // パイプラインを記述するファイル ├── pom.xml ├── settings.gradle └── src ├── main │ └── java │ └── com │ └── example │ └── springboot │ ├── Application.java │ └── HelloController.java └── test └── java └── com └── example └── springboot └── HelloControllerTest.java
  33. © 2022 CASAREAL,inc.    18 / 35    デモンストレーションのディレクトリ構成 主に、

    dagger.cue を編集する。 ├── dagger.cue // パイプラインを記述するファイル ├── build.gradle ├── pom.xml ├── settings.gradle └── src ├── main │ └── java │ └── com │ └── example │ └── springboot │ ├── Application.java │ └── HelloController.java └── test └── java └── com └── example └── springboot └── HelloControllerTest.java
  34. © 2022 CASAREAL,inc.    19 / 35    デモンストレーションのアプリ /

    に HTTP リクエストを送信すると、 Hello Dagger! という文字列を返す簡単な Web アプリケーション。 @GetMapping("/") return "Hello Dagger!"; package com.example.springboot; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { public String index() { } }
  35. © 2022 CASAREAL,inc.    20 / 35    デモンストレーションのイメージ(ローカル) Dagger

    1. Dagger 実行 App Runner ECR 2. パイプライン実行 3. デプロイ 1. Dagger プロジェクトの初期化 2. Gradle テスト 3. Gradle ビルド 4. Docker イメージビルド&プッシュ ECR へのプッシュを検出して 自動デプロイするように設定
  36. © 2022 CASAREAL,inc.    21 / 35    Dagger パイプラインの基本構成

    大まかに以下の4つの項目から構成されます。 パッケージ インポート クライアント アクション
  37. © 2022 CASAREAL,inc.    22 / 35    Dagger パイプラインの基本構成

    パッケージ 任意のパッケージ名を指定します。(未指定だと Dagger 実行時にエラーになります) インポート 使用するパッケージを記載します。(未使用のパッケージがあると Dagger 実行時にエラーになります) package sample import ( "dagger.io/dagger" ・・・ )
  38. © 2022 CASAREAL,inc.    23 / 35    Dagger パイプラインの基本構成

    クライアント ホストのファイルシステムに関する設定等を記載します。 下記の例では、カレントディレクトリの読み込みと、アクションの gradle_build の出力を build ディレクト リへ書き込む設定をしています。 client: { filesystem: { "./": read: contents: dagger.#FS "./build": write: contents: actions.gradle_build.contents.output } }
  39. © 2022 CASAREAL,inc.    24 / 35    Dagger パイプラインの基本構成

    アクション dagger do アクション で実行するアクションの定義を記載します。 下記の例では、gradle_build というアクションを定義しています。 dagger.#Plan & { actions: { gradle_build: #GradleBuild & { ・・・ } } }
  40. © 2022 CASAREAL,inc.    25 / 35    Dagger で

    Gradle ビルドしてみる Dagger で Gradle ビルドを実行し、jar が作成されることを確認します。
  41. © 2022 CASAREAL,inc.    26 / 35    Dagger で

    Docker ビルドしてみる Dagger で Docker ビルドを実行し、パイプラインが正常に終了することを確認します。 また、ローカルに Docker イメージが作成されていないことも確認します。
  42. © 2022 CASAREAL,inc.    27 / 35    Dagger で

    Docker イメージをロードしてみる Dagger で Docker ビルドを行うと、BuildKit 上でイメージが作成され、ローカルには作成されません。 しかし、開発中に正しくイメージが作成されていることを確認したい場合もあります。 その際は、ビルドしたイメージをローカルにロードすることができます。
  43. © 2022 CASAREAL,inc.    29 / 35    デモンストレーションのイメージ(GitHub 連携)

    ローカルとの違いは Dagger の呼び出し元の GitHub Actions のみ。 パイプラインを再利用。 GitHub Actions Dagger 1. Git Push 2. Dagger 実行 App Runner ECR 3. パイプライン実行 4. デプロイ 1. Dagger プロジェクトの初期化 2. Gradle テスト 3. Gradle ビルド 4. Docker イメージビルド&プッシュ ECR へのプッシュを検出して 自動デプロイするように設定
  44. © 2022 CASAREAL,inc.    30 / 35    ローカル GitHub

    Actions jobs:  ・・・ dagger: - name: Image Push uses: dagger/dagger-for-github@v3 with: version: 0.2 cmds: | project init project update do image_push dagger project init dagger project update dagger do image_push
  45. © 2022 CASAREAL,inc.    30 / 35    ローカル GitHub

    Actions jobs:  ・・・ dagger: - name: Image Push uses: dagger/dagger-for-github@v3 with: version: 0.2 cmds: | project init project update do image_push dagger project init dagger project update dagger do image_push
  46. © 2022 CASAREAL,inc.    33 / 35    Dagger の導入事例

    テクマトリックス NEO テクマトリックス NEO の開発で Dagger を利用しています。 NEOは、日本にクラウドネイティブのテクノロジーをより早くより多く広めていくためのサービスです。 クラウドネイティブ導入の伴走者として、初期教育から導入、運用まで幅広く支援をします。
  47. © 2022 CASAREAL,inc.    34 / 35    NEO のアーキテクチャと

    Dagger の役割 NEO は、簡単なブラウザ操作でネットワークや各種 OSS をインストールした VM の構築など、 開発環境に必要なクラウドインフラを即座に提供します。 クラウドインフラを構築するための IaC を実行するコンテナイメージを Dagger で作成しています。 ユーザ ブラウザ ECR ユーザの AWS 環境 VPC Public subnet NAT GW 踏み台サーバ Private subnet Control Server Node Group EKS ①Kubernetes の 環境をつくりたい! ②HTTP リクエスト ③イメージ Pull ④IaC コンテナ起動 開発者 Git リポジトリ ⑤EKS 構築 イメージ Build & Push Dagger 実行 Git Push
  48. © 2022 CASAREAL,inc.    35 / 35    最後に… 様々なツールの選択肢であふれている今の時

    代、 10年後も廃れないプロダクトであり続けるため には、数多くの選択肢に惑わされず、 ビルド・テスト・デプロイといった 普遍的なフローを再利用可能な資産にしておく こと が重要だと思います。 その手助けをしてくれる Dagger をぜひお勧め します。