このブログ記事は、6回構成の「Configuration as Code」シリーズの第2弾です。
Configuration as Codeを使用すると、Jenkinsマスターの設定を簡単で宣言的なYAMLファイルで記述し、コードとしてSCMで管理できます。しかしこれは、パスワードやその他の機密情報をGitにコミットする必要があるという意味ではありません。
機密データの扱い
機密データの管理は、JCasCに最初に要求された機能の1つでした。そこで私たちは、機密情報を漏らすリスクなしにYAML設定サンプルを作成して共有できるよう、文字列の置換をサポートすることにしました。
credentials: system: # global credentials - credentials: - certificate: scope: SYSTEM id: ssh_private_key password: ${SSH_KEY_PASSWORD} keyStoreSource: fileOnMaster: keyStoreFile: /docker/secret/id_rsa
このYAMLドキュメントには、どのようにSecure Shell(SSH)キーに秘密のパスフレーズを設定するかという方法だけが記述されているので、安全にソースコード管理システム(SCM)にコミットできますし、一般に公開することもできます。パスフレーズは実行時に使われるだけです。
機密データ以外への応用
このメカニズムは機密データ用に設計したのですが、この仕組みを使えばYAMLドキュメントを編集せずに簡単に設定をカスタマイズできることにも気づきました。たとえば、bashでは環境変数が広く使用されていますが、それに似ています。このアイデアを推進するために、 bash形式の構文($ {PARAMETER:-defaultvalue})を使用したパラメーターのデフォルト値もサポートしています。
これにより、汎用的なYAMLファイルを設計し、適切なデフォルト値を使用してすぐに利用可能な状態のJenkinsをセットアップすることができます。また、YAML設定ファイルをフォークせずに一部の値をカスタマイズできるので、最新の状態を維持するために上流で行われた変更をマージする必要もなくなります。
tool: git: installations: - name: git home: ${GIT_PATH:-usr/local/bin/git}
ソース
文字列置換は複数のソースをサポートするほか、近い将来、シンプルなAPIによってより多くをサポートするよう拡張できます。
Jenkinsは環境変数をサポートしており、デフォルト値のオーバーライドというシナリオにも完全に対応できますが、環境変数を機密データに使うのは非常に悪い考えです。環境変数はJenkinsのUIやログに表示される可能性があるからです。
また、 Hashicorp Vaultのシークレットストレージもサポートしています。環境変数を利用して、適切なトークンを持つVault APIへのアクセスを設定します。
DockerとKubernetesのシークレットもサポートしています。これらを使ったことがない方は、特殊な処理をしているわけではないということだけ理解していただければと思います。DockerもKubernetesも、クラスターレベルでシークレットを管理し、実行時にコンテナに注入することができます。シークレットごとに1つのファイルを持つ単純なディレクトリを使用し、ファイルの内容がシークレットの値になります。このパターンは、カスタムJenkinsプラグインを記述せずに独自のシステムを統合したい場合、他の多くのツールで実装できます。
最後に、このAPIは他のユースケースや統合に合わせて自由に拡張可能です。統合したいツールがある場合、ある程度Java開発のスキルを持っているなら、アダプタープラグインを開発するのは非常に簡単です。
OK、では、この次は?
Jenkins Configuration for Codeプラグインの詳細については、プロジェクトのGitHubリポジトリをご覧ください。コミュニティやコントリビューターとチャットするには、私たちのgitterチャネルに参加してください。または、 DevOps World/Jenkins World 2018で直接JCasCプロジェクトとその未来についてお話しましょう。
また、「Configuration as Code」シリーズの次の記事もお見逃しなく。次回は、特定のプラグインを設定する方法を説明し、いくつかのサンプルをお見せします。
(この記事は、CloudBees社 Blog 「Jenkins Configuration as Code: Sensitive data」2018年8月30日 Nicolas De Loof 投稿の翻訳記事です。)