Есть ли плагин Jenkins, который может выполнять поиск в группе артефакт-версии (GAV) моего репозитория Nexus и отображать результаты? Я хотел бы, чтобы результаты были доступны в параметризованной сборке в качестве выбора (выпадающее меню).Jenkins build параметризован с выбором версий артефакта Nexus (все GAV)
ответ
Я добавил заводной сценарий к Dynamic Choice Parameter (см Jenkins Plugins)
Некоторые препятствия были:
- Наш сервер Nexus выдает базовой аутентификации вызов, так что я не мог просто использовать заводной "http://blah ".toURL(). text
- Я не хотел загружать отсутствующие groovy jars, такие как httpbuilder, поэтому я просто использовал класс Java URLConnection и кодированный пользователь : pass a s заголовок.
- Использовал REST api для Nexus, чтобы получить версии, но должен был различать выпуск и моментальные снимки. Я добавил групповую аутентификацию, чтобы только разработчики имели доступ к моментальным снимкам.
- GAV сортировка не является прямой. Существует лучший способ сортировки GAV (с использованием org.apache.maven.artifact.versioning.ComparableVersion), но я пока не реализовал его, поэтому сейчас просто сортирую, чтобы сначала выстроились меньшие строки.
import hudson.model.* import jenkins.model.* def versions=[ ] def snapshots=[ ] // The artifactName could be passed in from another parameter (eg. Extended Choice Parameter) linked to this 'dynamic choice' parameter. def address = "https://xyzcompany.com/nexus/service/local/lucene/search?r=releases&g=com.xyzcompany&a=artifactName&c=features&p=xml" def urlInfo = address.toURL() // Consider using tokenstring technique instead of basic auth if pro version of Nexus. def authString = "user:pass"; // replace 'user' with username, 'pass' with password. def authStr="Basic " + authString.bytes.encodeBase64().toString() // Using URLConnection instead of HTTPBuilder et al. def connection = urlInfo.openConnection() connection.setRequestProperty("Authorization" , authStr) def xml="${connection.content.text}" def root = new XmlParser().parseText(xml) root.data.artifact.each { if (it.artifactHits.artifactHit.repositoryId.text() == "releases") versions.add("${it.version.text()}"); else snapshots.add("${it.version.text()}"); } // There is a better way to GAV sort (using org.apache.maven.artifact.versioning.ComparableVersion) but I have not implemented it yet so for now, I'm simply sorting so the smaller strings line up first. versions.sort { -it.size() } Collections.reverse(versions) // Only certain users should be able to see the SNAPSHOT versions def userid = User.current().id def auths = Jenkins.instance.securityRealm.loadUserByUsername(userid).authorities.collect{a -> a.authority} if (["OffShoreDevGroup", "DevGroup"].intersect(auths)) { snapshots.sort { -it.size() } Collections.reverse(snapshots) versions+=snapshots } versions.add(" "); // My build uses a blank version string to simply report what is already deployed to the container. return versions;
Нет необходимости для пользовательских скриптов на Ruby. Существует в настоящее время специальный плагин, который делает то, что вам требуется: Maven Metadata Plugin for Jenkins CI server
Просто пометьте «параметризованного Build» и «Добавить параметр» типа «Список Maven артефакта версии»:
- Имя
MY_SNAPSHOT_JAR
- Repository Базовый URL (это один сложно)
http://localhost/nexus/service/local/repositories/snapshots/content
Затем добавьте команду оболочки для Wget/УПП/и т.д., вы можете использовать следующие переменные решенные штекером in:
wget "$MY_SNAPSHOT_JAR_ARTIFACT_URL"
echo "$MY_SNAPSHOT_JAR_VERSION" - the version you selected in the dropdown or that was selected as part of an automated build
echo "$MY_SNAPSHOT_JAR_ARTIFACT_URL" - the full URL to the actual artifact selected. You can use something like "wget" to download that artifact and do something with it.
echo "$MY_SNAPSHOT_JAR_GROUP_ID" - echoes back your configuration
echo "$MY_SNAPSHOT_JAR_ARTIFACT_ID" - echoes back your configuration
echo "$MY_SNAPSHOT_JAR_CLASSIFIER" - echoes back your configuration
echo "$MY_SNAPSHOT_JAR_PACKAGING" - echoes back your configuration
К сожалению, вы не можете спросить о снимке и отпустить его в том же выпадающем списке. Возможным обходным путем является добавление другого параметра для MY_RELEASE_JAR (таким образом, другой раскрывающийся список, несколько запутанный для пользователя). Другим обходным решением является отдельная работа по развертыванию релиза.