Je construisais à l'intérieur d'un conteneur Maven en utilisant Jenkins. Quoi qu'il en soit, je voulais créer une image Docker en une seule fois. Cela a pris plus de temps que prévu.
src
Dockerfile
Jenkinsfile
pom.xml
La source et les fichiers ci-dessus sont stockés dans le référentiel git.
Dockerfile
FROM tomcat:jdk14-openjdk
COPY target/*.war /usr/local/tomcat/webapps/
Le fichier war créé par la construction est stocké sous des applications Web. Gérez dans le même référentiel que votre code.
Jenkinsfile
pipeline {
agent any
stages {
stage('delete_workspace') {
steps {
deleteDir()
}
}
stage('build') {
agent {
docker {
label 'master'
image 'maven:3.6.3-openjdk-14'
}
}
steps {
// Run Maven on a Unix agent.
sh "mvn clean package"
}
post {
success {
archiveArtifacts 'target/*.war'
}
}
}
stage('docker build') {
agent { label 'master'}
steps {
sh 'docker build -t test-tomcat:0.1 .'
}
////Lors de la suppression après coup.
// post {
// always {
// deleteDir()
// }
// }
}
}
}
Créé avec Declarative Pipeline.
stage
pipeline {
agent any
stages {
S'il n'y a aucun agent, le travail a échoué, il est donc décrit.
delete_workspace
stage('delete_workspace') {
steps {
deleteDir()
}
}
Il existe un modèle pour supprimer l'espace de travail à l'avance et toujours le faire après coup, mais lorsqu'une erreur se produit dans le travail, il est difficile de l'isoler personnellement s'il est supprimé, c'est donc un groupe pour le faire avant le travail.
build
agent {
docker {
label 'master'
image 'maven:3.6.3-openjdk-14'
}
}
Le conteneur maven s'exécute sur le nœud maître. Il m'a fallu un certain temps pour réaliser que la désignation du nœud était dans cette position.
steps {
// Run Maven on a Unix agent.
sh "mvn clean package"
}
post {
success {
archiveArtifacts 'target/*.war'
}
}
maven construit et enregistre les artefacts.
docker build
stage('docker build') {
agent { label 'master'}
steps {
sh 'docker build -t test-tomcat:0.1 .'
}
////Lors de la suppression après coup.
// post {
// always {
// deleteDir()
// }
// }
}
Depuis que j'ai commencé docker sur le maître, spécifiez l'agent comme maître. Étant donné que les artefacts créés avec le conteneur maven et le Dockerfile sont stockés sous l'espace de travail de l'hôte, Exécutez la version de docker telle quelle.
Je ne savais pas que la construction sans conteneur laisserait les résultats de la construction dans l'espace de travail hôte, Il a fallu beaucoup de temps pour créer. J'ai également constaté que je devais écrire dans Scripted Pipeline pour faire diverses choses avec docker dans jenkins. En ce qui concerne jenkins, il est plus simple d'appeler des commandes Ansible ou docker-compose que de travailler dur avec des pipelines. J'ai senti que c'était facile à entretenir. Lequel est-ce en fait?
https://www.jenkins.io/doc/book/pipeline/docker/