如何使用Groovy脚本更新Jenkins中特定文件夹的凭据?

如何使用Groovy脚本更新Jenkins中特定文件夹的凭据?,jenkins,jenkins-groovy,Jenkins,Jenkins Groovy,我想更新现有文件夹的凭据对象。如何使用groovy实现这一点? 以下是我到目前为止的情况: import com.cloudbees.plugins.credentials.CredentialsProvider; import com.cloudbees.plugins.credentials.common.StandardUsernamePasswordCredentials; import com.cloudbees.hudson.plugins.folder.Folder import

我想更新现有文件夹的凭据对象。如何使用groovy实现这一点?
以下是我到目前为止的情况:

import com.cloudbees.plugins.credentials.CredentialsProvider;
import com.cloudbees.plugins.credentials.common.StandardUsernamePasswordCredentials;
import com.cloudbees.hudson.plugins.folder.Folder
import com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl

// Init
String user_name = "my_user_name"
String user_pass = "my_new_pass"
String folderName = "Projects"
Folder targetFolder = null

// Get folder:
def allJenkinsItems = Jenkins.getInstance().getItems();
for (currentJenkinsItem in allJenkinsItems)
{
    if(!(currentJenkinsItem instanceof Folder)) {continue}

    if(((Folder)currentJenkinsItem).getFullName().equals(folderName))
    {
        targetFolder = (Folder)currentJenkinsItem;
    }
}
if (targetFolder == null) {println "Failed to find folder: folderName"; return}

// Get target credentials of that folder:
def credsList = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials(
    com.cloudbees.plugins.credentials.common.StandardUsernameCredentials.class,
    targetFolder,
    null,
    null
);

// Get target creds out of the list - will get the first one it encounters:
def targetCreds = credsList.findResult { it.username == user_name ? it : null }
if (targetCreds == null) {println "Failed to find username: $user_name under credentials of folder: $folderName"; return}

// Gets store - how to get the folder's store??
def credentials_store = Jenkins.instance.getExtensionList(
    'com.cloudbees.plugins.credentials.SystemCredentialsProvider'
)[0].getStore()

// Try to update the creds of the folder. 
//   **updateResult is always 'false' here**
def updateResult = credentials_store.updateCredentials(
    com.cloudbees.plugins.credentials.domains.Domain.global(), 
    targetCreds, 
    new UsernamePasswordCredentialsImpl(targetCreds.scope, targetCreds.id, targetCreds.description, targetCreds.username, user_pass)
)

if (updateResult) {
    println "Success changing password for ${user_name}" 
} else {
    println "Failed changing password for ${user_name}"
}
但是当我尝试更新时,我得到一个updateResult==false。
找到凭据后如何更新凭据?

我自己找到的:

/*
* Configures single (username & password) credentials for a folder in global domain
*  if already exists a credentials with defined username - it will update it
*  if more than one exists - the first one it encounters will be updated
*/

import java.util.logging.Logger
import jenkins.model.*
import com.cloudbees.hudson.plugins.folder.*;
import com.cloudbees.hudson.plugins.folder.properties.*;
import com.cloudbees.hudson.plugins.folder.properties.FolderCredentialsProvider.FolderCredentialsProperty;
import com.cloudbees.plugins.credentials.impl.*;
import com.cloudbees.plugins.credentials.*;
import com.cloudbees.plugins.credentials.domains.*;

// Init
def logger = Logger.getLogger("")
jenkins = Jenkins.instance

String user_name = "my_user_name"
String user_pass = "my_new_pass"
String description = "my desc"
String folderName = "Projects"


String id = java.util.UUID.randomUUID().toString()
Credentials c = new UsernamePasswordCredentialsImpl(CredentialsScope.GLOBAL, id, "description: "+id, user_name, user_pass)

logger.info("Configuring domain credentials for folder: $folderName")
for (folder in jenkins.getAllItems(Folder.class)) {
    if(folder.name.equals(folderName)) {
        AbstractFolder<?> folderAbs = AbstractFolder.class.cast(folder)
        FolderCredentialsProperty property = folderAbs.getProperties().get(FolderCredentialsProperty.class)

        // If not defined FolderCredentialsProperty yet - define and finish
        if(property == null) {
            logger.info("Initializing folder credentials store and add credentials in global store")
            property = new FolderCredentialsProperty([c])
            folderAbs.addProperty(property)
            jenkins.save()
            return
        }

        // Check for existing credentials - and update their password & description
        //   will update the first credentials it encounters
        def credentials_store = property.getStore()
        List<com.cloudbees.plugins.credentials.Credentials> folderCredentialsList = property.getCredentials()
        for (creds in folderCredentialsList) {
            logger.info("Checking existing credentials of folder: $folderName for user: $user_name")
            if (creds.username.equals(user_name)) {
                // Found username - updating it
                //  Try to update the creds of the folder:
                def updateResult = credentials_store.updateCredentials(
                        com.cloudbees.plugins.credentials.domains.Domain.global(),
                        creds,
                        new UsernamePasswordCredentialsImpl(creds.scope, creds.id, description, creds.username, user_pass)
                )
                if (updateResult) {
                    println "Update successful"
                } else {
                    println "Update failed"
                }
                jenkins.save()
                return
            }

        }

        logger.info("Didn't find credntials with username: $user_name - adding new one")

        // If got here - then:
        //  1. There is already a FolderCredentials property defined for folder: folderName
        //  2. didn't find any credentials(of username & password type) with username == user_name
        // so just add the new credentials
        property.getStore().addCredentials(Domain.global(), c)
        jenkins.save()
        return
    }
}
/*
*为全局域中的文件夹配置单个(用户名和密码)凭据
*如果已存在具有定义用户名的凭据-它将更新该凭据
*如果存在多个-将更新它遇到的第一个
*/
导入java.util.logging.Logger
导入jenkins.model*
导入com.cloudbees.hudson.plugins.folder.*;
导入com.cloudbees.hudson.plugins.folder.properties.*;
导入com.cloudbees.hudson.plugins.folder.properties.FolderCredentialsProvider.FolderCredentialsProperty;
导入com.cloudbees.plugins.credentials.impl.*;
导入com.cloudbees.plugins.credentials.*;
导入com.cloudbees.plugins.credentials.domains.*;
//初始化
def logger=logger.getLogger(“”)
jenkins=jenkins.instance
字符串user\u name=“我的用户名”
字符串user\u pass=“my\u new\u pass”
String description=“我的描述”
String folderName=“项目”
String id=java.util.UUID.randomUUID().toString()
凭证c=新用户名密码CredentialsImpl(CredentialsScope.GLOBAL,id,“description:”+id,user\u name,user\u pass)
logger.info(“为文件夹配置域凭据:$folderName”)
for(jenkins.getAllItems(folder.class)中的文件夹){
if(folder.name.equals(folderName)){
AbstractFolder FolderLabs=AbstractFolder.class.cast(文件夹)
FolderCredentialsProperty=FolderLabs.getProperties().get(FolderCredentialsProperty.class)
//如果尚未定义FolderCredentialsProperty-定义并完成
if(属性==null){
logger.info(“初始化文件夹凭据存储并在全局存储中添加凭据”)
属性=新的FolderCredentialsProperty([c])
FolderLabs.addProperty(属性)
詹金斯
返回
}
//检查现有凭据-并更新其密码和说明
//将更新遇到的第一个凭据
def credentials_store=property.getStore()
List folderCredentialsList=property.getCredentials()
用于(文件夹凭证列表中的凭证){
info(“检查文件夹的现有凭据:$folderName for user:$user_name”)
if(creds.username.equals(用户名)){
//找到用户名-正在更新它
//尝试更新文件夹的凭据:
def updateResult=credentials\u store.updateCredentials(
com.cloudbees.plugins.credentials.domains.Domain.global(),
信条,
新用户名密码CredentialSimpl(creds.scope、creds.id、description、creds.username、user\u pass)
)
如果(更新结果){
println“更新成功”
}否则{
println“更新失败”
}
詹金斯
返回
}
}
info(“未找到用户名为:$user\u name的凭据-添加新凭据”)
//如果你到了这里,那么:
//1.已经为文件夹定义了FolderCredentials属性:folderName
//2.未找到用户名==用户名的任何凭据(用户名和密码类型)
//所以只需添加新的凭据
property.getStore().addCredentials(Domain.global(),c)
詹金斯
返回
}
}
我自己找到的:

/*
* Configures single (username & password) credentials for a folder in global domain
*  if already exists a credentials with defined username - it will update it
*  if more than one exists - the first one it encounters will be updated
*/

import java.util.logging.Logger
import jenkins.model.*
import com.cloudbees.hudson.plugins.folder.*;
import com.cloudbees.hudson.plugins.folder.properties.*;
import com.cloudbees.hudson.plugins.folder.properties.FolderCredentialsProvider.FolderCredentialsProperty;
import com.cloudbees.plugins.credentials.impl.*;
import com.cloudbees.plugins.credentials.*;
import com.cloudbees.plugins.credentials.domains.*;

// Init
def logger = Logger.getLogger("")
jenkins = Jenkins.instance

String user_name = "my_user_name"
String user_pass = "my_new_pass"
String description = "my desc"
String folderName = "Projects"


String id = java.util.UUID.randomUUID().toString()
Credentials c = new UsernamePasswordCredentialsImpl(CredentialsScope.GLOBAL, id, "description: "+id, user_name, user_pass)

logger.info("Configuring domain credentials for folder: $folderName")
for (folder in jenkins.getAllItems(Folder.class)) {
    if(folder.name.equals(folderName)) {
        AbstractFolder<?> folderAbs = AbstractFolder.class.cast(folder)
        FolderCredentialsProperty property = folderAbs.getProperties().get(FolderCredentialsProperty.class)

        // If not defined FolderCredentialsProperty yet - define and finish
        if(property == null) {
            logger.info("Initializing folder credentials store and add credentials in global store")
            property = new FolderCredentialsProperty([c])
            folderAbs.addProperty(property)
            jenkins.save()
            return
        }

        // Check for existing credentials - and update their password & description
        //   will update the first credentials it encounters
        def credentials_store = property.getStore()
        List<com.cloudbees.plugins.credentials.Credentials> folderCredentialsList = property.getCredentials()
        for (creds in folderCredentialsList) {
            logger.info("Checking existing credentials of folder: $folderName for user: $user_name")
            if (creds.username.equals(user_name)) {
                // Found username - updating it
                //  Try to update the creds of the folder:
                def updateResult = credentials_store.updateCredentials(
                        com.cloudbees.plugins.credentials.domains.Domain.global(),
                        creds,
                        new UsernamePasswordCredentialsImpl(creds.scope, creds.id, description, creds.username, user_pass)
                )
                if (updateResult) {
                    println "Update successful"
                } else {
                    println "Update failed"
                }
                jenkins.save()
                return
            }

        }

        logger.info("Didn't find credntials with username: $user_name - adding new one")

        // If got here - then:
        //  1. There is already a FolderCredentials property defined for folder: folderName
        //  2. didn't find any credentials(of username & password type) with username == user_name
        // so just add the new credentials
        property.getStore().addCredentials(Domain.global(), c)
        jenkins.save()
        return
    }
}
/*
*为全局域中的文件夹配置单个(用户名和密码)凭据
*如果已存在具有定义用户名的凭据-它将更新该凭据
*如果存在多个-将更新它遇到的第一个
*/
导入java.util.logging.Logger
导入jenkins.model*
导入com.cloudbees.hudson.plugins.folder.*;
导入com.cloudbees.hudson.plugins.folder.properties.*;
导入com.cloudbees.hudson.plugins.folder.properties.FolderCredentialsProvider.FolderCredentialsProperty;
导入com.cloudbees.plugins.credentials.impl.*;
导入com.cloudbees.plugins.credentials.*;
导入com.cloudbees.plugins.credentials.domains.*;
//初始化
def logger=logger.getLogger(“”)
jenkins=jenkins.instance
字符串user\u name=“我的用户名”
字符串user\u pass=“my\u new\u pass”
String description=“我的描述”
String folderName=“项目”
String id=java.util.UUID.randomUUID().toString()
凭证c=新用户名密码CredentialsImpl(CredentialsScope.GLOBAL,id,“description:”+id,user\u name,user\u pass)
logger.info(“为文件夹配置域凭据:$folderName”)
for(jenkins.getAllItems(folder.class)中的文件夹){
if(folder.name.equals(folderName)){
AbstractFolder FolderLabs=AbstractFolder.class.cast(文件夹)
FolderCredentialsProperty=FolderLabs.getProperties().get(FolderCredentialsProperty.class)
//如果尚未定义FolderCredentialsProperty-定义并完成
if(属性==null){
logger.info(“初始化文件夹凭据存储并在全局存储中添加凭据”)
属性=新的FolderCredentialsProperty([c])
FolderLabs.addProperty(属性)
詹金斯
返回
}
//检查现有凭据-并更新其密码和说明
//将更新遇到的第一个凭据
def credentials_store=property.getStore()
List folderCredentialsList=property.getCredentials()
用于(文件夹凭证列表中的凭证){
info(“检查文件夹的现有凭据:$folderName for user:$user_name”)
if(creds.username.equals(用户名)){
//找到用户名-正在更新它
//