Ich versuche Folgendes zu tun
- Code auschecken
- Führen Sie einige Vorprüfungen mit anderen Docker-Images durch (Sie möchten diese nicht auf dem Jenkins-Knoten installieren).
- Erstellen Sie ein JAR mit einem Docker-Image
maven:3.6-jdk-8
- Führen Sie es dann aus
Dockerfile
, um das App-Image zu erstellen - Übertragen Sie das Image in das Repository
Nun möchte ich außer Docker nichts auf dem Jenkins-Knoten installieren. Um dies zu erreichen, möchte ich die gesamte Pipeline im Docker-Container ausführen. Was mir schwerfällt, ist, wie ich den 4. Schritt innerhalb des Containers erstellen kann.
Ich habe die Jenkins-Datei wie folgt geschrieben
pipeline {
agent none
stages {
stage('Maven build') {
agent {
docker {
image 'maven:3.6-jdk-8'
args '-u root:root'
}
}
steps {
checkout(
[
$class: 'GitSCM',
branches: [
[name: '*/master']
],
doGenerateSubmoduleConfigurations: false,
extensions: [],
submoduleCfg: [],
userRemoteConfigs: [
[
credentialsId: '<cred-id>',
url: '<github-url>']
]
])
sh '''
set -eux pipefail
mvn -e clean install
'''
}
}
stage('Build docker image') {
// Which docker image to use?
}
}
}
Aber ich bin mir nicht sicher, wie man ein Docker-Image innerhalb eines Containers erstellt. Die Suche hat nicht viel geholfen. Ich habe versucht, den Jenkins-Knoten zum Erstellen des Docker-Images zu verwenden, aber anscheinend kann ich nichts kombinieren. Ich verstehe vollkommen, dass dies eine ziemlich offene Frage ist, aber ich denke, es wäre hilfreich, die direkte(n) Antwort(en) zu kennen.
Antwort1
Ich würde so etwas versuchen:
pipeline {
/*
* Run everything on an existing agent configured with a label 'docker'.
* This agent will need docker, git and a jdk installed at a minimum.
*/
agent {
node {
label 'docker'
}
}
// using the Timestamper plugin we can add timestamps to the console log
options {
timestamps()
}
environment {
//Use Pipeline Utility Steps plugin to read information from pom.xml into env variables
IMAGE = readMavenPom().getArtifactId()
VERSION = readMavenPom().getVersion()
}
stages {
stage('Clone repository') {
/*
* Let's make sure we have the repository cloned to our workspace
*/
checkout(
[
$class: 'GitSCM',
branches: [
[name: '*/master']
],
doGenerateSubmoduleConfigurations: false,
extensions: [],
submoduleCfg: [],
userRemoteConfigs: [
[
credentialsId: '<cred-id>',
url: '<github-url>']
]
])
}
stage('Maven build') {
agent {
docker {
/*
* Reuse the workspace on the agent defined at top-level of
* Pipeline but run inside a container.
*/
image 'maven:3.6-jdk-8'
reuseNode true
}
}
steps {
sh '''
set -eux pipefail
mvn -e clean install
'''
}
post {
success {
/*
* Only worry about archiving the jar file
* if the build steps are successful (this part may be not necessary)
*/
archiveArtifacts(artifacts: '**/target/*.jar', allowEmptyArchive: true)
}
}
}
stage('Build docker image') {
steps {
sh '''
docker build -t ${IMAGE} .
docker tag ${IMAGE} ${IMAGE}:${VERSION}
docker push ${IMAGE}:${VERSION}
'''
}
}
}
}
Mit dieser reuseNode
Option können Sie Maven Build im Container ausführen, auch wenn Checkout und Docker Build auf dem Knoten selbst ausgeführt werden. Siehe DokumentationHier.