Для параметризованной сборки с выбором тега образа, понадобится плагин Active Choices
Переходим в настройки Jenkins'а
Раздел "Управление плагинами"
Переходим к вкладке "Доступные" и в поиске указываем "Active Choices"
Устанавливаем его. Так же необходим плагин Amazon Web Services SDK
Создаем "New Item" — "Pipeline", указываем, что это будет параметризованной сборка, и добавляем параметр "Active Choices Reactive Parameter"
Указываем, что это "Groovy Script" и вставляем туда следующее:
import jenkins.model.* import groovy.json.JsonSlurper credentialsId = 'harbor_credentials' harborRepo = 'https://harbor.artem.services/api/repositories/artem/site' def creds = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials( com.cloudbees.plugins.credentials.common.StandardUsernameCredentials.class, Jenkins.instance, null, null ).find{ it.id == credentialsId} def addr = "${harborRepo}/tags" def authString = "${creds.username}:${creds.password}".getBytes().encodeBase64().toString() def conn = addr.toURL().openConnection() conn.setRequestProperty( "Authorization", "Basic ${authString}" ) def response_json = "${conn.content.text}" def slurper = new JsonSlurper() def parsed = slurper.parseText(response_json) def tags=[] for (tag in parsed){ tags.add(tag.name); } return tags
Где значение переменных, "credentialsId" — Jenkins Credentials ID с логином и паролем к Harbor'у;
"harborRepo" — полный путь к нужному репозиторию;
Тоже самое, но уже через Pipeline
Pipeline:
properties([ parameters([ [$class: 'CascadeChoiceParameter', choiceType: 'PT_SINGLE_SELECT', description: 'Select Image', filterLength: 1, filterable: false, name: 'ImageTag', script: [ $class: 'GroovyScript', script: [ classpath: [], sandbox: false, script: ''' import jenkins.model.* import groovy.json.JsonSlurper credentialsId = 'harbor_credentials' harborRepo = 'https://harbor.artem.services/api/repositories/artem/site' def creds = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials( com.cloudbees.plugins.credentials.common.StandardUsernameCredentials.class, Jenkins.instance, null, null ).find{ it.id == credentialsId} def addr = "${harborRepo}/tags" def authString = "${creds.username}:${creds.password}".getBytes().encodeBase64().toString() def conn = addr.toURL().openConnection() conn.setRequestProperty( "Authorization", "Basic ${authString}" ) def response_json = "${conn.content.text}" def slurper = new JsonSlurper() def parsed = slurper.parseText(response_json) def tags=[] for (tag in parsed){ tags.add(tag.name); } return tags ''' ] ] ] ]) ])