背景
我正在開發一個模板化的管道解決方案,以便團隊可以在 Jenkins 中運行的每個作業中一致地構建、測驗和掃描他們的專案。其中一個專案使用 Maven 進行依賴管理,并且需要傳遞 Jenkins 憑據,以便可以運行集成測驗。
什么作業?
通過命令列引數傳遞憑據作業正常。例如...
withCredentials([
[
$class: 'UsernamePasswordMultiBinding',
credentialsId: 'TEST',
usernameVariable: 'TEST_USERNAME',
passwordVariable: 'TEST_PASSWORD'
]
]) {
sh 'mvn clean install -D test_username=$TEST_USERNAME -D test_password=$TEST_PASSWORD'
}
想要的方法和結果是什么?
我強烈希望通過每個相應插件的配置(即 Maven Surefire 插件)將這些變數傳遞給底層插件。這種首選方法的理由是利用結構化方法來管理系統屬性。我嘗試了許多方法,包括通過設定<argLines>Surefire 配置的<systemPropertyValues>元素和設定元素來傳遞引數,但兩種方法都不起作用。此外,最好通過 YAML 檔案參考這些屬性以實作外部化配置,但如果無法在組態檔中參考憑據變數,我不反對其他訪問此資訊的方法。
pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<!-- Tacking 'env.' to the beginning of each variable name does not make a difference; tests still fail. -->
<argLines>-D test_username=${TEST_USERNAME} -D test_password=${TEST_PASSWORD}</argLines>
<systemPropertyVariables>
<test_username>${TEST_USERNAME}</test_username>
<test_username>${TEST_PASSWORD}</test_username>
</systemPropertyVariables>
</configuration>
</plugin>
bootstrap-test.yaml
datasource:
jdbc_url: *omitted*
username: ${test_username}
password: ${test_password}
不作業是什么意思?
如果我嘗試通過在配置部分中指定系統屬性來在 Jenkins 環境中運行測驗,則測驗將失敗。順便說一句,我將這些憑據傳遞給 Spring Boot,但 entityManagerFactory (org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder) 無法初始化。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [com/acme/Config.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: Unable to resolve persistence unit root URL
我擔心這個問題可能是由于 Spring Boot 無法訪問混淆的憑據,或者在 Maven 的生命周期中太晚嘗試訪問組態檔中的系統屬性。
我也不完全反對通過命令列傳遞系統屬性,但模板化解決方案需要包含一種有效(安全)的方式來收集不同的憑證型別以傳遞給 Maven 呼叫。
更新 1:
Running this project locally (on a Windows machine, by the way) after exporting the variables does in fact work, but does not work in Jenkins. The method that worked locally involved setting either the environment or system property variables in the Surefire plugin configuration section. I did prefix references to environment variables created by Jenkins with env..
UPDATE 2:
Using the Maven antrun plugin I was able to echo the masked secrets exported by Jenkins.
uj5u.com熱心網友回復:
我試過一個新鮮的詹金斯,它按預期作業。如果插件(java 類)能夠讀取環境變數并且 jenkins 注入環境變數,則一切正常。
我認為您的錯誤是環境變數語法。根據這一點,您應該使用${env.VARIABLE_NAME}在 pom.xml 中使用環境變數。所以在你的情況下,你的 pom.xml 應該是這樣的:
<test_username>${env.TEST_USERNAME}</test_username>
<test_username>${env.TEST_PASSWORD}</test_username>
然后注入所需的變數
withCredentials([
[
$class: 'UsernamePasswordMultiBinding',
credentialsId: 'TEST',
usernameVariable: 'TEST_USERNAME',
passwordVariable: 'TEST_PASSWORD'
]
]) {
sh 'mvn clean install'
}
Java 系統屬性和環境變數
當您-Dmykey = value在任何 java 實作上使用時,您是在設定 System property,而不是 environment variable。檢查這個:
- Java 系統屬性和環境變數
uj5u.com熱心網友回復:
這非常奇怪,但是如何指定 POM 位置似乎有所不同。最初我是提供-f ./pom.xml給 Maven 的,環境變數無法決議。我一時興起提供了f pom.xml(沒有“./”)和成功決議的環境變數。
不幸的是,我不知道為什么這會有所作為,但如果我設法在路上發現更多細節,我會更新我的答案......
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/375373.html
