Habresta on monia artikkeleita Jenkinsistä, mutta harvat kuvaavat esimerkkejä Jenkinsin ja telakointiagenttien työstä. Kaikki suositut projektinrakennustyökalut, kuten
Nykyään ongelmaan on ratkaisu: Jenkins 2 on loistava työskentelyyn
Miksi aloin ratkaisemaan tätä ongelmaa?
Koska olemme seurassa
- suuri määrä ajonaikaa, jonka kehittäjät unohtavat puhdistaa;
- on ristiriitoja saman suoritusajan eri versioiden välillä;
- Jokainen kehittäjä tarvitsee erilaisia komponentteja.
On muitakin ongelmia, mutta kerron teille ratkaisusta.
Jenkins Dockerissa
Koska Docker on nyt vakiintunut kehitysmaailmassa, melkein mitä tahansa voidaan ajaa Dockerin avulla. Ratkaisuni on, että Jenkins on Dockerissa ja pystyn käyttämään muita Docker-säiliöitä. Tätä kysymystä alettiin kysyä vuonna 2013 artikkelissa "
Lyhyesti sanottuna sinun tarvitsee vain asentaa itse Docker toimivaan säiliöön ja liittää tiedosto /var/run/docker.sock
.
Tässä on esimerkki Dockerfile-tiedostosta, joka osoittautui Jenkinsille.
FROM jenkins/jenkins:lts
USER root
RUN apt-get update &&
apt-get -y install apt-transport-https
ca-certificates
curl
gnupg2
git
software-properties-common &&
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey &&
add-apt-repository
"deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")
$(lsb_release -cs)
stable" &&
apt-get update &&
apt-get -y install docker-ce &&
usermod -aG docker jenkins
RUN curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose
RUN apt-get clean autoclean && apt-get autoremove —yes && rm -rf /var/lib/{apt,dpkg,cache,log}/
USER jenkins
Näin ollen meillä on Docker-säilö, joka voi suorittaa Docker-komentoja isäntäkoneella.
Rakenna asetukset
Ei kauan sitten Jenkins sai tilaisuuden kuvailla sääntöjään käyttäen
Laitetaan siis erityinen Dockerfile itse arkistoon, joka sisältää kaikki rakentamiseen tarvittavat kirjastot. Tällä tavalla kehittäjä voi itse valmistella toistettavan ympäristön, eikä hänen tarvitse pyytää OPS:a asentamaan tiettyä Node.JS-versiota isäntään.
FROM node:12.10.0-alpine
RUN npm install yarn -g
Tämä koontiotos sopii useimpiin Node.JS-sovelluksiin. Entä jos esimerkiksi tarvitset kuvan JVM-projektiin, jossa on Sonar-skanneri? Voit vapaasti valita kokoonpanoon tarvitsemasi komponentit.
FROM adoptopenjdk/openjdk12:latest
RUN apt update
&& apt install -y
bash unzip wget
RUN mkdir -p /usr/local/sonarscanner
&& cd /usr/local/sonarscanner
&& wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.3.0.1492-linux.zip
&& unzip sonar-scanner-cli-3.3.0.1492-linux.zip
&& mv sonar-scanner-3.3.0.1492-linux/* ./
&& rm sonar-scanner-cli-3.3.0.1492-linux.zip
&& rm -rf sonar-scanner-3.3.0.1492-linux
&& ln -s /usr/local/sonarscanner/bin/sonar-scanner /usr/local/bin/sonar-scanner
ENV PATH $PATH:/usr/local/sonarscanner/bin/
ENV SONAR_RUNNER_HOME /usr/local/sonarscanner/bin/
Kuvailimme kokoonpanoympäristöä, mutta mitä tekemistä Jenkinsillä on sen kanssa? Ja Jenkinsin agentit voivat työskennellä tällaisten Docker-kuvien kanssa ja rakentaa niitä sisäisesti.
stage("Build project") {
agent {
docker {
image "project-build:${DOCKER_IMAGE_BRANCH}"
args "-v ${PWD}:/usr/src/app -w /usr/src/app"
reuseNode true
label "build-image"
}
}
steps {
sh "yarn"
sh "yarn build"
}
}
Direktiivi agent
käyttää omaisuutta docker
missä voit määrittää:
- kokoonpanosäiliön nimi nimeämiskäytäntösi mukaisesti;
- argumentit, joita tarvitaan rakennussäilön suorittamiseen, missä tapauksessamme liitämme nykyisen hakemiston hakemistoksi säilön sisällä.
Ja jo rakennusvaiheissa osoitamme, mitkä komennot suoritetaan Docker-rakennusagentin sisällä. Tämä voi olla mikä tahansa, joten käynnistän myös sovellusten käyttöönoton ansiblen avulla.
Alla haluan näyttää yleisen Jenkins-tiedoston, jonka yksinkertainen Node.JS-sovellus voi rakentaa.
def DOCKER_IMAGE_BRANCH = ""
def GIT_COMMIT_HASH = ""
pipeline {
options {
buildDiscarder(
logRotator(
artifactDaysToKeepStr: "",
artifactNumToKeepStr: "",
daysToKeepStr: "",
numToKeepStr: "10"
)
)
disableConcurrentBuilds()
}
agent any
stages {
stage("Prepare build image") {
steps {
sh "docker build -f Dockerfile.build . -t project-build:${DOCKER_IMAGE_BRANCH}"
}
}
stage("Build project") {
agent {
docker {
image "project-build:${DOCKER_IMAGE_BRANCH}"
args "-v ${PWD}:/usr/src/app -w /usr/src/app"
reuseNode true
label "build-image"
}
}
steps {
sh "yarn"
sh "yarn build"
}
}
post {
always {
step([$class: "WsCleanup"])
cleanWs()
}
}
}
Mitä tapahtui?
Tämän menetelmän ansiosta ratkaisimme seuraavat ongelmat:
- ympäristökokoonpanon konfigurointiaika pienenee 10 - 15 minuuttiin projektia kohti;
- täysin toistettavissa oleva sovellusrakennusympäristö, koska voit rakentaa sen tällä tavalla paikallisella tietokoneellasi;
- kokoonpanotyökalujen eri versioiden välisissä ristiriidoissa ei ole ongelmia;
- aina puhdas työtila, joka ei tukkeudu.
Ratkaisu itsessään on yksinkertainen ja ilmeinen, ja sen avulla voit saada joitain etuja. Kyllä, sisääntulokynnys on noussut hieman verrattuna kokoonpanojen yksinkertaisiin komentoihin, mutta nyt on takuu, että se rakennetaan aina ja kehittäjä voi itse valita kaiken, mitä hänen rakennusprosessiinsa tarvitsee.
Voit myös käyttää keräämääni kuvaa
Tätä artikkelia kirjoitettaessa heräsi keskustelu agenttien käytöstä etäpalvelimilla, jotta pääsolmua ei ladata laajennuksen avulla
Lähde: will.com