Jenkins Credentials Manager + Aktif Seçimler
İşlem hattı komut dosyasından önce Git ile kimlik doğrulaması yapmak için - Active Choices parametresini doldurmak için Jenkins Kimlik Bilgilerine erişmek istiyorum .
Boru hattında bunu basitçe yapıyorum withCredentials. Ancak boru hattı öncesi aşama sırasında (yani Aktif Seçimler parametresi) gibi Hudson uzantılarına withCredentialsveya sshAgenterişilemez. Şu anda git ls-remote -h [email protected]:repo.gitjenkins_home dizininde şifrelenmemiş anahtarla harika çalıştırıyorum (bu iyi bir fikir değil).
Jenkin'in ve eklentilerinin kaynak kodunu okuyarak Java nesnelerini içe aktarmanın ve inşa etmenin bazı olasılıkları olduğunu biliyorum - ama bu sonsuz görünüyor.
Öyleyse: Hudson uzantılarını mevcut Groovy betiğine bir şekilde kolayca içe aktarmak ve uygulamak mümkün mü veya herhangi birinin bunun için hazır bir çözümü var mı (görünüşe göre kimse böyle bir durum hakkında bir şey yayınlamadı)?
Yanıtlar
Bunun zaten farkında olduğunuzu düşünüyorum, ancak bunu yapmanın birkaç kolay yolu ve bunu yapmanın birkaç zor yolu var.
Kolay yollar:
- Deponuzu SSH anahtarları veya kimlik doğrulama bilgileri olmadan ödeme için kullanılabilir hale getirin.
- Jenkins ana düğümünüzdeki Jenkins kullanıcısına repo kontrolü için manuel olarak bir SSH anahtar çifti ekleyin (Active Choice Groovy komut dosyaları ana düğümde çalıştığından) (yani Kimlik Bilgileri deposunu kullanmayın).
Zor yollar:
- Kimlik bilgileri deposundan kimlik bilgilerini çıkarmak için Active Choices kodunuzdaki Jenkins Java API'sini kullanın. API belgeleri , kimlik bilgileri deposu ve ssh kimlik bilgileri türü için kullanılabilir . Bu eklentilerde bulunan Java sınıflarının nasıl kullanılacağına dair herhangi bir belge bulunmadığından, bunu kendiniz bulmak size kalmıştır.
- Orijinal Jenkins işindeki parametreleri güncellemek için ikincil bir "meta" iş oluşturun (Active Choices betikleri dahil) - Bunu biraz aşağıda anlatıyorum.
Güvenlik nedeniyle kolay çözümlerden hiçbirini yapamazsanız, Active Choice parametrelerini bir git deposunun içeriğine göre güncellemenin kolay ve doğrudan bir yolu yoktur. Bunun nedeni ise:
- Söylediğiniz gibi, "ön işlem aşamasında (yani Active Choices parametresi) withCredentials veya sshAgent gibi Hudson uzantılarına erişilemez."
- Aktif Seçim parametreleri de dahil olmak üzere parametrelerin konfigürasyonu , o Ardışık Düzen'in mevcut çalışmasından değil önceki çalışmasından alınır . Yani, parametrelerinizi Pipeline kodunuzdan güncellemek için, yapmak istediğiniz şeyin amacını ortadan kaldıran Pipeline'ınızı çalıştırmanız gerekir.
1. için Bildirici yerine Komut Dosyalı Ardışık Düzenleri kullanmak olan bir çözüm var, ancak bu 2'nin sorunlarının üstesinden gelmeyecek.
Bu sorunla karşılaştığımda bulduğum çözüm, Active Choices komut dosyaları da dahil olmak üzere orijinal işin parametrelerini güncelleyen ikinci bir Jenkins işi (ben buna "meta" işi diyorum) oluşturmaktır. Bu ikinci meta işi, Active Choices parametrelerimdeki seçenekleri doldurmak için kullandığım depodaki bir git kancası tarafından tetikleniyor. Bunun avantajı, parametrelerini güncellemek için orijinal işin Ardışık Düzeni'ni çalıştırmanıza gerek kalmaması, 2. adımdaki sorunları çözme avantajına sahiptir. Ayrıca, hala bir Ardışık Düzen işi olduğundan, normal Ardışık Düzen adımlarını kullanabilirsiniz, böylece kimlik bilgileri deposu.
İşim (kabaca) şöyle görünüyor - Buraya sığdırmak için çok basitleştirdim, bu yüzden istediğiniz şekilde çalışmasını sağlamak için bir sürü ince ayar yapmanız gerekecek. Muhtemelen bunda bir sürü hata ve hata var çünkü bunu yapmak için mevcut bir komut dosyasını parçaladım. Dikkat edilmesi gereken birkaç nokta:
- Bu, Jenkins API'lerinin yoğun bir şekilde kullanılmasına neden olur, bu nedenle bunu çalıştırmak için komut dosyası sanal alanını devre dışı bırakmanız veya Jenkins güvenlik yöneticisinde bir ton işlevi beyaz listeye eklemeniz gerekir.
- Bu, bir Pipeline dosyasından çok normal bir Groovy betiğine benzemesine rağmen, teknik olarak hala bir Komut Dosyalı Ardışık Düzeni'dir.
- Bu bir Ardışık Düzen olduğundan
withCredentials, kimlik bilgileri deposunu kullanarak depoları teslim almak gibi adımları kullanabilirsiniz .
import groovy.json.JsonOutput
import org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript
import org.biouno.unochoice.*
import org.biouno.unochoice.model.*
def metadataUrl = 'ssh://git@**************/metadata.git'
def metadataBranch = 'master'
def metadata = [:]
node('master') {
git(
url: metadataUrl,
branch: metadataBranch,
credentialsId: 'jenkins',
changelog: false,
)
def dataDir = "${pwd()}/myJsonFiles" // can't use File.eachFileMatch() due to: // https://wiki.jenkins.io/display/JENKINS/Pipeline+CPS+method+mismatches def files = new File(dataDir).list().findAll() { f-> FilenameUtils.getExtension(f) == 'json' } files.each() { f-> // TODO: nice error messages if files are misformatted def name = FilenameUtils.removeExtension(f) def data = readJson(file: "${dataDir}/${f}") metadata[name] = data } } // ChoiceParameterDefinition is the class name for the built-in static choice parameter. // CascadeChoiceParameter is the class name for the Active Choices dynamic choice parameter. // begin first parameter def fileParam = new ChoiceParameterDefinition( 'file', 'The JSON file to use', ) fileParam.setChoices(metadata.keySet()) // end first parameter // begin second parameter def metadataJson = JsonOutput.toJson(metadata) def scriptText = """ import groovy.json.JsonSlurper def slurper = new JsonSlurper() def metadata = slurper.parseText('${metadataJson}')
return metadata[file]['versions']
"""
def mainScript = new SecureGroovyScript(scriptText, true)
def fallbackScript = new SecureGroovyScript('return ["Error encountered - see logs"]', true)
def activeChoiceScript = new GroovyScript(mainScript, fallbackScript)
def versionParam = new CascadeChoiceParameter(
'version',
'The version to use',
activeChoiceScript,
'PT_SINGLE_SELECT',
'file',
false,
)
// end second parameter
def paramProp = new ParametersDefinitionProperty(fileParam, versionParam)
// this is the full name of the actual job which needs dynamic parameters
def job = Jenkins.instance.getItemByFullName('UNIX/deploy_to_environment/master')
// There is no "setProperty" - we need to remove and replace.
// removeProperty is safe to run even if no matching properties are set on the job.
// However, this method only removes one property per method call.
// Theoretically, this means the job could accumulate multiple conflicting
// ParametersDefinitionProperty properties.
// TODO: run removeProperty in a while loop to eliminate all matching properties for extra safety.
job.removeProperty(ParametersDefinitionProperty)
job.addProperty(paramProp)