2017-09-25 3 views
0

Ich fange an, Jenkins Declarative Pipeline zu betrachten und meine Builds in einem Docker-Container auszuführen. Ich habe ein Projekt, das npm-Pakete über Git einliest und daher ssh-Schlüssel haben muss.Deklarative Jenkins-Pipeline und Docker

Von dem, was ich begegnet bin ich args bauen wie --build-arg ssh_pub_key="$(cat ~/.ssh/id_rsa.pub)" und dann in meinem Dockerfile einstellen

ARG ssh_pub_key 

ich die folgende Vorgehensweise: In meinem Jenkinsfile genommen haben

pipeline { 
    agent { 
    dockerfile { 
     args '''--build-arg ssh_prv_key="$(cat /var/lib/jenkins-git/.ssh/id_rsa)"''' 
    } 
    } 

    stages { 
    stage('Test') { 
     steps { 
     sh 'echo $ssh_prv_key' 
     } 
    } 
    } 
} 

Wenn die Build-Lauf In Jenkins bekomme ich die folgende Ausgabe, wenn ich das Bild erstelle (Keine Erwähnung von --build-arg.)

docker build -t 085eb412f6dd28c1a7843aa9f9ed84e7c4af3e1b -f Dockerfile . 

und nichts für die Variable

Bilde ich sie nicht richtig? Handelt jemand mit dem Kopieren von Schlüsseln anders?

Dank

UPDATE

MY Jenkinsfile sieht nun unten wie aber läuft nicht, wie ich außerhalb der Pipeline deklarative alle Skripte nicht ausgeführt werden kann erhalten

Required context class hudson.FilePath is missing 
Perhaps you forgot to surround the code with a step that provides this, such as: node 

scheint?

def ssh_prv_key = sh script: 'cat /var/lib/jenkins-git/.ssh/id_rsa', returnStdout: true 
def ssh_pub_key = sh script: 'cat /var/lib/jenkins-git/.ssh/id_rsa.pub', returnStdout: true 

pipeline { 
    agent { 
    dockerfile { 
     args """--build-arg ssh_prv_key=\"${ssh_prv_key}\" --build-arg ssh_pub_key=\"${ssh_pub_key}\" """ 
    } 
    } 
    stages { 
     stage('Test') { 
     steps { 
      sh 'echo $ssh_prv_key' 
     } 
     } 
    } 
} 
+0

Sie müssen auch ssh_pub_key = $ ssh_pub_key' 'ENV hinzufügen, so dass die SSH-Schlüssel ist ein Teil der Umgebungsvariablen des Bildes gemacht. Gerade jetzt übergeben Sie die Build-Argumente, aber nicht als solche –

Antwort

1

Hier $(cat /var/lib/jenkins-git/.ssh/id_rsa) ist ein Shell-Befehl.

AFAIK, Bindungen müssen außerhalb der Pipelinezeile deklariert sein, um sie beim Definieren von Agenten zu verwenden.

Also machen Sie den Pipeline-Job parametrisiert.

  • ssh_prv_key als Credentials Parameter hinzufügen.
  • Wählen Secretfile
  • Set Standardwert zum Upload secretfile
  • Wiederholen Sie die Schritte für ssh_pub_key

Parameterized Pipeline

Dann ssh_prv_key in dockerfileadditionalBuildArgs Direktive verwenden.

pipeline { 
    agent { 
    dockerfile { 
     additionalBuildArgs ""--build-arg ssh_prv_key=\"$ssh_prv_key\" --build-arg ssh_pub_key=\"$ssh_pub_key\"" 
    } 
    } 
    stages { 
     stage('Test') { 
     steps { 
      sh "echo $ssh_prv_key" 
     } 
     } 
    } 
} 
+0

Danke für die Hilfe, wo würde ich das platzieren? außerhalb des Pipeline Blocks oder in ihm? – Richlewis

+0

Normalerweise setze ich meine Variablendefinitionen am Anfang außerhalb des Pipeline-Blocks. –

+0

Ich habe meine Frage aktualisiert, wäre interessiert zu wissen, wie Sie das zu laufen bekommen? danke – Richlewis

Verwandte Themen