Kuinka kerätä projekteja Jenkinsissä, jos tarvitset monia erilaisia ​​ympäristöjä

Kuinka kerätä projekteja Jenkinsissä, jos tarvitset monia erilaisia ​​ympäristöjä

Habresta on monia artikkeleita Jenkinsistä, mutta harvat kuvaavat esimerkkejä Jenkinsin ja telakointiagenttien työstä. Kaikki suositut projektinrakennustyökalut, kuten Drone.io, Bitbucket Pipeline, GitLab, GitHub-toiminnot ja muut, voivat kerätä kaiken säiliöihin. Mutta entä Jenkins?

Nykyään ongelmaan on ratkaisu: Jenkins 2 on loistava työskentelyyn Docker-agentit. Tässä artikkelissa haluan jakaa kokemukseni ja näyttää, kuinka voit tehdä sen itse.

Miksi aloin ratkaisemaan tätä ongelmaa?

Koska olemme seurassa Sitronium Koska käytämme monia eri tekniikoita, meidän on säilytettävä eri versioita Node.JS:stä, Gradlesta, Rubysta, JDK:sta ja muista kokoonpanokoneesta. Mutta usein versioristiriitoja ei voida välttää. Kyllä, olet oikeassa, jos sanot, että on olemassa erilaisia ​​versionhallintaohjelmia, kuten nvm, rvm, mutta kaikki ei ole niin sujuvaa niiden kanssa ja näissä ratkaisuissa on ongelmia:

  • 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 "Docker voi nyt toimia Dockerissa".

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 Putki syntaksi, jonka avulla on melko helppoa muuttaa rakennuskomentosarja ja tallentaa se arkistoon.

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 dockermissä 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 Jenkins + Docker. Kaikki lähteet ovat avoimia ja sijaitsevat osoitteessa rmuhamedgaliev/jenkins_docker.

Tätä artikkelia kirjoitettaessa heräsi keskustelu agenttien käytöstä etäpalvelimilla, jotta pääsolmua ei ladata laajennuksen avulla Docker-laajennus. Mutta puhun tästä jatkossa.

Lähde: will.com

Lisää kommentti