通过 API 在 Jenkins 中创建用户

问题描述 投票:0回答:6

我想知道是否可以使用 Jenkins 的 API 在 Jenkins 中创建一个新用户。我可以创建工作,但 Jenkins 的 API 文档没有任何与用户创建相关的内容。

实际上,我必须创建一个新用户,然后为该用户创建一个新作业,所有这些都使用 API。

jenkins hudson
6个回答
19
投票

您是对的,没有用于添加用户的显式 CLI 命令。但您可以使用 groovy 脚本(使用 CLI 执行)。

详细信息取决于您的 Jenkins 的配置方式。 例如,如果您的 Jenkins 使用自己的用户数据库,那么您可以通过以下 CLI 调用添加新用户:

echo 'jenkins.model.Jenkins.instance.securityRealm.createAccount("user1", "password123")' |
java -jar jenkins-cli.jar -s http://localhost/ groovy =

此 shell 命令将创建一个具有登录名“user1”和密码“password123”的新用户。 这里 echo 将一行常规代码提供给 Jenkins CLI(请注意,= 意味着 CLI 应该从 STDIN 接收代码)。

groovy 脚本还允许管理用户权限,但是,确切的代码取决于使用的授权策略。您可以使用此示例脚本作为开始。


9
投票

这是安装后创建用户的方法:

echo 'jenkins.model.Jenkins.instance.securityRealm.createAccount("user", "password")' | java -jar jenkins-cli.jar -auth admin:c3a5dcd6bc3f45ee8d6c9f0f5abc14c0 -s http://localhost:8080/ groovy =

其中 c3a5dcd6bc3f45ee8d6c9f0f5abc14c0 是自动生成的密码,存在于日志或文件中(对于 ubuntu):/var/lib/jenkins/secrets/initialAdminPassword


6
投票

echo 和 pipeline 在我的 Windows 上不起作用,所以我最终使用了脚本文件。在脚本文件中添加更多逻辑也更容易。下面的脚本将在添加新用户之前检查现有用户,然后在创建帐户后设置用户的电子邮件并使用基于矩阵的安全性授予读取访问权限。您可以通过将脚本保存到文件(例如 user-creation.groovy)中来运行它,然后运行以下命令,

java -jar jenkins-cli.jar -s http://localhost/ groovy user-creation.groovy testUser testPassword [email protected]

import hudson.model.*
import hudson.security.*
import hudson.tasks.Mailer

def userId = args[0]
def password = args[1]
def email = args[2]
def instance = jenkins.model.Jenkins.instance
def existingUser = instance.securityRealm.allUsers.find {it.id == userId}

if (existingUser == null) {
    def user = instance.securityRealm.createAccount(userId, password)
    user.addProperty(new Mailer.UserProperty(email));

    def strategy = (GlobalMatrixAuthorizationStrategy) instance.getAuthorizationStrategy()
    strategy.add(Hudson.READ, userId)
    instance.setAuthorizationStrategy(strategy)
    instance.save()
} 

4
投票

我设法获得以下 python 代码片段来使用 ssh-key 创建用户:

import json
import requests

def main():
    data = {
        'credentials': {
            'scope': "GLOBAL",
            'username': "jenkins",
            'privateKeySource': {
                'privateKey': "-----BEGIN RSA PRIVATE KEY-----\nX\n-----END RSA PRIVATE KEY-----",
                'stapler-class': "com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey$DirectEntryPrivateKeySource"
            },
            'stapler-class': "com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey"
        }
    }

    payload = {
        'json': json.dumps(data),
        'Submit': "OK",
    }
    r = requests.post("http://%s:%d/credential-store/domain/_/createCredentials" % (HOSTNAME, 8080), data=payload)
    if r.status_code != requests.codes.ok:
        print r.text

它有点像 REST 接口,只不过人们必须知道代码的内部结构以及对象应该解码到的类的名称。

我正在尝试从 ansible 脚本配置 jenkins(在 jenkins 服务器外部运行);由于 java cli 不支持创建凭据,因此 python 代码片段似乎是可行的方法。


1
投票

基于@vitaleek的答案,以下内容将从文件中获取默认的管理员凭据并创建一个新用户:

pass=`sudo cat /var/lib/jenkins/secrets/initialAdminPassword` && echo 'jenkins.model.Jenkins.instance.securityRealm.createAccount("user1", "password123")' | sudo java -jar jenkins-cli.jar -auth admin:$pass -s http://localhost:8080/ groovy =

如果你像我一样,一开始找不到 jenkins-cli.jar,可以按如下方式从 Jenkins 服务器中获取它:

curl -O http://127.0.0.1:8080/jnlpJars/jenkins-cli.jar

0
投票

我在 GitHub 上阅读了 GlobalMatrixAuthorizationStrategy 插件的代码,并尝试查找他们如何将用户添加到 MatrixAuthorizationStrategy 并达到以下解决方案。

参考 GitHub 上的 GlobalMatrixAuthorizationStrategy

import hudson.model.*
import hudson.security.*
import hudson.tasks.Mailer
import org.jenkinsci.plugins.matrixauth.PermissionEntry
import org.jenkinsci.plugins.matrixauth.AuthorizationType

def username = "username"
def password = "password here"
def fullName = "User full name"
def instance = jenkins.model.Jenkins.instance
def user = instance.securityRealm.createAccount(username, password)
user.addProperty(new Mailer.UserProperty(email));
user.setFullName(fullName)
def strategy = instance.getAuthorizationStrategy()
strategy.add(Jenkins.READ, new PermissionEntry(AuthorizationType.USER, username))
//This is the solution     ^^^^
instance.save()
© www.soinside.com 2019 - 2024. All rights reserved.