Jenkins

Allikas: Kuutõrvaja

Sissejuhatus

Jenkins on serveritarkvara, mis aitab automatiseerida erinevate tarkvaraprojektide ehitust ja paigaldust.

Jenkinsi peamine ülesanne on käivitada eeldefineeritud samme - nt tõmmata alla javas kirjutatud rakenduse algkood, ehitada sellest kokku jar fail ning kopeerida see õnnestumise korral rakendusserverisse. Aga sellega saab automatiseerida igasuguseid serverites tehtavaid töid.

Jenkinsi serveri paigaldus

Jenkinsi käivitamiseks tuleb tõmmata kodulehelt jenkins.war ning panna see käima

java -jar jenkins*.war

Misjärel peaks saama selle veebiliidesele üle http://localhost:8080/ aadressi ligi

Paigaldamine centosil võiks välja näha selline

yum -y install java-1.8.0-openjdk-devel
curl --silent --location http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo | sudo tee /etc/yum.repos.d/jenkins.repo
rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
yum -y install jenkins git
systemctl start jenkins
systemctl enable jenkins

Workeri lisamine

Vaikimisi käivitab Jenkins kõiki töid enda sees. Vahel on vaja aga koormust hajutada või käivitada töid eraldi VM-is. Jenkinsi puhul workeri lisamiseks tuleb lisada ssh plugin. Siis genereerida ssh-keygeniga salajane võti. Tekitada jenkinsisse credential ning panna see sinna. Siis lisada workerile sobivale kasuajale avalik võti ning kõige viimasena paigaldada java ning muud vajalikud komponendid. Workeris käivitab siis jenkins omakorda agendi mille läbi ta jälgib seda ning käivitab erinevaid töid.

Esimene projekt

Luues freestyle projekti, saab avanevas veebivormis määrata giti allika kust jenkins koodi tirib, lisada build käsud või skripti, mis koodi peale allatõmbamist valmis ehitab ja paar käsku-skripti mis valmis rakendust peale seda testib ja rakendusserverisse uploadib. Nende sammude juures saab seejuures kasutada ka muutujaid ning luua valikmenüüsid kust võimalik eri parameetreid või prod-test keskkondi vahetada

Näiteprojekt milles esmalt seadistatud muutuja kus versiooninumber

Jenkis job esimene.jpg

Seejätel giti url

Jenkis job teine.jpg

Siis koodi valmis ehitamine. Nagu näha ei pea kõiki ehituseks vajalikke pakke otse jenkinsi serverisse paigaldama vaid on võimalik kasutada ka dockerit, näiteks soovides ehitada maveni abil pakki

docker run --rm -v $PWD:/root -w /root maven mvn package

Või kasutades gradlet tekitada jar fail

docker run --rm \
  -v "$PWD":/home/gradle/project \
  -u root \
  -e HOME=. \
  -w /home/gradle/project \
  gradle \
  gradle bootJar --info

Jenkis job kolmas.jpg

Ehituse tulemusena tekkinud faili arhiveerimine

Jenkis job neljas.jpg

Keerukamad kasutamisnäited

Valides This project is parameterized saab lisada projektidele ka erinevaid muutujaid

Ssh käsu käivitamist saab lihtsustada läbi muutujate kasutamise

ssh_command="ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null test@server.ee"
$ssh_command "cd /srv && wget -c https://repo1.maven.org/maven2/org/opentripplanner/otp/1.3.0/otp-1.3.0-shaded.jar"

Failide kopeerimine peale õnnestunud ehitust

scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null build/*.jar kasutaja@server:/srv

Et anda mingit muutujat ühelt töölt teistele edasi tuleb paigaldada plugin “Parameterized Trigger Plugin”.

Nüüd saab post-build actioni juures defineerida trigger parameterized build on other projects ning seal defineerida muutujaid stiilis

muutuja=väärtus

või siis eelnevalt sisestatud string parameetreid

git_refspec=${git_refspec}

Jenkins käivitab shelli käske /bin/sh abil mitte bashiga, mistõttu vaja keerukamate käskude algusse panna #!/bin/bash

Üldiselt on hea mõte tekitada tööde juurde $git_refspec nimeline muutuja mis sisaldab endas branchi versiooni numbrit. Seadistad saab selle

*/$git_refspec 

Kui tahtmine aga branchi asemel kasutada tagi tuleb kirjutada

refs/tags/$git_refspec

Jenkinsi varundamine

Kuna Jenkinsi tööd ja konfiguratsioon kujutavad endast väikesemahulisi tekstifaile võib varundada neid otse giti nt järgmise tööga

git checkout master && git pull origin master

# Export configs
for file in config.xml; do
  cp "$JENKINS_HOME/$file" "$file"
done


ls "$JENKINS_HOME/jobs" | while read dir; do
  dir="jobs/$dir"
  file="$dir/config.xml"
  if [ -f "$JENKINS_HOME/$file" ]; then
    [ -d "$dir" ] || mkdir -p "$dir"
    cp "$JENKINS_HOME/$file" "$file"
  fi
done

# Save changes
git status --short
git status --short | egrep "(??| M) " && git add .

git status --short | egrep "^(A|D|M|R) " && git commit --all --message="Automatic config backup ($BUILD_TAG)"
git log -1

git push -u origin master