ディスカッション (42件)
皆さんこんにちは!皆さんが普段どのようなツールでCI/CDパイプラインを構築しているのか、ぜひ教えてください。また、今どきのベストプラクティスについても気になっています。現在自社開発のプロダクト企業で働いているのですが、社内独自のツールを使っていて標準的な構成から取り残されている感覚があります。皆さんの環境で「Jenkins + Argo + K8S」の組み合わせを使っている方はいますか?ぜひ知見を共有してもらえると嬉しいです!
どうやってそのプロダクト系企業に入ったの?答えてくれたら君の質問にも答えるよ
[削除されました]
😃😃
数年前に参加したよ。TerraformとVM上で動くスタンドアロンのDockerを扱ってきた。もちろん面接はクリアしてるよ。
やあBasic_Let7303、もちろんだよ!うちはスタートアップで、こんな構成にしてる。
プロデューサーリポジトリ -> GitHubの再利用可能ワークフロー
コンシューマーリポジトリ -> アプリ、インフラリポジトリ
CI/CDのベースはこれ。
PRイベント
mainへのプッシュ
各リポジトリで再利用可能ワークフローを呼び出すメインのオーケストレーターが1つあるよ。
- PRイベントは品質、セキュリティ、コミットメッセージの作法、古いブランチの整理がメイン
- mainへのプッシュはバージョニング、ビルド、アップロード、GitOpsの更新、統合・ユニット・E2Eテストの実行がメイン
スタックはCI/CDにGitHub、K8s、ArgoCDを使ってる。セキュリティ面ではSAST、SCA、イメージスキャンをやってるよ。
PRの段階でユニットテストは走らせるべきじゃない?
ホントそれ!🙌
PRで何かしらのテストはやってないの?
ああ、うちはPRイベントでテストを実行してるよ!見落としてたわ❤️
これまでの人生で聞いた中で一番ヤバい話だわ。信じられないくらい無駄。
こういうツールなしでエンタープライズ規模の品質とセキュリティを管理するなんて、頑張ってねとしか。
自分のプロジェクトの大半にはBuildkiteを使ってる。CIの要件は全部これで賄えてるし、KubernetesでもベアメタルでもECSでも、何にでもデプロイできる。前の職場で使い始めてからずっと愛用してるよ。
これを使えば間違いないっていう「聖杯」みたいなツールセットは存在しないよ。組織がどんなアプリを持っているか、どれくらい予算をかけられるか次第だね。例えば、K8SよりDockerベースのPaaSの方が合っている場合もあるし、Azureのエコシステムに入っているならJenkinsよりAzure DevOpsの方が良いかもしれない。
Nx
適材適所でツールを選ぶのが一番。うちではJenkins、GHA、Azure、K8sにVMを使い分けてるよ。ワークフローごとに何が最適かを検討する必要があるしね。基本的にはJenkinsよりGHAを優先して考えていて、近いうちにArgoCDも試す予定。大事なのはツールを無理やり当てはめることじゃなくて、目的に合った正しいツールを選ぶことだね。
GitHub ActionsはGitHubと密結合しすぎなんだよね。それが強みでもあるけど、同時に制約にもなってる。
一番の制約は、GitHubがまともに稼働し続けてくれないことだね。
というか、セキュリティも怪しい気がする…
このCIパイプラインは、公式のアップストリームバイナリと自前でビルドした静的バイナリの両方に同じスモークテストを行うことで、nginxのリリースを検証してるよ。まず公式のnginx:alpineイメージをプルしてSBOMを生成し、メインのスキャナーとしてgrypeでCVEをチェック(trivy-actionの侵害対策として、trivyはバックアップとして並列実行)。次に公式バイナリでスモークテストを実行してHTTPの挙動を確認。そのあと、muslとPCRE2を使ってソースからnginxをコンパイルし、カスタムの静的バイナリを作成。そのカスタムビルドにも独自の宣言的SBOMとgrypeでのCVEスキャンを実施(trivyはここで汎用的なPURLを扱えないからね)。で、コンパイルしたバイナリに同じスモークテストを通して、公式と同じ挙動かを確認する。両方のビルドでSBOM、脆弱性レポート、スモークテストの結果が揃うから、アップストリームのリリースと自分たちが用意した成果物を直接比較できる。最終的にバイナリは署名されて、すべての成果物と一緒に公開されるよ。https://github.com/wererootops/nginx-cache-build/blob/main/.github/workflows/nginx-ci.yml
へぇ!Grypeって初めて聞いたかも!🫡
CIにはGitHub Actions、GKEへのCDにはArgoCDを使ってる。Actionsでビルド、テスト、レジストリへのプッシュをして、ArgoCDがリポジトリを監視してクラスターと同期する感じ。この構成ならパイプラインが直接クラスターにアクセスする必要がないし、プッシュ型じゃなくてArgoCDがプルする形になるからすごく快適。シークレット系はSealed Secretsを使えば、すべてGitで管理できるしね。Jenkinsも強力だけど、今どきホスト型のCIがこれだけ優秀だと、わざわざメンテナンスするコストを正当化するのは難しいよ。
Argo CDってマネージドサービスとして使うべき?それともKubernetes内でセルフホストするべき?同じターゲットクラスターにHelmでArgo CDを入れると、管理対象のクラスターそのものに依存することになるのが気になってさ。もしクラスターが落ちたらArgo CDも使えなくなって、デプロイや復旧に支障が出るんじゃないかな。
多くの場合、Argoを他の「管理系」サービスと一緒に別のクラスターへ隔離して、そのクラスターのアップデート管理を厳格にする運用が一般的だね。どこにホストしてもダウンするリスクはあるから、トレードオフを理解しておくことが重要かな(うちはビルドと一部のデプロイにGitHub Actionsを使ってるけど、あそこが落ちたら何もできないっていうリスクを承知で使ってるよ)。
投稿者さん、大事な質問をしてるけど詳細が全然書かれてないよ。君の場合はbashスクリプトで十分かもしれないけど、それすら判断できないし……。
どんな詳細が必要なの?
何を作るのか、ソースコードはどこにあるのか、デプロイには何が必要か、出力は何でどこに置くのか、バックアップはどうなってるか、どんなテストが必要か、とか色々だよ。例えば、クラウドの小型組み込みデバイス用に特定のコンパイラでビルドするGitHubサブモジュールのCコードなのか、それともローカルのオンプレミスサーバーにあるPythonバックエンドを抱えたAzureのサービスなのかで話は全然違うでしょ?両方ともCI/CDツールは全く別物になるよね?
それな。結局はスタックとコンテキストがめちゃくちゃ大事。Windows上のモノリシックな.NETアプリのCI/CDと、K8s上の小さなGoサービス群とか、データパイプライン、モバイルアプリのCI/CDじゃ全然別物になるし。「Jenkins + Argo + k8s」って構成でも、組み方次第で20通りのアーキテクチャができるからね。言語やフレームワーク、モノリスかマイクロサービスか、セルフホストかクラウドか、K8s導入済みかVMか、デプロイ頻度やチーム規模……これら次第で「ベストプラクティス」の意味すら変わっちゃう。そうじゃないと、みんな自分の好きなツールを並べるだけで、あんまり役に立たない回答になっちゃうよね。
うちはCI/CDにGitLabコンポーネントを使ってる。言語ごとにコンポーネントを一つずつ発行して、パイプラインの基本的な考え方を共有する「コア」を持たせてるよ。GitLabは自分たちでK8s上に運用してて、言語ごとに専用のビルドコンテナを用意してる。あと、Pythonツールをまとめたコンテナも一つあって、それを使ってJiraチケットの更新とか、リリースノートやGitLabリリースの作成、自動バージョニングなんかをやってる。GitLabにはK8s連携があるから、リリースが今のデプロイ状態にどう紐付いてるかも追跡できるよ。この方法で約20個のマイクロサービスを管理してて、3人のチームで毎週9つの環境へデプロイしてる。
GitHub Actionsと基本的なyaml設定に頼るようにして、できるだけシンプルにしてるよ。スクリプトが必要なときは、モノレポの中にscriptsディレクトリを作ってそこにまとめてる。可読性を重視して、スクリプトは全部TypeScriptで書くのがマイルール。メインブランチからdevへの自動デプロイと、本番環境への手動ゲート付きデプロイ、あとはPRでのLintやユニットテスト、コード品質チェックをやってる。チームによっては、バージョン管理やJiraチケットのためにコミットメッセージのルールを強制することもあるかな。CI/CDエンジニアじゃないけど、全部自分で管理したい性格のフルスタックエンジニアって感じだね。
今はCIでやってるタスクの多くをDaggerに移行しようとしてるよ。CIをなるべく環境依存させないようにして、もし乗り換えが必要になっても楽にできるようにしてる。DaggerならCIタスクをローカルで実行してテストできるのがいい。プロジェクトの回し者じゃないけど、その便利さには本当にびっくりしたよ。https://dagger.io/
CIにはGitlab、CDにはGitを利用したプロモーション機能付きのGitlab、GitOpsにはArgoCDを使ってる。ターゲットは、ステートレスなアプリにはAKS、それ以外はVM / ACI / App Serviceって感じ。
やあWaltuh。パイプラインに興味があるなんて知らなかったよ。
CIにJenkins、CDにFlux。
だよね。今はGitHub ActionsとArgoCD、K8sを使ってるけど、昔のJenkinsてんこ盛りな環境より管理がずっと楽。一番大きかったのは、CIジョブの中に隠れたカスタムスクリプトを大量に書くやり方から、GitOpsスタイルのデプロイへ移行したことかな。
CIテスト、バリデーション、アーティファクトのパブリッシュ、ビルドにはAzure DevOps。
CDと環境管理にはOctopus。
スキーマ管理とインフラにはAlembicとTerraformを使ってる。
以前はJenkinsを使ってた。今はYml(GitLab系が多い)+Linuxランナーの組み合わせが一番お気に入り。オンプレのテストベッド(宇宙関連の機材)をよく扱うから、手動プロセスを認証してから翻訳するようなやり方をしてる。
FreeBSD上でセルフホストしたForgejoインスタンス、階層型jailとZFS委譲を使ったビルダー風のjail環境、あとはSalt-api経由でSaltstackオーケストレーションって感じ。
リポジトリや状況に合わせて、AWS、Terraform(OSS版とHCP版)、Ansible、Puppet、GitHub Actionsを適宜組み合わせて使ってるよ。
ローカルファースト。これに尽きる。
仕事ではCircleCIとArgoCDを使ってるよ。個人プロジェクトなら、サーバー周りはシンプルにGitHub Actionsで、クライアントアプリのビルドとデプロイはCloudflareを使ってる。