Integrációs eszközök

Áttekintés

A CI/CD rövidítés az alábbiakat takarja:

  • CI: Continuous Integration: ez maga az eszköz, amely a folyamatos integrációt (tkp. az azonnali fordítást) teszi lehetővé.
  • CD: Continuous Delivery (vagy Continuous Deployment): ez egy módszertan, melynek célja a minél gyorsabb ("folyamatos") szállítás.

Integrációs eszközök

Az integrációs eszközök (angolul: continuous integration) célja többrétű:

  • Új verzió létrehozása ("szép magyar" kifejezéssel release-elés). Sokféle hibát okozhat az, ha valakinek a fejlesztői számítógépén készülnek a verziók; azt egy független szerveren érdemes végrehajtani. Egy integrációs eszköz erre tökéletes; valójában ez a legfontosabb feladata.
  • Folyamatos ellenőrzés. Ha valaki egy új verziót tölt fel a közös kódbázisba, akkor az integrációs eszköz azonnal lefordítja. Ha hibát talál benne, akkor azonnal küld értesítést. Hibát akár egy elrontott egységteszt is okozhat, vagy egy olyan forrásfájl, melyet elfelejtett a fejlesztő feltölteni. De merészebbet is gondolhatunk: egyes integrációs eszközök esetén azt is be lehet állítani, hogy akkor is hibásként jelezze a fordítást, ha kódolási szabálysértés került bele, vagy mondjuk az egységtesztek nem fedik le kellő arányban a kódot.
  • Verziózás. Egyes integrációs eszközös képesen automatikusan növelni a verziószámot, így biztos nem marad el.
  • Ütemezett futtatás. Lehetnek olyan műveletek a forráskódon, melyet rendszeres időközönként, pl. naponta vagy hetente egyszer végre kell hajtani; általában erre is használhatjuk az integrációs eszközöket. Például egy nagyobb erőforrás igényű rendszerteszt végrehajtását érdemes éjszakára ütemezni, hogy ne zavarja a napi munkavégzést, és reggelre meg legyen az eredmény.
  • Monitorozás. Az integrációs eszközök alapfeladata elsősorban nem a monitorozás, de alapvető monitorozási feladatok végrehajtására általában kiváló. Például a már említett automatikus figyelmeztető üzeneteket tekinthetjük egyfajta monitorozásnak, ill. általában egyszerűbb kimutatásokat is készít, pl. arról, hogy az elmúlt x fordításból mennyi volt sikeres.

Ez az oldal jól összefoglalja az integrációs eszközöket: https://en.wikipedia.org/wiki/Comparison_of_continuous_integration_software.

Jenkins

Hosszú ideje ez a legnépszerűbb CI/CD eszköz, bár vannak trónkövetelők. A neten található leírások sajnos egyike sem felel meg annak, amit kerestem, így elég hosszú ideig tartott, mire összeállít a kép. A lentiekben az alábbit fogjuk végrehajtani:

  • Egy Java Maven projekt létrehozása, ami tartalmaz egységtesztet. A példa egy egyszerű összeadó lesz.
  • Ennek a feltöltése GitHub-ra.
  • A Jenkins natív telepítése Windows-ra.
  • A Jenkis beállítása.
  • A fenti GitHub projekt alapján egy Jenkins job létrehozása.
  • A változtatások automatikus figyelése.

A dolog nem lesz egyszerű.

Előfeltételek

Az alábbiakat kell előre feltelepíteni ahhoz, hogy a lenti projekt működjön.

  • Java (https://www.oracle.com/java/technologies/downloads/): a JDK-t kell feltelepíteni, majd a PATH környezeti változót úgy beállítani, hogy a javac.exe és a java.exe is közvetlenül elérhető legyen.
  • Maven (https://maven.apache.org/): szintén úgy kell beállítani a PATH környezeti változót, hogy a mvn.cmd közvetlenül elérhető legyen.
  • Git (https://git-scm.com/): telepítés után a PATH-on rajta kell lennie a git.exe-nek. Érdemes, bár nem kötelező néhány alapbeállítást végrehajtani: git config —global user.name "Your Name", git config —global user.email moc.elpmaxe|uoy#moc.elpmaxe|uoy.
  • Eclipse (https://www.eclipse.org/): vagy használjuk a kedvenc integrált fejlesztőkörnyezetünket. Az Eclipse szükséges beállításairól ezen az oldalon olvashatunk részletesebben: Integrált fejlesztőkörnyezetek.
  • GitHub (https://github.com/): azonosítót kell létrehoznunk.

Az alábbi parancsok segítségével győződjünk meg arról, hogy minden rendben működik-e:

c:\>javac -version
javac 17.0.7

c:\>java -version
java version "17.0.7" 2023-04-18 LTS
Java(TM) SE Runtime Environment (build 17.0.7+8-LTS-224)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.7+8-LTS-224, mixed mode, sharing)

c:\>mvn -version
Apache Maven 3.9.3 (21122926829f1ead511c958d89bd2f672198ae9f)
Maven home: c:\programs\apache-maven-3.9.3
Java version: 17.0.7, vendor: Oracle Corporation, runtime: c:\programs\java\jdk-17.0.7
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

c:\>git --version
git version 2.41.0.windows.1

GitHub repository létrehozása

Lépjünk be a GitHub oldalra. A New ikonra kattintva hozzunk létre egy új repository-t:

  • Repository name: mymath
  • Az egyszerűség érdekében a láthatóság maradjon publikus (public).
  • Minden más maradjon alapértelmezett.
  • Kattintás: Create repository

A megjelenő oldalon középen találjuk a frissen létrehozott repository elérhetőségét, ami nálam ez: https://github.com/faragocsaba/mymath.git. Itt számos lehetőséget sorol fel, hogy hogyan kezdhetünk neki. Talán a legegyszerűbb a következő:

  • Klónozzuk a most elkészült repository-t.
  • Létrehozzuk ott a szükséges fájlokat.
  • A megfelelő git parancsokkal feltöltjük.

Hozzunk létre egy alkalmas könyvtárat (pl. c:\prog\github\), és ott adjuk ki a következő parancsot:

c:\prog\github>git clone https://github.com/faragocsaba/mymath.git
Cloning into 'mymath'...
warning: You appear to have cloned an empty repository.

Értelemszerűen mindenki a saját repository-ját használva.

Ezzel létrejött egy elvileg üres repository, viszont ha engedélyezzük a rejtett fájlok megjelenítését is, akkor láthatjuk, hogy létrejött egy .git nevű könyvtár. Ez tehát egy lokális git repository, és a megfelelő push utasítás hatására a fájlok fel fognak töltődni a GitHub-ra.

Maven projekt létrehozása

Hozzunk létre egy Java Maven projektet! Itt leírom a szükséges lépéseket az Eclipse integrált fejlesztőrendszerben, végül pedig megadom az összes fájlt, teljes elérési útvonallal, így elvileg integrált fejlesztőkörnyezet nélkül is el lehet készíteni.

File -> New -> Other… -> Maven -> Maven Project

Ha a Java perspektíva van megnyitva, akkor a New alatt közvetlenül ott lesz a Maven Project.

A megjelenő oldalon:

  • Create a simple project legyen bekapcsolva.
  • A Use default workspace location viszont legyen kikapcsolva. Itt kézzel válasszuk ki a fenti könyvtárat (C:\prog\github\mymath).
  • Next
  • Group Id: találjuk ki valamit, ami minket azonosító. Itt a konvenció az, hogy a cégek a saját weboldalukat adják meg, fordított sorrendben. Én ezt adom meg: hu.faragocsaba.
  • Artifact Id: ide a program nevét (azonosítóját) kell megadni, pl. mymath.
  • Minden más maradhat alapértelmezett ill. üres.
  • Finish.

Nyissuk meg a létrejött mymath projektet. A gyökérben kell, hogy legyen egy pom.xml fájlt, azt nyissuk meg szerkesztésre. Módosítsuk a tartalmát a következőre:

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>hu.faragocsaba</groupId>
    <artifactId>mymath</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

Jobb kattintás at src/main/java-n -> New -> Package -> Name: hu.faragocsaba.mymath -> Finish.

Majd jobb kattintás a hu.faragocsaba.mymath-on -> New -> Class -> Name: MyMath -> Finish

Akik "kézzel" készítik, azok hozzák létre az alábbi fájlszerkezetet és fájlt az alábbi tartalommal

src/main/java/hu/faragocsaba/mymath/MyMath.java

package hu.faragocsaba.mymath;
 
public class MyMath {    
    public static int myAdd(int a, int b) {
        return a + b;
    }
}

Hozzunk létre egységtesztet:

  • Jobb kattintás a test/main/java-n -> New -> Package -> Name: hu.faragocsaba.mymath -> Finish
  • Jobb kattintás a test/main/java-n belüli hu.faragocsaba.mymath csomagon -> New -> Class -> Name: MyMathTest -> Finish

"Gyalog" módszerrel, a teljes könyvtárszerkezet:

test/main/java/hu/faragocsaba/mymath/MyMath.java

package hu.faragocsaba.mymath;
 
import static org.junit.Assert.assertEquals;
 
import org.junit.Test;
 
public class MyMathTest {
    @Test
    public void testAddPositive() {
        assertEquals(5, MyMath.myAdd(3, 2));
    }
}

Lehet, hogy a külső könyvtár komponenseit az Eclipse aláhúzza; ez esetben a Project -> Clean… általában segít.

Kipróbálás: jobb kattintás a MyMathTest-en -> Run As -> JUnit Test. "Ellenpróba": írjuk át az ellenőrzésnél az 5-öt 6-ra, és futtassuk le ismét. Majd állítsuk vissza.

Integrált fejlesztőkörnyezet nélkül adjuk ki a gyökérből a mvn test parancsot:

c:\prog\github\mymath>mvn test
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------< hu.faragocsaba:mymath >------------------------
[INFO] Building mymath 0.0.1-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- resources:3.3.1:resources (default-resources) @ mymath ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource from src\main\resources to target\classes
[INFO]
[INFO] --- compiler:3.11.0:compile (default-compile) @ mymath ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- resources:3.3.1:testResources (default-testResources) @ mymath ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource from src\test\resources to target\test-classes
[INFO]
[INFO] --- compiler:3.11.0:testCompile (default-testCompile) @ mymath ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- surefire:3.1.2:test (default-test) @ mymath ---
[INFO] Using auto detected provider org.apache.maven.surefire.junit4.JUnit4Provider
[INFO]
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running hu.faragocsaba.mymath.MyMathTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.045 s -- in hu.faragocsaba.mymath.MyMathTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.097 s
[INFO] Finished at: 2023-07-18T22:24:51+02:00
[INFO] ------------------------------------------------------------------------

Feltöltés GitHub-ra

Lokálisan már működik; itt az ideje, hogy feltöltsük mindezt a GitHub-ra. Itt még létre kell hozni egy fájlt, mégpedig .gitignore néven, a gyökérben (a fájt előtti pont fontos). Az Eclipse létre is hozott egyet, bár nem engedi módosítani. Ebben soroljuk fel azokat a fájlokat és könyvtárakat, melyeket nem szeretnénk feltölteni a GitHub-ra. Ha létrejött a fájlt, akkor is módosítani kell; a tartalma (Eclipse esetén) az alábbi legyen.

.gitignore

target/
.settings/
.classpath
.project

Ha nem használunk IDE-t, akkor legalább a target/-nek ott kell lennie.

Majd parancssorból készítsük el az első commitunkat! (Elvileg az Eclipse is alkalmas erre, de személy szerint én parancssorból szeretem az ilyesmit végrehajtani.)

  • git status: nézzük meg, hogy hol tartunk.
  • git add .: mindegyik könyvtárat és fájlt tegyük az ún. stage-re.
  • git status: ismét győződjünk meg arról, hogy a megfelelő fájlokat fogjuk feltölteni.
  • git commit -m "Initial commit of mymath application": ezzel létrehozzuk a lokális commitot.
  • git push: ezzel feltöltjük a GitHub-ra. Ez utóbbi lépésben kérheti a bejelentkezést, amit a böngésző segítségével hajthatunk végre.
Microsoft Windows [Version 10.0.19045.3208]
(c) Microsoft Corporation. All rights reserved.

c:\prog\github\mymath>git status
On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .gitignore
        pom.xml
        src/

nothing added to commit but untracked files present (use "git add" to track)

c:\prog\github\mymath>git add .
warning: in the working copy of '.gitignore', LF will be replaced by CRLF the next time Git touches it

c:\prog\github\mymath>git status
On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   .gitignore
        new file:   pom.xml
        new file:   src/main/java/hu/faragocsaba/mymath/MyMath.java
        new file:   src/test/java/hu/faragocsaba/mymath/MyMathTest.java

c:\prog\github\mymath>git commit -m "Initial commit of mymath application"
[main (root-commit) 0b835b9] Initial commit of mymath application
 4 files changed, 38 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 pom.xml
 create mode 100644 src/main/java/hu/faragocsaba/mymath/MyMath.java
 create mode 100644 src/test/java/hu/faragocsaba/mymath/MyMathTest.java

c:\prog\github\mymath>git push
Enumerating objects: 17, done.
Counting objects: 100% (17/17), done.
Delta compression using up to 8 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (17/17), 1.36 KiB | 697.00 KiB/s, done.
Total 17 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/faragocsaba/mymath.git
 * [new branch]      main -> main

c:\prog\github\mymath>

Nyissuk meg ismét a https://github.com/faragocsaba/mymath oldalt, és frissítsük. Ha minden rendben történt, akkor látnunk kell az imént létrehozott fájlokat és könyvtárakat.

A Jenkins telepítése

A https://www.jenkins.io/download/ oldalon láthatjuk, hogy hogyan lehet a Jenkinst telepíteni. Mi most egy olyan módszert választunk, ami nem javasolt élesben, kipróbálásra viszont kiválóan alkalmas, és olyan rendszereken is működik, ahol nincs rendszer adminisztrátori jogosultságunk.

Töltsük le a Generic Java package (.war) változatot. EZ egy kb. 100 megabájtos fájl. Másoljuk be egy alkalmas könyvtárba (pl. c:\programs\Jenkins\jenkins.war) és indítsuk el a java -jar jenkins.war parancs segítségével.

Indításkor kiírja az admin jelszót, ami egy generált hexadecimális kód, és megtalálható a C:\Users\[user]\.jenkins\secrets\initialAdminPassword fájlban is. Erre szükségünk lesz a használat során.

Nyissuk meg a http://localhost:8080/ oldalt. (Természetesen más ezen a porton nem futhat, különben nem fog működni; ez esetben át kell állítani a portot.) Kérni fogja a jelszót, adjuk meg.

A Jenkis beállításai

A használatbavétel előtt végre kel hajtani néhány beállítást. A jenkins.war fizikailag nem fog változni, ahogy a könyvtárba, amibe másoltuk, szintén nem kerül más. A beállítások és minden egyéb a c:\Users\[user]\.jenkins\ könyvtárba fog kerülni.

  • Még az első indításkor fel fogja kínálni a beépülők (plugins) telepítését; fogadjuk el az alapértelmezettet.
  • Javasolni fogja azt, hogy hozzunk létre felhasználót. Produkciós környezetben erre természetesen szükség lesz, de most demonstrációs céllal kihagyhatjuk.
  • Majd kattintsunk arra, amit felkínál (Instance Configuration, Save and finish, Start using Jenkins).

Indulást követően kettő kellemetlen meglepetés ér minket: egyrészt részben magyarul szerepelnek a feliratok, másrészt nem találjuk, hogy hogyan lehet kikapcsolni.

Itt csak egy gondolat erejéig: miért is baj az, hogy részben magyarul van? Magyarok vagyunk, ennek örülnünk kellene, nem? Az alábbiak miatt érdemes elkerülnünk ez esetben a magyar nyelvet:

  • A teljes terminológia angolul van. Léteznek a magyar nyelvben olyan informatikai szavak és kifejezések, amelyek meghonosodtak (pl. mondjuk a printer helyett nyomtatót, a meeting helyett megbeszélést, a call helyett hívást stb.), itt viszont nincsenek meghonosodott szakkifejezések.
  • A fordítás egyébként is meglehetősen furcsa. Pl. a szoftver build helyett sohasem mondjuk azt, hogy építés.
  • Csak egy kis rész van lefordítva, nagy része nincs. Így különösen igénytelen hatást kelt. Ha még lennének is meghonosodott kifejezések és amúgy igényes lenne, annak semmi értelme sincs, hogy magyarul használjunk egy 20%-ban lefordított szoftvert.
  • Nagyon nehéz segítséget kérni, hibára keresni, ha nem angolul van a felirat, a hibaüzenet stb.
  • Végül a minden esetleges ellenérvet megdöntő fő érv: céges környezetben az angol nyelvűt fogjuk használni, agy azt kell megtanulnunk, abban kell komfortosan mozognunk.

Viszont akárhol is keressük, nem találjuk a nyelv átállítását. Ehhez az alábbi lépéseket kell végrehajtani:

  • Meg kellene találni a Manage Jenkins menüpontot, ami nem is olyan egyszerű. Bal oldalon a Jenkins Kezelése menüpont az, ill. fent az admintól balra levő pajzsra kattintva találjuk. De végszükség esetén a közvetlen URL: http://localhost:8080/manage/
  • Fel kell telepíteni a locale plugint. Itt Plugins -> Available plugins "Locale plugin": ezt telepítsük fel.
  • Lehet, hogy újra kell indítani. Ez esetben ki kell lóni Ctrl+C-vel a java -jar jenkins.war parancsot, majd újra kell indítani.
  • Ismét menjünk vissza a Manage Jenkins oldalra -> System -> keressünk rá arra, hogy Default language (a Locale beépülő nélkül ez nem lenne ott), és itt kattuntsuk be az "Ignore browser preference and force this language to all users" jelölőnégyzetet.
  • Kattintsunk a Mentés gombra.

Ha minden renden történt, akkor angol nyelvű Jenkinst kaptunk.

Jenkins job létrehozása

Következő lépésben létrehozunk egy Jenkin jobot, ami a fenti GitHub projektet menedzseli.

  • A főoldalon kattintsunk a "+ New Item"-re (ha még nem hoztunk létre jobot, akkor középen van, egyébként bal oldalon felül).
  • Adjunk neki egy nevet, pl. MyMath.
  • Válasszuk ki a Freestyle Project-et.
  • Kattintsunk az OK-ra.
  • A megjelenő oldalon a Source Code Management alatt válasszuk ki a Git-et.
  • A Repository URL-hez írjuk be az URL-t, pl. https://github.com/faragocsaba/mymath.git.
  • Ha privát lenne, akkor a Credentials-t is meg kellene adni; azzal, hogy publikus, nem nem kell megadni.
  • A Branch Specifier legyen ez: main, mivel a GitHub-on ez a fő branch neve.
  • Lejjebb görgetve a Build Steps alatt Add build step -> Invoke top-level Maven targets -> a Goals-hoz írjuk be ezt: test. (Megadhatnánk többet is, szóközzel elválasztva, pl. clean install).
  • Save
  • Egyelőre nincs build, azt kézzel kell nekünk elindítanunk. Kattintsunk a Build Now oldalmenüre.
  • Várnunk kell egy kicsit, mert most történik a checkout, a fordítás és az egységtesztek futtatása.
  • Ha minden rendben történt, akkor megjelenik egy kis zöld pipa és mellette egy #1. Arra kattintsunk.
  • Kattintsunk az oldalmenüben a Console Outputra. Itt láthatjuk a részleteket.

Automatikus végrehajtás

Most ha módosítanánk a forráson, akkor nem történne automatikus fordítás, azt kézzel kellene végrehajtani. Menjünk vissza a MyMath job-ra pl. úgy, hogy felül rákattintunk a nevére (vagy a közvetlen link: http://localhost:8080/job/MyMath/), és állítsuk be az automatikus figyelést:

  • Configure
  • Build Triggers -> Poll SCM -> kattintsuk be itt a jelölőnégyzetet -> a Schedule alá írjuk be ezt: * * * * * (tehát szóközökkel elválasztott 5 csillag). Ezzel azt mondjuk meg neki, hogy percenként ellenőrizze a GitHub-ot. Ez természetesen túl gyakori (erre figyelmeztet is), így a végén ne felejtsük el kikapcsolni.
  • Kattintsunk a Save-ra.

Tegyünk bele egy szándékos hibát: egy egységtesztet, ami elhasal:

package hu.faragocsaba.mymath;
 
import static org.junit.Assert.assertEquals;
 
import org.junit.Test;
 
public class MyMathTest {
    @Test
    public void testAddPositive() {
        assertEquals(5, MyMath.myAdd(3, 2));
    }
 
    @Test
    public void testAddNegative() {
        assertEquals(-6, MyMath.myAdd(-3, -2));
    }
}

A fent megadott módok valamelyikén futtassuk le, és győződjünk meg, hogy tényleg elhasal.

Adjuk ki a következő parancsokat:

  • git status: nézzük meg, hogy mely fájlok változtak
  • git diff: nézzük meg, hogy pontosan mi változott
  • git add .: adjuk a stage-re a megváltozott fájlt
  • git commit -m "Add a new unit test": álnaivan hozzáadjuk a hibás egységtesztet
  • git push: ezzel feltöltjük a változtatást a GitHub-ra
c:\prog\github\mymath>git status
On branch main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   src/test/java/hu/faragocsaba/mymath/MyMathTest.java

no changes added to commit (use "git add" and/or "git commit -a")

c:\prog\github\mymath>git diff
diff --git a/src/test/java/hu/faragocsaba/mymath/MyMathTest.java b/src/test/java/hu/faragocsaba/mymath/MyMathTest.java
index 259659e..a62a729 100644
--- a/src/test/java/hu/faragocsaba/mymath/MyMathTest.java
+++ b/src/test/java/hu/faragocsaba/mymath/MyMathTest.java
@@ -9,4 +9,9 @@ public class MyMathTest {
     public void testAddPositive() {
         assertEquals(5, MyMath.myAdd(3, 2));
     }
+
+    @Test
+    public void testAddNegative() {
+        assertEquals(-6, MyMath.myAdd(-3, -2));
+    }
 }

c:\prog\github\mymath>git add .

c:\prog\github\mymath>git commit -m "Add a new unit test"
[main 74de04b] Add a new unit test
 1 file changed, 5 insertions(+)

c:\prog\github\mymath>git push
Enumerating objects: 17, done.
Counting objects: 100% (17/17), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (9/9), 644 bytes | 644.00 KiB/s, done.
Total 9 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To https://github.com/faragocsaba/mymath.git
   0b835b9..74de04b  main -> main

Mivel a Jenkins figyeli a GitHub-ot, megjelenik egy #2 egy kis piros kereszttel, azt jelezve, hogy itt valami probléma van. A fenti elírt módon keressük meg a Console outputot; ott többek között ezt látjuk:

[ERROR] Failures: 
[ERROR]   MyMathTest.testAddNegative:15 expected:<-6> but was:<-5>

Nagyjából ez az, ami a CI/CD eszközök lényegét adják: ha valaki commitol egy hibás egységtesztet, az azonnal jelzi, hogy baj van!

Javítsuk is rögtön ki! A javított forrás:

package hu.faragocsaba.mymath;
 
import static org.junit.Assert.assertEquals;
 
import org.junit.Test;
 
public class MyMathTest {
    @Test
    public void testAddPositive() {
        assertEquals(5, MyMath.myAdd(3, 2));
    }
 
    @Test
    public void testAddNegative() {
        assertEquals(-5, MyMath.myAdd(-3, -2));
    }
}

A fenti módszerrel hajtsuk végre a git parancsokat is.

c:\prog\github\mymath>git status
On branch main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   src/test/java/hu/faragocsaba/mymath/MyMathTest.java

no changes added to commit (use "git add" and/or "git commit -a")

c:\prog\github\mymath>git diff
diff --git a/src/test/java/hu/faragocsaba/mymath/MyMathTest.java b/src/test/java/hu/faragocsaba/mymath/MyMathTest.java
index a62a729..970b6df 100644
--- a/src/test/java/hu/faragocsaba/mymath/MyMathTest.java
+++ b/src/test/java/hu/faragocsaba/mymath/MyMathTest.java
@@ -12,6 +12,6 @@ public class MyMathTest {

     @Test
     public void testAddNegative() {
-        assertEquals(-6, MyMath.myAdd(-3, -2));
+        assertEquals(-5, MyMath.myAdd(-3, -2));
     }
 }

c:\prog\github\mymath>git add .

c:\prog\github\mymath>git commit -m "Fix wrong unit test"
[main 59008c3] Fix wrong unit test
 1 file changed, 1 insertion(+), 1 deletion(-)

c:\prog\github\mymath>git push
Enumerating objects: 17, done.
Counting objects: 100% (17/17), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (9/9), 588 bytes | 588.00 KiB/s, done.
Total 9 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To https://github.com/faragocsaba/mymath.git
   74de04b..59008c3  main -> main

Menjünk vissza a MyMath Jenkins jobra: azt fogjuk látni, hogy a job "meggyógyult", ismét zöld pipa van a szám mellett.

Végül emlékeztető: kapcsoljuk ki az SCM figyelését.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License