[JAVA] Erstellen eines Testflusses auf CircleCI mit Jib

TL;DR

Was ist Fock?

Um eine Java-Anwendung mit Docker in einen Docker-Container zu verwandeln, müssen Sie Schritte ausführen, z. B. Java erstellen, eine Docker-Datei vorbereiten und Docker installieren. Jib ist ein OSS, das alle derartigen störenden Prozesse mit einem einzigen Befehl ausführen kann. Veröffentlicht als Maven and Gradle Plug-In.

Versuchen Sie es mit Jib gemäß Handbuch.

Die folgende Beschreibung wurde zu build.gradle hinzugefügt

plugins {
  id 'com.google.cloud.tools.jib' version '0.10.1'
}

Führen Sie den Befehl nach dem Schreiben wie folgt gemäß dem Handbuch aus

gradle jib --image=Bildname, den Sie generieren möchten

Auf diese Weise wird ein Docker-Image generiert und an Dockerhub gesendet.

Wenn Sie es jedoch in einer Umgebung ohne Docker ausführen, können Sie sich bei Dockerhub mit nur der obigen Beschreibung authentifizieren. Um lokal ohne Docker ausgeführt zu werden, müssen Sie die Authentifizierung in bug.gradle einrichten. Wenn Sie einen Docker lokal haben, können Sie ihn pushen, ohne die Einstellungen in build.gradle zu schreiben, wenn Sie die Docker-Anmeldung im Voraus ausführen und die Authentifizierung bestehen.

Möglicherweise möchten Sie auch lokal ein Docker-Image erstellen. Falls das passiert

gradle jibDockerBuild --image=Bildname, den Sie generieren möchten

Es ist auch möglich, es auf dem lokalen Docker zu generieren, indem Sie dies tun.

Was ich machen wollte

Jib überträgt das Image sogar in das Docker-Repository, was es einfacher macht, als das Container-Image manuell aus Docker zu generieren. Unter Ausnutzung der Tatsache, dass es leicht containerisiert werden kann, ohne eine Docker-Datei vorzubereiten, werde ich versuchen, es in den CI-Flow zu integrieren. Wir werden einen Black-Box-Test für das von Jib generierte Docker-Image durchführen. Wenn ein Problem auftritt, senden Sie es an ECR. Wenn ein Problem auftritt, erstellen wir einen Mechanismus, um eine Warnung auszulösen, ohne es an ECR zu senden.

Ablauf der Automatisierung

  1. Ändern Sie den Code und drücken Sie auf GitHub. CircleCI läuft
  2. Führen Sie einen White-Box-Test auf CircleCI durch
  3. Führen Sie Jib aus und generieren Sie ein Docker-Image in Docker auf CircleCI
  4. Starten Sie den Container über das generierte Image und führen Sie den Black-Box-Test aus
  5. Wenn alle oben genannten Punkte korrekt sind, drücken Sie mit Jib auf ECR. Benachrichtigen Sie Slack, wenn ein Problem vorliegt

1. Ändern Sie den Code und drücken Sie auf GitHub. CircleCI läuft

Lassen Sie uns zunächst Ihr GitHub-Repository in CircleCI integrieren. Integrieren Sie GitHub und CircleCI Bereit, wenn Sie mit Bezug auf zusammenarbeiten

2. Führen Sie den White-Box-Test durch

Dies ist ein grundlegender Teil, daher werde ich ihn weglassen.

3. Führen Sie Jib aus und generieren Sie ein Docker-Image in Docker auf CircleCI

Schreiben Sie die folgende Beschreibung in build.gradle und führen Sie den Befehl aus, um ein Image im lokalen Docker zu erstellen.

build.gradle


jib {
  from {
    //Basisbild
    image = 'circleci/java'
  }
  to {
    image = 'ECR-Repository zu pushen'
  }
}
gradle jibDockerBuild

--Bild ist nicht erforderlich, da die Einstellung zum Ausleger auf Gradle hinzugefügt wird.

4. Starten Sie den Container über das generierte Image und führen Sie den Black-Box-Test aus

Starten Sie den Container über das Docker-Image und führen Sie einen Black-Box-Test durch. Es gibt jedoch einige Einschränkungen. Da sich der Docker auf CircleCI nicht auf dem CircleCI-Host befindet, können Sie dies nicht tun, selbst wenn Sie versuchen, vom gestarteten Host aus darauf zuzugreifen.

Nehmen Sie als Beispiel den Start eines Nginx-Containers auf CircleCI.

Beispiel in Nginx


docker run -d -p 8080:80 nginx
curl localhost:8080
curl: (7) Failed to connect to localhost port 8080: Connection refused

Bereiten Sie daher ein Docker-Image vor, das mit dem Docker-Container getestet werden soll, und testen Sie es. Kurz gesagt, es ist nur ein Bild des Sendens einer Anfrage an eine bestimmte IP (diesmal die IP des zu testenden Containers) und des Testens. Lassen Sie uns dies schnell mit Fock machen und ausführen.

yml:.circle/config.yml


      - run:
          name: create test image
          command: cd ./test ; ../gradlew jibDockerBuild
      - run:
          name: blackbox test
          command:Bild zum Ausführen des Docker-Lauftests

5. 5. Wenn alle oben genannten Punkte korrekt sind, drücken Sie mit Jib auf ECR. Benachrichtigen Sie Slack, wenn ein Problem vorliegt

Verwenden Sie amazon-ecr-credential-helper, wenn Sie von Jib zu ECR wechseln. Daher müssen Sie Ihrem PATH amazon-ecr-credential-helper hinzufügen, bevor Sie ihn ausführen.

yml:.circle/config.yml


      - run:
          name: download go
          command: wget -O - "https://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz" | tar zxvf - -C /home/circleci/project
      - run:
          name: get ecr-helper
          command: ./go/bin/go get -u github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cli/docker-credential-ecr-login
      - run:
          name: push ecr
          command: export PATH=$PATH:/home/circleci/go/bin/ ; ./gradlew jib

Die obige Beschreibung ist nicht effizient, da sie jedes Mal für jede Go-Sprache gelöscht wird.

Wenn Sie die Zertifizierung an GCP und Dockerhub weitergeben möchten, lesen Sie bitte das Offizielle Dokument.

Die Benachrichtigung an Slack wird unter Bezugnahme auf "Slack of CircleCI-Ergebnisse benachrichtigen" (https://qiita.com/su-kun1899/items/640f6fa8b48749396c16) festgelegt.

Beispielcode

https://github.com/supecura/JibSample

Welcher Bereich ist besser

Bonus

Fragen, die auftauchten, als ich tatsächlich versuchte, sie vorzustellen, und das Vorhandensein oder Fehlen ihrer Funktion

Diese können über die Containereigenschaft von Jib festgelegt werden.

sample


jib {
  container {
    jvmFlags = ['-Xms512m']
    mainClass = 'Ausführungsklasse'
    args = ['hoge','huga']
    environment = [ENV:'develop', LANG:'ja_JP.UTF-8']
  }
}

Weitere detaillierte Einstellungen finden Sie unter Offizielle Dokumente.

Recommended Posts

Erstellen eines Testflusses auf CircleCI mit Jib
Docker-Build für mehrere Projekte mit Fock
Erstellen Sie einen Minecraft-Server auf AWS
Erstellen Sie eine XAMPP-Umgebung unter Ubuntu
Verwenden des lokalen Netzwerks mit iOS 14
Erstellen Sie eine Browsertestumgebung mit Capybara in der Docker-Entwicklungsumgebung
Erstellen Sie ein Maven-Repository in AWS S3
Erstellen Sie eine Java-Entwicklungsumgebung auf dem Mac
Erstellen Sie eine JMeter-Umgebung auf Ihrem Mac
Erstellen Sie eine Kotlin-App mit dem OpenJDK Docker-Container
Generieren Sie ein Testkontokennwort mit Rails SecureRandom.alphanumeric
Einführung in Rspec, ein Testframework für Ruby on Rails
Erstellen Sie eine Laravel-Umgebung auf einer AWS-Instanz
Erstellen Sie eine Java-Ausführungsumgebung auf Sakura VPS
So erstellen Sie eine Pytorch-Umgebung unter Ubuntu
Installieren Sie Ubuntu 20.04 in der virtuellen Box unter Windows 10 und erstellen Sie eine Entwicklungsumgebung mit Docker
Erstellen Sie eine Java-Entwicklungsumgebung mit jenv auf Ihrem Mac
Memo zum Erstellen einer Servlet-Umgebung auf EC2 von AWS
Erstellen Sie eine Ruby on Rails-Entwicklungsumgebung in AWS Cloud9
[JUnit 5-kompatibel] Schreiben Sie einen Test mit JUnit 5 mit Spring Boot 2.2, 2.3
Ich habe versucht, Log4j2 auf einem Java EE-Server zu verwenden
Erstellen Sie ein internes Maven-Repository in Google Cloud Storage
Eine Aufzeichnung einer einfachen Berührung des GCP-Datenflusses
Versuchen Sie, mit Docker eine Java-Entwicklungsumgebung zu erstellen