Pocket

JenkinsのGoogle Play Android Publisher Pluginで、次のエラーで、アップロードに失敗していました。

Upload failed: org.jenkinsci.plugins.googleplayandroidpublisher.EphemeralCredentialsException: Failed to validate Google Service Account credential against the Google API servers. Check internet connectivity on the Jenkins server and try again.
	at org.jenkinsci.plugins.googleplayandroidpublisher.CredentialsHandler.getServiceAccountCredentials(CredentialsHandler.java:64)
	at org.jenkinsci.plugins.googleplayandroidpublisher.ApkPublisher.publishApk(ApkPublisher.java:374)
	at org.jenkinsci.plugins.googleplayandroidpublisher.ApkPublisher.perform(ApkPublisher.java:195)
	at hudson.tasks.BuildStepCompatibilityLayer.perform(BuildStepCompatibilityLayer.java:79)
	at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
	at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:741)
	at hudson.model.AbstractBuild$AbstractBuildExecution.performAllBuildSteps(AbstractBuild.java:690)
	at hudson.model.Build$BuildExecution.post2(Build.java:186)
	at hudson.model.AbstractBuild$AbstractBuildExecution.post(AbstractBuild.java:635)
	at hudson.model.Run.execute(Run.java:1840)
	at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
	at hudson.model.ResourceController.execute(ResourceController.java:97)
	at hudson.model.Executor.run(Executor.java:429)
Caused by: java.security.GeneralSecurityException: Unable to retrieve an access token with the provided credentials
	at com.google.jenkins.plugins.credentials.oauth.RemotableGoogleCredentials.<init>(RemotableGoogleCredentials.java:65)
	at com.google.jenkins.plugins.credentials.oauth.GoogleRobotCredentials.forRemote(GoogleRobotCredentials.java:177)
	at org.jenkinsci.plugins.googleplayandroidpublisher.CredentialsHandler.getServiceAccountCredentials(CredentialsHandler.java:39)
	... 12 more
Caused by: com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
  "error" : "invalid_grant",
  "error_description" : "Invalid JWT: Token must be a short-lived token (60 minutes) and in a reasonable timeframe. Check your iat and exp values and use a clock with skew to account for clock differences between systems."
}
	at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105)
	at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287)
	at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307)
	at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:394)
	at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:493)
	at com.google.jenkins.plugins.credentials.oauth.RemotableGoogleCredentials.<init>(RemotableGoogleCredentials.java:60)
	... 14 more

Ubuntu、Jenkins本体、プラグインをアップデートする、GooglePlayConsoleでサービスアカウントを新規作成する、鍵を新規生成する、JenkinsのCredentialsを新規作成する、とだいぶ迷走しました。

「com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request」で検索して、ようやく次の記事を見つけました。
GoogleのService Account認証に潜む invalid_grant 問題

Jenkinsサーバーの時計を確認すると、20分進んでいて、これが原因でした。JenkinsサーバーはUbuntu 14.04で「インターネット経由で時刻を合わせる」設定でしたが、なぜか20分も進んでいました。

dateコマンドで正しい時間を設定したところ、無事、GooglePlay Consoleにアップロードされました。

# 時計を 7月16日 01:26:00 に設定する
$ sudo date 07160126