【问题标题】:Creating user in Jenkins via API通过 API 在 Jenkins 中创建用户
【发布时间】:2013-07-16 23:27:22
【问题描述】:

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

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

【问题讨论】:

    标签: api jenkins hudson


    【解决方案1】:

    您是对的,没有用于添加用户的明确 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 将一行 groovy 代码提供给 Jenkins CLI(请注意,= 表示 CLI 应该从 STDIN 接收代码)。

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

    【讨论】:

    • 确保您使用的是 Jenkins 自己的用户数据库 作为身份验证方法(安全领域),否则将无法正常工作。跨度>
    【解决方案2】:

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

    java -jar jenkins-cli.jar -s http://localhost/ groovy user-creation.groovy testUser testPassword testEmail@testEmail.com
    

    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()
    } 
    

    【讨论】:

    • 如果我运行命令java -jar jenkins-cli.jar -s http://localhost:8080/ groovy user-creation.groovy userName userPassword testEmail@testEmail.com,我得到一个错误ERROR: anonymous is missing the Overall/Read permission
    • 这对我有用。 java -jar jenkins-cli.jar -s localhost groovy user-creation.groovy testUser testPassword testEmail@gmail.com --username= --password=
    【解决方案3】:

    基于@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
    

    【讨论】:

      【解决方案4】:

      这是安装后如何创建用户:

      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

      【讨论】:

      • 这是一个非常简洁直接的方法。您是否碰巧知道如何使用它来启用安全性(领域和授权)?例如jenkins 自己的数据库,“登录的用户可以做任何事”
      【解决方案5】:

      我设法得到以下 python sn-p 来使用 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 sn-p 似乎是要走的路。

      【讨论】:

      • 嗨佩德罗,有没有办法使用 python 创建用户?您上面的代码将创建凭据,我正在寻找用户。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多