CI/CD
Pro automatickou integraci a nasazení využíváme Jenkins, který je hostovaný na našem serveru na adrese jenkins.webserver.esoul.cz. Je integrovaný přímo s naším GitHubem, takže se spouští automaticky a využívá OAuth pro přihlášení (přihlašujete se svým Github účtem).
Definice pipeline
Pipeline je definována v souboru Jenkinsfile, který je umístěn v kořenovém adresáři každého repozitáře.
Pipeline má následující základní strukturu:
Všechny hesla, klíče a další citlivé údaje by měly být uloženy jako Jenkins Credentials, aby nebyly přímo v
Jenkinsfile.Všechny statické hodnoty by měly být definovány jako proměnné v
environmentbloku.Alternativně je možné použít i argumenty pipeline, které se předávají při spuštění. (to slouží ale jen pro manuální spuštění pipeline)
Používejte
agent any, pokud není potřeba specifický agent pro danou pipeline.Pipeline by měla být rozdělena do několika stage, které reprezentují jednotlivé kroky procesu (např. build, test, deploy).
Stage se pouštějí sekvenčně, ale je možné je spouštět paralelně pomocí
paralleldirektivy.Deploy (staging a produkce) by měli mít vlastní stage, které se spouští jen na konkrétních větvích pomocí
whendirektivy (např.mainpro produkci adeveloppro staging).
Pomocné sdílené knihovny
V Jenkins je nadefinováno několik sdílených knihoven, které obsahují předdefinované funkce pro usnadnění práce s Jenkins pipeline.
Všechny definice knihoven jsou dostupné na našem GitHubu (pravděpodobně tam nemáte přístup).
Pokud chcete využít některou z knihoven, stačí ji naimportovat do vašeho Jenkinsfile pomocí direktivy @Library.
Pokud chcete využít více knihoven najednou, musíte je importovat všechny najednou v jednom řádku:
Deploy
Pomocná knihovna s předdefinovanými funkcemi pro nasazení aplikací v Jenkins pipeline.
Dostupné funkce:
- deployToServer
Funkce pro nahrání statických souborů do adresáře na server.
Parameter
Required
Default
Description
sourceDirYes
-
Local directory to deploy (e.g., 'output/')
deployServerNo
'localhost'
Target server hostname or IP address
deployUserNo
'deploy'
SSH user for deployment
deployPathYes
-
Destination path on server
groupOwnerNo
'apps'
Group to set ownership to
permissionsNo
'755'
File permissions to set (chmod)
createBackupNo
true
Whether to backup existing files before deployment
deleteExistingNo
true
Whether to delete files not in source (rsync --delete)
Příklad:
Nahraje obsah adresáře
output/na vzdálený server pomocí SSH klíče uloženého v Jenkins Credentials pod IDdeploy_ssh.script { sshagent(credentials: ['deploy_ssh']) { deployToServer( sourceDir: 'output/', deployServer: env.DEPLOY_SERVER, deployUser: env.DEPLOY_USER, deployPath: env.DEPLOY_PATH, groupOwner: 'apps', permissions: '755', createBackup: false, deleteExisting: true ) } }
dockerHelpers
Pomocná knihovna s předdefinovanými funkcemi pro práci s Dockerem v Jenkins pipeline.
Dostupné funkce:
- dockerRegistryLogin
Pomocná funkce pro přihlášení do Docker registry v Jenkins pipeline.
Parameter
Required
Default
Description
registryUrlNo
rg.fr-par.scw.cloud/testing-imagesURL of the Docker registry (e.g., 'https://index.docker.io/v1/')
usernameNo
-
Docker registry username
passwordYes
-
Docker registry password or token
Příklad:
Přihlásí se do Scaleway Docker registry, pomocí tajného klíče uloženého v Jenkins Credentials.
script { withCredentials([string(credentialsId: 'scaleway_secret_key', variable: 'SECRET')]) { dockerRegistryLogin( registryUrl: TEST_REGISTRY, password: env.SECRET ) } }Doporučuje se přidat i odhlášení do
postbloku:post { always { dockerRegistryLogout TEST_REGISTRY } }- dockerRegistryLogout
Pomocná funkce pro odhlášení z Docker registry v Jenkins pipeline. Vhodná pro použití v
postbloku.Parameter
Required
Default
Description
registryUrlNo
rg.fr-par.scw.cloud/testing-imagesURL of the Docker registry (e.g., 'https://index.docker.io/v1/')
Příklad:
dockerRegistryLogout TEST_REGISTRY
Testing
Pomocná knihovna pro usnadnění spouštění testů v Jenkins pipeline.
Dostupné funkce:
- runCommandInTest
Pomocná funkce pro spuštění libovolného příkazu v Docker kontejneru.
Parameter
Required
Default
Description
command
Yes
None
The command or script to be executed in the test environment.
image
Yes
None
The Docker image to use for the test environment.
options
No
None
Additional options to pass to the docker run command.
Příklad:
Spustí composer install v Docker kontejneru s PHP 8.5.
runCommandInTest( image: 'rg.fr-par.scw.cloud/testing-images/php:8.5', command: 'composer install --no-interaction --prefer-dist --optimize-autoloader', )Předchozí příklad je ekvivalentní k tomuto:
docker run --rm \ -v $(pwd):/workspace \ -w /workspace \ rg.fr-par.scw.cloud/testing-images/php:8.5 \ /bin/sh -c "composer install --no-interaction --prefer-dist --optimize-autoloader"- fullPhpTest
Pomocná funkce pro spuštění kompletního testování PHP aplikace v Docker kontejneru.
Spouští:
Composer install
Composer.json verify
PHPStan analýzu
PHPUnit testy
PHP CodeSniffer kontrolu
Parameter
Type
Required
Default
Description
imagestring
yes
-
Docker image containing the PHP environment (e.g., 'php:8.1-cli')
installboolean
no
trueWhether to run composer install
composerValidateboolean
no
trueWhether to run composer validate
phpstanboolean
no
trueWhether to run PHPStan static analysis
csboolean
no
trueWhether to run PHP CodeSniffer
testboolean
no
trueWhether to run PHPUnit tests
phpstanOptionsstring
no
-
Additional options for the phpstan docker run command
csOptionsstring
no
-
Additional options for the phpcs docker run command
testOptionsstring
no
-
Additional options for the phpunit docker run command
phpstanCommandstring
no
composer run phpstanCommand to run PHPStan
csCommandstring
no
composer run csCommand to run PHP CodeSniffer
testCommandstring
no
composer run testCommand to run PHPUnit tests
Příklady:
Spustí kompletní testování PHP aplikace v Docker kontejneru pro připravený image
php:8.5.fullPhpTest( image: "rg.fr-par.scw.cloud/testing-images/php:8.5", )Testování Laravel aplikace:
fullPhpTest( image: "rg.fr-par.scw.cloud/testing-images/php:8.5", phpstanCommand: './vendor/bin/phpstan analyse --memory-limit=2G', csCommand: './vendor/bin/pint --test', testOptions: '-e APP_ENV=testing -e DB_CONNECTION=sqlite -e DB_DATABASE=:memory:', testCommand: 'cp .env.example .env && php artisan key:generate --ansi && php artisan config:clear && php artisan test --parallel' )
Docker image pro testování
Testy se nespouštění přímo v agentu Jenkins, ale je potřeba využít konkrétní Docker image, který má všechny potřebné nástroje a závislosti pro spuštění testů.
Docker image jsou dostupné v našem Docker hub repozitáři hostovaném u Scaleway: rg.fr-par.scw.cloud/testing-images
Všechny Dockerfile s definicemi jsou dostupné na našem GitHubu: ci-images.
Momentálně máme dostupné tyto image (dostupné pro architektury: amd64 a arm64):
php- vychází z oficiálníhophp-apline-cli, nainstalovanýcomposera většina běžných rozšíření:8.4:8.5,:8:latest
node- vychází z oficiálníhonode-alpine, nainstalovanýnpmapnpm:24:25:lts,:latest
Sestavení produkčního docker image aplikace
Všechny aplikační Docker image by měly být nahrávány do našeho Docker hub repozitáře hostovaném u Scaleway: rg.fr-par.scw.cloud/app-images.
Sestavení probíhá v Jenkins pipeline.
Výsledný image by měl být označen tagem odpovídajícím verzi aplikace (např.
1.0.0,1.2.3, atd.) a také tagemlatest, který vždy ukazuje na nejnovější verzi.Název image by měl výstižně odpovídat názvu aplikace.
Výsledný image musí být samostatně spustitelný (musí obsahovat všechny potřebné závislosti a konfigurace).
Výsledný image by měl být optimalizován pro co nejmenší velikost a pro produkční prostředí.