Löysitkö tälle sivulle, koska etsit ohjeita Jenkinsistä GitLab CI:hin siirtymisen aloittamiseen? Jos vastaus on kyllä, olet oikeassa paikassa! Ennen kuin sukellamme aiheeseen syvemmälle, käydään kuitenkin nopeasti läpi, mistä ohjelmistoputkissa on kyse.
Joonas Jauhiainen
DevOps Lead
Joonas is a DevOps lead with experience in telecom, banking, insurance, and manufacturing, among other industries. His hobbies include investigation of IT devices, developing games and other SW projects not to mention underwater rugby!
Wikipedian mukaan:
Ohjelmistoputki on automatisoitu prosessi, jossa ohjelmistokehityksen määritellyt vaiheet – build, testaus, käyttöönotto ja julkaisu – suoritetaan järjestelmällisesti ja toistettavasti.
Kun ymmärrät, mikä pipeline on, näet, miten CI/CD-työkalun valinta vaikuttaa työnkulkusi tehokkuuteen ja luotettavuuteen. Koska GitLab CI on uusi valitsemasi työkalu, tämä merkitsee uutta vaihetta ohjelmistosi elinkaaressa ja muuttaa myös tiimisi työskentelytapoja.
Ennen kuin yrität 1:1-migraatiota (joka ei todennäköisesti ole mahdollinen), suosittelen pysähtymään hetkeksi ja keskustelemaan tiimisi kanssa siitä, oletko tyytyväinen siihen, miten pipelinesi on toiminut tähän asti. Voit hyödyntää keskustelun tukena erilaisia työkaluja, kuten pipeline gameamme!
Migraation aloittaminen
Nyt kun olet määritellyt ja tehnyt suunnitelmasi, mikä on pipelinen tavoite ja miten se tuottaa arvoa sinulle ja pipelinea käyttävälle kehitystiimille (paras lopputulos olisi, jos kuulut itse suoraan kehitystiimiin)? Katsotaan, mitä tarvitsemme
Jenkinsistä GitLab CI:hin tehtävän migraation aloittamiseen suosittelen seuraavia taitoja:
YAML
YAML
YAML
Ymmärrys siitä, mitä tiimisi tekee
Miksi siis keskittyä niin paljon YAMLiin? Vastaus on yksinkertainen: GitLab CI:ssä kaikki käyttää YAML-syntaksia. Kurssin seuraavassa osassa selvitetään, mitä Jenkinsistä tarvitaan GitLab CI:ssä.
CI:n terminologia
Koska GitLab CI on täysin erilainen työkalu kuin Jenkins (teknisesti molemmat ovat vain hienostuneita cronjob-ajureita), on tärkeää sopia terminologiasta.
|
Jenkins |
GitLab |
Difference |
|
Agent/Node |
GitLab runner |
In Jenkins, an "agent" or "node" is a machine where jobs run. In GitLab, the equivalent is a "runner," which executes jobs defined in .gitlab-ci.yml. GitLab offers shared runners (hosted by GitLab) or self-managed runners. |
|
Jenkinsfile |
.gitlab-ci.yml |
The Jenkinsfile defines the pipeline in Jenkins, typically using Groovy-based syntax. In GitLab CI, the pipeline is defined using the .gitlab-ci.yml file, which uses YAML syntax. |
|
Stages and steps |
Stages and jobs |
A pipeline is divided into stages in both Jenkins and GitLab CI. In Jenkins, each stage contains multiple steps, while in GitLab CI, a stage contains jobs (which can run sequentially or in parallel). |
|
Trigger / Build trigger |
Pipeline triggers |
Jenkins triggers jobs via SCM polling, webhook, or manual triggers. GitLab has similar options, such as webhooks, schedules, and manual pipeline runs, but GitLab also integrates with GitLab-specific events (e.g., push events). |
|
Workspace |
CI/CD Runner directory |
In Jenkins, the workspace is a directory on the agent machine where jobs run. The runner's working directory functions similarly in GitLab, but the GitLab Runner manages it, and artifacts are stored differently (using GitLab's artifact storage). |
|
Jenkins plugin |
GitLab CI templates /components |
GitLab CI minimizes dependency on external extensions, simplifying management. Components provide modularity, while templates enable reuse. Explore more at GitLab CI Catalog. |
|
Artifacts |
Artifacts |
Both Jenkins and GitLab CI allow the storage of build artifacts (e.g., logs and reports). GitLab CI has a built-in feature for managing and downloading artifacts stored for a specific duration or pipeline job. |
|
Jobs |
Jobs |
In Jenkins, a job represents a single unit of work (e.g., a build). In GitLab, a job is a single task within a pipeline stage. The key difference is how jobs are defined and executed in .gitlab-ci.yml vs. in Jenkins' job configuration. |
Jenkins
GitLab
Ero
Agentti/solmu
GitLab runner
Jenkinsissä ”agentti” tai ”solmu” on kone, jolla työt suoritetaan. GitLabissa vastaava on ”runner”, joka suorittaa .gitlab-ci.yml-tiedostossa määritetyt työt. GitLab tarjoaa jaettuja runnereita (GitLabin ylläpitämiä) sekä itse hallinnoituja runnereita.
Jenkinsfile
.gitlab-ci.yml
Jenkinsfile määrittää pipelinen Jenkinsissä yleensä Groovy-pohjaisella syntaksilla. GitLab CI:ssä pipeline määritetään YAML-syntaksia käyttävällä .gitlab-ci.yml-tiedostolla.
Vaiheet ja askeleet
Vaiheet ja työt
Pipeline on jaettu vaiheisiin sekä Jenkinsissä että GitLab CI:ssä. Jenkinsissä kukin vaihe sisältää useita askelia, kun taas GitLab CI:ssä vaihe sisältää jobeja (jotka voivat suorittua peräkkäin tai rinnakkain).
Käynnistin / build-käynnistin
Pipeline-käynnistimet
Jenkins käynnistää jobeja SCM-kyselyllä, webhookeilla tai manuaalisilla käynnistimillä. GitLab tarjoaa vastaavia vaihtoehtoja, kuten webhookit, aikataulut ja pipelinejen manuaalisen suorittamisen, mutta GitLab integroituu myös GitLab-kohtaisiin tapahtumiin (esimerkiksi push-tapahtumiin).
Työtila
CI/CD Runnerin hakemisto
Jenkinsissä työtila on agenttikoneella sijaitseva hakemisto, jossa jobit suoritetaan. Runnerin työhakemisto toimii GitLabissa vastaavasti, mutta GitLab Runner hallinnoi sitä, ja artifactit tallennetaan eri tavalla (GitLabin artifact-tallennusta käyttäen).
Jenkins-plugin
GitLab CI -mallit / komponentit
GitLab CI vähentää riippuvuutta ulkoisista laajennuksista, mikä helpottaa hallintaa. Komponentit tuovat modulaarisuutta, ja mallit mahdollistavat uudelleenkäytön. Tutustu tarkemmin GitLab CI Catalogiin.
Artifactit
Artifactit
Sekä Jenkins että GitLab CI mahdollistavat build-artifactien, kuten lokien ja raporttien, tallentamisen. GitLab CI:ssä on sisäänrakennettu toiminto, jolla voit hallita ja ladata tietyn ajan tai pipeline-jobin ajan tallennettuja artifacteja.
Jobit
Jobit
Jenkinsissä jobi edustaa yhtä työyksikköä, kuten buildia. GitLabissa jobi on yksittäinen tehtävä pipeline-vaiheen sisällä. Keskeinen ero on siinä, miten jobit määritellään ja suoritetaan .gitlab-ci.yml-tiedostossa verrattuna Jenkinsin job-konfiguraatioon.
Tarvittavat ympäristöt
Kuten termistöstä näkyy, GitLab CI:ssä ei ole Jenkinsin tapaan "built-in"-toimintoa, "nodeja" tai "agentteja". Sen sijaan se käyttää runnereita. Tässä tarvitaan toimialasi asiantuntemusta, sillä sinun on huomioitava tiimisi erityisvaatimukset.
Mitä ympäristöjä tarvitset? Jos käytät GitLabia on-premises-ympäristössä, sinun on määritettävä omat runnerisi. Ne voivat toimia suoraan Linuxissa, Windowsissa tai macOS:ssä. Voit ajaa niitä myös Dockerin kautta näissä käyttöjärjestelmissä tai hyödyntää Kubernetesia taustalla toimivien, tarpeen mukaan käynnistyvien Docker-runnerien orkestrointiin. Jos olet valinnut GitLab.comin (SaaS-mallin), voit käyttää julkisia runnereita yrityksesi käytäntöjen mukaisesti.
Nyt kun olet määritellyt vaatimuksesi, on aika arvioida nykyiset Jenkins-nodesi/agenttisi. Tarkista, voiko niitä hyödyntää uudelleen asentamalla GitLab Runnerin, vai onko aika poistaa ne käytöstä ja lähettää ne suureen Server Valhallaan, jossa kaikki eläkkeelle jääneet laitteistot saavat levätä rauhassa.
Vinkkejä Jenkinsfilestä GitLab CI yaml -tiedostoon siirtymiseen
Ennen kuin alat tehdä .gitlab-ci.yaml-tiedostoa, tutustu nykyisiin Jenkinsfileihisi tai freestyle-jobien konfiguraatioihin.
Ymmärrätkö todella, mitä ne tekevät? Jos et, suosittelen vahvasti hoitamaan teknisen velan ensin ja käyttämään tasker-työkalua.
sh '''
if ! command -v node &> /dev/null; then
curl -fsSL https://deb.nodesource.com/setup_${LTS}.x -o nodesource_setup.sh
bash nodesource_setup.sh
rm nodesource_setup.sh
apt-get install -y nodejs
else
node -v
fi
npm install -g grunt-cli
rm -rf node_modules && ||
npm cache clean --force && npm install -g npm@latest
npm -v
npm outdated --long
npm install
npm audit fix
npm ls --depth=0
npm cache verify
node -v
npm install --no-save eslint prettier jest
which node
which npm
npm ls -g --depth=0
'''
Tämä voidaan siis muuntaa esimerkiksi muotoon sh 'npm run install-global-dependencies'
Seuraavaksi varsinaisiin vinkkeihin ja nikseihin. Monirivisille shell-/bash-skripteille voi olla päteviä syitä, jotka eivät kuitenkaan oikeuta sijoittamaan niitä tehtäväajuriin tai erilliseen skriptitiedostoon.
Monirivinen esimerkki Jenkinsistä
sh '''
# Luo Python-virtuaaliympäristö
python3 -m venv venv
# Aktivoi virtuaaliympäristö
source venv/bin/activate
# Asenna riippuvuudet requirements.txt-tiedostosta
pip install -r requirements.txt
# Suorita Python-skripti
python my_script.py
# Poista virtuaaliympäristö käytöstä
deactivate
'''
Eri vaiheiden artifactien käyttö
Jenkinsfilessä on pipeline-ajon build-binäärien ja muiden artifactien tallentamiseen stash- ja unstash-vaiheet. GitLabissa ei ole vastaavaa toimintoa, mutta siellä on artifacts-käsite.
Jenkinsfile-esimerkki:
stage('Build Python Project') {
steps {
script {
// Rakenna Python-projekti pdm:llä
sh '''
pdm build
'''
// Tallenna build-artifactit (esim. .whl- tai .tar.gz-tiedostot)
stash name: 'build-artifacts', includes: 'dist/*'
}
}
}
stage('Deploy Python Project') {
steps {
script {
// Palauta build-artifactit edellisestä vaiheesta
unstash 'build-artifacts'
// Install the built package from the dist folder
sh '''
pip install dist/*.whl
python -m my_module
'''
}
}
}
GitLab CI yaml -esimerkki:
build_python_project:
stage: build
script:
- pdm build # Rakenna Python-projekti
artifacts:
polut:
- dist/* # Store the built artifacts (e.g., .whl, .tar.gz)
expire_in: 1 tunti # Aseta artefaktien vanhenemisaika
deploy_python_project:
stage: deploy
dependencies:
- build_python_project # Tämä kertoo GitLab CI:lle, että se käyttää build-vaiheen artefakteja
script:
- pip install dist/*.whl # Asenna rakennettu wheel-paketti
- python -m my_module # Suorita Python-moduuli
Buildin jälkeiset toimet
Jenkinsissä buildin jälkeiset toimet ovat tehokkaita. Voit määritellä niitä lisävaiheilla, kuten always, failure ja cleanup. GitLabissa käytössäsi on vain after_script, jossa voi toki käyttää ehtoja. Yksi merkittävimmistä GitLab CI:ssä huomaamistani asioista on, että after_script-lohkolla ei voi epäonnistuttaa pipelinea. Jos siis haluat, että pipeline epäonnistuu esimerkiksi silloin, kun yksikkötestien läpäisyaste ei ole riittävän korkea, tämä on tehtävä script-lohkossa after_scriptin sijaan.
Jenkinsfile-esimerkki:
stage('Run JUnit Tests')
steps {
script {
sh 'mvn test'
}
}
post {
always {
junit '**/target/test-classes/*.xml'
}
}
}
GitLab CI YAML -esimerkki:
test:
stage: test
script:
- mvn test
after_script:
- |
if [ -f "target/test-classes/*.xml" ]; then
echo "JUnit-testitulokset löytyivät. Arkistoidaan..."
# Tallenna testitulokset GitLabin artifact-ominaisuudella
mv target/test-classes/*.xml /tmp/junit-test-results/
else
echo "JUnit-testituloksia ei löytynyt."
exit 1 # ei vaikuta pipelinen tilaan
fi
artifacts:
paths:
- /tmp/junit-test-results/*.xml
expire_in: 1 hour
Edellä on ollut muutama konkreettinen esimerkki tilanteista, joita saatat kohdata tehdessäsi 1:1-migraatiota Jenkinsfileista GitLab CI YAMLiin. Suosittelen lämpimästi ajamaan YAMLLintin paikallisesti .gitlab-ci.yml-tiedostolle ennen kuin työnnät sen etärepositorioon. Lisäksi tekoälytyökalut, kuten GitHub Copilot, voivat helpottaa raskainta työtä, kun perusymmärrys on hallussa.
Jenkins-lisäosat
”Entä Jenkins-lisäosat?” saatat kysyä. Niitä ei mainittu tai käytetty aiemmissa esimerkeissä, koska GitLab CI ei perustu lisäosiin. Ei enää lisäosien hallintaa tai ongelmia Maven-/Gradle-versioiden tai Java-riippuvuuksien kanssa!
Lisäosien ja jaettujen kirjastojen sijaan GitLab CI käyttää malleja! GitLab tarjoaa monia valmiita malleja, joita voit luoda ja jakaa koko organisaatiossasi.
Toinen vaihtoehto lisäosille on etsiä eri käyttötarkoituksiin sopivia CLI-työkaluja. JFrog tarjoaa esimerkiksi sekä Artifactory Jenkins -lisäosan että CLI-työkalun.
Sen sijaan, että loisit oman räätälöidyn työkalun, suosittelen ensin tarkistamaan, löytyykö sopiva valmis työkalu jo valmiiksi.
Yhteenveto
Ennen varsinaisen työn aloittamista kannattaa käyttää aikaa suunnitteluun. Esitä itsellesi ja pipelinea käyttävälle tiimillesi seuraavat kysymykset:
Tuottaako nykyinen pipeline tarvitsemamme lopputuloksen?
Tuoko nykyinen pipeline meille arvoa?
Mikä nykyisessä pipelinessa on ärsyttävintä?
Työkalujen vaihtaminen on kuin aloittaisi tyhjältä kankaalta, joten tilanteeseen kannattaa suhtautua harkiten.
Kun pipelinen tavoitteet ja hyväksyjät on määritelty, vertaa niitä vanhan järjestelmän vaatimuksiin. Aloita sitten varsinainen työ. Käytä myös aikaa GitLab CI/CD:hen tutustumiseen – selvitä, mitä ominaisuuksia on saatavilla ja mistä ne löytyvät. Verkkokäyttöliittymä on melko erilainen kuin Jenkinsissä, joten suosittelen osallistumaan koulutukseen tai ainakin katsomaan esimerkkivideoita.
Jos tarvitset apua tehtävässä, ota rohkeasti yhteyttä!
- GitLab
- CI/CD
- Software development
Subscribe to our newsletter
Related blogs