webentwicklung-frage-antwort-db.com.de

Benutzer in Jenkins über API erstellen

Ich habe mich gefragt, ob ich mithilfe der API einen neuen Benutzer in Jenkins erstellen kann. Ich kann Jobs erstellen, aber die API-Dokumente für Jenkins haben nichts mit der Benutzererstellung zu tun.

Eigentlich muss ich einen neuen Benutzer erstellen, gefolgt von der Erstellung eines neuen Jobs für diesen Benutzer, und das alles mithilfe einer API.

14
shubham

Sie haben Recht, es gibt keinen expliziten CLI-Befehl zum Hinzufügen eines Benutzers. Sie können hierfür jedoch ein starkes Skript verwenden (mithilfe der CLI zur Ausführung).

Die Details hängen davon ab, wie Ihre Jenkins konfiguriert sind. Wenn Ihr Jenkins beispielsweise eine eigene Benutzerdatenbank verwendet, können Sie mit dem folgenden CLI-Aufruf einen neuen Benutzer hinzufügen:

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

Dieser Shell-Befehl erstellt einen neuen Benutzer mit Login "user1" und Passwort "password123". Hier fügt echo einer Jenkins-CLI eine Zeile Groovy-Code hinzu (beachten Sie, dass = bedeutet, dass die CLI Code von STDIN erhalten soll).

Groovy Script ermöglicht auch das Verwalten von Benutzerberechtigungen. Der genaue Code hängt jedoch von der verwendeten Autorisierungsstrategie ab. Sie könnten dieses Beispielskript als Start verwenden.

10
izzekil

So legen Sie nach der Installation einen Benutzer an:

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

Dabei wird automatisch das Kennwort c3a5dcd6bc3f45ee8d6c9f0f5abc14c0 generiert, das im Protokoll oder in der Datei (für Ubuntu) vorhanden ist:/var/lib/jenkins/secrets/initialAdminPassword

5
vitaleek

echo und Pipe funktionierten unter Windows nicht, sodass ich stattdessen eine Skriptdatei verwendete. Es ist auch einfacher, der Skriptdatei mehr Logik hinzuzufügen. Das folgende Skript überprüft den vorhandenen Benutzer, bevor ein neuer Benutzer hinzugefügt wird, und legt dann die E-Mail-Adresse des Benutzers nach der Kontoerstellung fest und gewährt READ-Zugriff mithilfe der matrixbasierten Sicherheit. Sie können es ausführen, indem Sie das Skript in einer Datei speichern, z. B. user-creation.groovy, und dann Folgendes ausführen:

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
barryku

Ich habe es geschafft, das folgende Python-Snippet zum Erstellen eines Benutzers mit ssh-key zu erhalten:

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

Es ist wie eine REST Schnittstelle, nur dass man die Interna des Codes und die Namen der Klassen kennen muss, in die die Objekte dekodieren sollen.

Ich versuche, Jenkins über ein nicht lesbares Skript zu konfigurieren (das extern auf dem Jenkins-Server ausgeführt wird). Da das Erstellen der Anmeldeinformationen von Java CLI nicht unterstützt wird, scheint das Python-Snippet der richtige Weg zu sein.

3
Pedro Marques

Aufbauend auf der Antwort von @ vitaleek werden im Folgenden die Standardanmeldeinformationen des Administrators aus der Datei abgerufen und ein neuer Benutzer erstellt:

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 =

Wenn Sie wie ich sind und die jenkins-cli.jar zunächst nicht finden konnten, können Sie diese wie folgt von Ihrem Jenkins-Server abrufen:

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