webentwicklung-frage-antwort-db.com.de

Unterstützt Jenkins Pipeline Plug-in Docker Compose?

Ich suche nach einer Möglichkeit, Docker-fähiges Build auszuführen, das aus mehreren Containern in Jenkins 2.0 besteht.

Gibt es Pläne für die systemeigene Unterstützung von Docker Compose in Pipeline oder über CloudBees Docker-Plugins für Pipeline?.

Oder kann/muss dies durch explizite Aufrufe sh docker-compose... angesprochen werden? Verwenden Sie sie möglicherweise sogar in try... finally, um den Lebenszyklus von Services weiter zu steuern. 


BEARBEITEN: Die erste Antwort war, eine Möglichkeit vorzuschlagen, Docker-Container in Jenkins zu erstellen. Das ist hier nicht nötig. Ich (EngineerDollery) möchte meine Zielplattform in jenkins mit compose aufrufen, damit ich meine App dafür bereitstellen und End-to-End-Tests ausführen kann.

32
luka5z

Nach der Suche in Jenkins Bug Tracking , JENKINS-35025 schlägt vor, dass docker-compose.yml beim Ausführen eines Jobs in einem Docker-Container mit einem maven build berücksichtigt wird.

Siehe auch CI-Pipeline mit Jenkins erstellen , die davon ausgeht, dass Docker-Compose auf Ihrem Jenkins-Server installiert ist.

Hinweis: ein Jahr später (August 2017) wird Docker-Compose im Docker Pipeline-Plugin noch nicht unterstützt

Juli 2018, Ivan Aracki Anmerkungen in den Kommentaren :

Die manuelle Installation von docker-cli und docker-compose mit derselben Version wie Hosts ist die Lösung für jetzt ...

12
VonC

Hier sind die Dateien zum Ausführen eines Jenkins-Containers, in dem das Andockfenster ausgeführt wird:

docker run \
  -p 8080:8080 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --name jenkins \
  getintodevops/jenkins-withdocker:lts

referenz: https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci

2
Julio Marins

Ich stehe vor einem ähnlichen Problem. Ich habe diese https://reinout.vanrees.org/weblog/2017/10/03/docker-compose-in-jenkins.html gefunden - aber ich weiß nicht, was damit zusammenhängt .

Mein Problem ist der Test während der Entwicklung, und auch der Test wird in Jenkins automatisiert, und ich benutze Docker-Compose, um einige PHP-Skripte UND einen MySQL-Server aufzurufen, um isolierte Tests (ab sofort phpunit) auszuführen.

Ich könnte denken, dass ich das erreichen kann

  1. erstellen eines Netzwerks im Docker Host (mit docker network create)
  2. erstellen und Ausführen eines an dieses Netzwerk angeschlossenen mysql-Dockers (mit docker run mysql --network=netname --name=mysqlmachine
  3. ausführen von Skripts durch Jenkins, wobei --network angegeben wird und auf mysqlmachine als Host verwiesen wird.

Dies würde jedoch bedeuten, dass ich Db-Daten einrichten, Db-Daten bereinigen und auch immer auf der mysqlmachine belassen muss, auch wenn sie nicht benötigt wird, und einige RAM-Ressourcen verbraucht. Das letzte Problem kann ich mit dem Befehl docker start mysqlmachine und docker stop mysqlmachine in meiner Jenkinsfile lösen, die die Pipeline definiert.

Aber auch beim Ausführen einer Shell in das Andockfenster, wo jenkins ausgeführt wird, kann ich den Befehl docker nicht finden

Für mich ist eine praktikable Lösung, bis ich nichts Besseres finden kann

UPDATE: Ich werde die https://wiki.jenkins.io/display/JENKINS/Docker+Slaves+Plugin -Lösung ausprobieren, sie hat fast das, was ich brauche

UPDATE 08.02: .__, wie von Alexander Zeitler vorgeschlagen, mit

agent {
        docker {
            image 'pdmlab/jenkins-node-docker-agent:6.11.1'
            args '-v /var/run/docker.sock:/var/run/docker.sock'
        }
    }

in Jenkins-Datei können Sie den Befehl docker-compose verwenden: Docker in einem Docker, dh Docker in Docker in der Nähe eines Dockers, wie hier beschrieben: Docker in Docker - Volumes funktionieren nicht: Volle Dateien im 1st-Level-Container, leer in 2nd Tier

Ich habe es jedoch vorgezogen, einen anderen Ansatz zu verwenden, bei dem Jenkins nicht auf besondere Weise ausgeführt werden müssen.

Die Pipeline sagt:

stage('Test') {
    steps {
        sh './build_docker.sh jenkinstests'
    }
}

und build_docker.sh macht:

 jenkinstests)
 docker volume create idealodbconn
 docker run -v idealodbconn:/data --name helper busybox true
 docker cp ./dbconn/db249.json helper:/data
 docker rm helper

 docker-compose -f services/docker-compose-jenkins.yml up \
 --abort-on-container-exit \
 --exit-code-from idealoifapi

 docker-compose -f services/docker-compose-jenkins.yml rm -f
 docker volume rm idealodbconn
 ;;

Auch hier heißt --abort-on-container-exit zum Beenden, sobald ein in docker-compose-jenkins.yml definierter Container beendet ist und --exit-code-from idealoifapi sagt, dass der Exit-Code dem idealoifapi-Image entnommen werden soll.

Das ist alles. Fehlender Teil ist vielleicht die Verwendung des Volumes durch docker-compose-jenkins.yml, es ist extern: true:

volumes:
    idealodbconn:
        external: true
0