Jenkinsを使っていると、ビルド中に突然「Could not find credentials」というエラーに遭遇し、頭を抱えた経験はありませんか?このエラーは、CI/CDパイプラインの心臓部である認証情報(Credentials)が正しく設定されていないことを示します。一見単純なエラーに見えますが、その原因は多岐にわたり、プロジェクトの規模が大きくなるほど複雑になる傾向があります。
この記事では、15年以上の経験を持つシニアITエンジニアが、このエラーの即時解決策から、プロの現場で遭遇する真の原因、そして二度と発生させないためのシステム設計・運用アドバイスまで、実践的な知見を交えて徹底解説します。
目次
結論:最も速く解決する方法
「Jenkins: Could not find credentials」エラーの最も一般的な原因は、必要な認証情報がJenkinsに登録されていない、またはジョブと正しく紐付けられていないことです。以下の手順で即座に解決を試みてください。
- Jenkins管理画面へのアクセスとCredentialの確認/追加:
- Jenkinsに管理者権限を持つユーザーでログインします。
- 左メニューから「
Jenkinsの管理」 > 「Credentials」 > 「System」 > 「Global credentials (unrestricted)」をクリックします。 - エラーメッセージで参照されているCredential IDが存在するか確認してください。
- 存在しない場合、または内容が間違っている場合は、「
Credentialsの追加」をクリックします。- 「種類」で、必要な認証情報のタイプ(例: 「SSH Username with private key」、「Username with password」、「Secret text」など)を選択します。
- 適切な情報(ユーザー名、パスワード、秘密鍵など)を入力し、エラーメッセージで示されたCredential IDと全く同じIDを設定します。
- 「OK」をクリックして保存します。
- ビルドジョブ設定でのCredentialsの紐付け:
- エラーが発生している対象のジョブ(パイプラインまたはFreestyleプロジェクト)の設定画面に移動します。
- Pipelineジョブの場合:Pipelineスクリプト内で
withCredentialsステップが正しく記述されているか確認します。Credential IDが正確に指定されている必要があります。pipeline { agent any stages { stage('Deploy') { steps { withCredentials([sshUserPrivateKey(credentialsId: 'your-ssh-credential-id', keyFileVariable: 'SSH_KEY')]) { sh 'ssh -i ${SSH_KEY} user@host "command"' } } } } }または、ユーザー名とパスワードの場合:
withCredentials([usernamePassword(credentialsId: 'your-userpass-credential-id', usernameVariable: 'USER', passwordVariable: 'PASS')]) { sh "echo ${USER}:${PASS} | base64" } - Freestyleジョブの場合:ビルドステップ(例: 「シェルの実行」や特定のプラグインのステップ)内で、Credentialを選択するドロップダウンメニューがあれば、正しいCredential IDが選択されていることを確認します。
- ビルドの再実行:上記の設定変更後、対象のジョブを再度ビルドして、エラーが解消されたか確認します。
- (必要であれば)Jenkinsサービスの再起動:稀に、Jenkinsが新しいCredential設定を即座に認識しない場合があります。上記の手順で解決しない場合は、Jenkinsサービスを再起動してみてください。
http://your-jenkins-url/restartにアクセスするか、OSレベルでサービスを再起動します。重要: 本番環境での再起動は、他の稼働中のジョブに影響を与える可能性があるため、計画的に実施してください。
【プロの視点】このエラーの真の原因と緊急度
「Could not find credentials」エラーは、一見すると「設定ミス」という単純な原因に集約されがちですが、シニアエンジニアの視点から見ると、その背景にはJenkinsの認証情報管理の複雑さや、現場特有の見落としが潜んでいます。
エラーの技術的な深掘り
JenkinsのCredentialsは、単なるテキスト情報ではありません。これはプラグインによって拡張可能な独自のオブジェクトとして管理されており、その「スコープ(Scope)」が重要な意味を持ちます。
* **Global Credentials (System)**: Jenkins全体で利用可能な認証情報。最も広いスコープ。
* **Folder Credentials**: 特定のフォルダ配下のジョブでのみ利用可能な認証情報。
* **Item Credentials**: 特定のジョブでのみ利用可能な認証情報。最も狭いスコープ。
このエラーの真の原因は、**ジョブが参照しようとしているCredential IDが、そのジョブのスコープ内で利用可能なCredentialとして認識されていない**ことにあります。Pipelineスクリプトで `credentialsId: ‘your-credential-id’` と記述されていても、その `your-credential-id` が現在のジョブから参照可能なスコープに存在しない場合、このエラーが発生します。
特に、Pipeline as CodeでShared Libraryを使用している場合、Shared Library内で定義された関数が参照するCredentialが、呼び出し元のジョブのスコープで利用可能かどうかは、多くのエンジニアが見落としがちなポイントです。
現場でよくある見落としポイント
1. **Credential IDのタイプミス**: 最も初歩的ですが、頻繁に発生します。特に大文字・小文字、ハイフンなどの記号一つでも異なれば、JenkinsはCredentialを見つけることができません。
2. **スコープの不一致**: Globalで登録したつもりが、実際には特定のフォルダやジョブにCredentialが登録されており、他の場所から参照できないケース。またはその逆で、ジョブ固有のCredentialを参照しようとしているのに、Globalにしか存在しないため参照できないケース。
3. **新しいJenkins環境での移行漏れ**: 新しいJenkinsインスタンスを構築したり、環境を移行したりする際に、Credentialsのバックアップや移行が漏れてしまうことがあります。特に機密情報であるため、手動での再登録が必要になることも多いです。
4. **プラグインの依存関係**: 特定のプラグインが利用するCredentialタイプ(例: Docker Credential, Kubernetes Credentialなど)が、Jenkins Coreの標準Credentialとは異なる管理パスを持つ場合があります。その場合、該当プラグインの設定画面でCredentialが正しく登録されているか確認する必要があります。
5. **アクセス権限の問題**: JenkinsのRole-Based Access Control (RBAC) プラグインなどを使用している場合、ジョブを実行するユーザーやJenkinsエージェントが、特定のCredentialへの参照権限を持っていないためにエラーとなることがあります。
6. **Secret FileやSecret Textのパス問題**: `Secret File` タイプの場合、ファイルが一時的に展開されるパスが存在しないか、あるいはパスが正しく参照されていない場合も発生します。
緊急度
このエラーは、ビルドが停止し、CI/CDパイプラインが機能しなくなるため、**緊急度は高い**と言えます。特に本番デプロイに関わるパイプラインで発生した場合、リリース遅延に直結します。
しかし、システム全体がダウンするような致命的なエラーではなく、原因と解決策が比較的明確であるため、迅速な対応で復旧が可能です。影響範囲は該当ジョブに限定されることが多いです。
再発防止のためのシステム設計・運用アドバイス
このエラーに二度と悩まされないためには、シニアエンジニアとして以下のシステム設計と運用プラクティスを強く推奨します。
1. **Credential管理の標準化と命名規則の徹底**
* **命名規則**: Credential IDには、その用途(`github-ssh-key-for-projectA`)、スコープ(`global-aws-access-key`)、環境(`dev-db-password`)などを明確に含む統一された命名規則を適用します。これにより、必要なCredentialを迷わず見つけられるようになります。
* **ドキュメント化**: どのCredentialが何のために使われているか、誰が管理者かなどを詳細にドキュメント化し、チーム内で共有します。
2. **Credentialのスコープの最小化**
* 必要なCredentialは、可能な限り狭いスコープ(FolderまたはItem)で登録することを推奨します。全てのCredentialをGlobalに置くと、管理が煩雑になり、セキュリティリスクも高まります。
* 特定のジョブでしか使わないCredentialは、そのジョブに紐付けて登録します。
3. **Jenkins Shared LibraryによるCredentialの抽象化**
* Jenkins Pipelineで `withCredentials` を直接記述するのではなく、Shared Libraryに関数としてカプセル化することを推奨します。
* 例えば、デプロイ用の認証情報が必要な場合、Shared Libraryに `getDeploymentCredentials()` のような関数を定義し、内部で `withCredentials` を利用します。これにより、Credential IDの変更や管理ロジックの変更があっても、各Pipelineスクリプトを修正する必要がなくなります。
* **例(`vars/myUtils.groovy`)**:
// myUtils.groovy
def withDeployCredentials(Closure body) {
withCredentials([usernamePassword(credentialsId: 'MY_DEPLOY_USER_PASS', usernameVariable: 'DEPLOY_USER', passwordVariable: 'DEPLOY_PASS')]) {
body()
}
}
return this
**利用側**:
// Jenkinsfile
@Library('your-shared-library@master') _
pipeline {
agent any
stages {
stage('Deploy') {
steps {
script {
myUtils.withDeployCredentials {
sh "echo 'Deploying with user: ${env.DEPLOY_USER}'"
// ... do deployment using DEPLOY_USER, DEPLOY_PASS
}
}
}
}
}
}
4. **環境変数の活用と直接記述の回避**
* Credential IDをPipelineスクリプトに直接ハードコードするのを避け、Jenkinsの環境変数やパラメータとして定義し、それを利用するようにします。これにより、環境ごとのCredential IDの違いにも柔軟に対応できます。
5. **外部シークレット管理ツールとの連携**
* JenkinsのCredentialsストアだけでなく、HashiCorp Vault、AWS Secrets Manager、Azure Key Vaultなどの専門的なシークレット管理ツールとの連携を検討します。
* これにより、Credentialの一元管理、自動ローテーション、監査ログの強化が可能になり、Jenkins自体のセキュリティ負担を軽減できます。
6. **RBAC(Role-Based Access Control)によるアクセス制御**
* Credentialsへのアクセス権限を細かく設定し、必要なユーザーやジョブのみが参照できるように制限します。これにより、不正なアクセスや誤操作による情報漏洩リスクを低減します。
7. **定期的な棚卸しと監査**
* 利用されていないCredentialがないか、期限切れのCredentialがないかなど、定期的に棚卸しを実施します。
* Credentialの変更履歴やアクセスログを監査し、不審な動きがないか確認します。
これらの対策を講じることで、JenkinsのCredentials管理は格段に堅牢になり、将来的なトラブルを未然に防ぎ、CI/CDパイプラインの安定運用に貢献するでしょう。単なるエラー解消に留まらず、よりセキュアで効率的なシステム運用を目指しましょう。