実現したいこと
Apache Maven Deploy Plugin で Basic 認証をしてアーティファクトをデプロイしたい
詳細
Jenkins Pipeline から Gradle を用いた Java プロジェクトのアーティファクト(jar)を Nexus3 のアーティファクトリポジトリに Publish しようと考えています。
Nexus3 にデプロイするには Basic 認証が必要です。
ここでは仮として Nexus3 に以下のユーザ(とパスワード)が存在するとします。
ユーザ:sample
パスワード:P@sswor$
当初はパスワードがより簡易なもの( Password
)などであったため、以下のようにホスト名の前にユーザとパスワードを記述して Jenkins Pipeline からデプロイをしていました。
groovy
1 sh "mvn deploy:deploy-file \ 2 -DgroupId=sampleGroup \ 3 -DartifactId=sampleArtifact \ 4 -Dversion=0.0.1-SNAPSHOT \ 5 -Durl=http://${username}:${password}@localhost:8081/repository/maven-snapshots \ 6 -Dfile=sample.jar \ 7 "
問題はパスワードが P@sswor$
になったときです。上記のスクリプトでは認証エラー (Not authorized
) になってしまいました。
以下はエラーログの一部です。
(http://****:****@localhost:8081/repository/maven-snapshots): Not authorized [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.165 s [INFO] Finished at: 2019-08-06T18:25:36Z [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy-file (default-cli) on project standalone-pom: Failed to retrieve remote metadata sampleGroup:sampleArtifact:0.0.1-SNAPSHOT/maven-metadata.xml: Could not transfer metadata sampleGroup:sampleArtifact:0.0.1-SNAPSHOT/maven-metadata.xml from/to remote-repository (http://****:****@localhost:8081/repository/maven-snapshots): Not authorized -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
調査/確認事項
私が考えている認証エラーになる原因は RFC 3986 にもあるように URL に @
や $
といった予約文字を含む場合はパーセントエンコードが必要ですが、できていないこと。と考えています。
ただし単純にパスワードをパーセントエンコードした組み合わせ (この例でいうと sample
と P%40sswor%24
で -Durl=http://sample:P%40sswor%24@${nexusUrl}/repository/maven-snapshots
) では正常に認証できませんでした。
暫定的な対応案として、デプロイ時のみ以下のように JenkinsPipeline のなかで settings.xml を生成して
groovy
1sh """ 2cat <<EOF > ${configPath} 3<?xml version="1.0" encoding="UTF-8"?> 4 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> 5 <servers> 6 <server> 7 <id>repo</id> 8 <username>${username}</username> 9 <password>${password}</password> 10 </server> 11 </servers> 12</settings> 13EOF 14"""
それを以下のように Apache Maven Deploy Plugin で
mvn deploy:deploy-file ... -DrepositoryId=repo -s settings.xml
として読み込ませることで、認証してデプロイできることは確認できました。
しかし Jenkins に保持している Nexus3 の認証情報を settings.xml に書き出すことは微妙です(スクリプト終了時に rm -f settings.xml
などとして削除するとしても)。
公式のドキュメント https://maven.apache.org/plugins/maven-deploy-plugin/deploy-file-mojo.html を見る限り、settings.xml に記述した repositoryId を用いるしかないのでしょうか?
良い方法があれば教えていただきたいですm(_ _)m
宜しくおねがいします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。