Kā apkopot projektus Dženkinsā, ja jums ir nepieciešamas daudzas dažādas vides

Kā apkopot projektus Dženkinsā, ja jums ir nepieciešamas daudzas dažādas vides

Habr vietnē ir daudz rakstu par Jenkins, taču tikai daži apraksta Jenkins un Docker aģentu darbības piemēru. Visi populāri projektu veidošanas rīki, piemēram, Drone.io, Bitbucket cauruļvads, GitLab, GitHub darbības un citi var visu būvēt konteineros. Bet kā ar Dženkinsu?

Šodien problēmai ir risinājums: Jenkins 2 lieliski darbojas ar Docker aģentiŠajā rakstā vēlos dalīties savā pieredzē un parādīt, kā to var izdarīt pašam.

Kāpēc es sāku risināt šo problēmu?

Tā kā mēs esam uzņēmumā Citronijs Tā kā mēs izmantojam dažādas tehnoloģijas, mums būvēšanas datorā ir jāuztur dažādas Node.JS, Gradle, Ruby, JDK un citu versijas. Taču versiju konflikti bieži vien ir neizbēgami. Lai gan jums varētu būt taisnība, sakot, ka pastāv dažādi versiju pārvaldnieki, piemēram, nvm un rvm, tie ne vienmēr ir tik vienkārši, un šiem risinājumiem ir savas problēmas:

  • liels apjoms izpildlaiku, ko izstrādātāji aizmirst sakopt;
  • pastāv konflikti starp dažādām viena un tā paša izpildlaika versijām;
  • Katram izstrādātājam ir nepieciešams atšķirīgs komponentu komplekts.

Ir arī citas problēmas, bet ļaujiet man pastāstīt par risinājumu.

Dženkinss Dokerā

Tā kā Docker tagad ir labi nostiprinājies izstrādātāju pasaulē, gandrīz visu var palaist, izmantojot Docker. Mans risinājums ir iekļaut Jenkins Docker un spēt palaist citus Docker konteinerus. Šis jautājums pirmo reizi tika aplūkots 2013. gada rakstā "Docker tagad var darboties Docker ietvaros".

Īsāk sakot, jums vienkārši jāinstalē pats Docker darba konteinerā un jāpievieno fails. /var/run/docker.sock.

Šeit ir Dockerfile piemērs, kas tika iegūts Jenkins.

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

Tādējādi mēs ieguvām Docker konteineru, kas var izpildīt Docker komandas resursdatora datorā.

Būvēšanas iestatīšana

Ne tik sen Dženkinss ieguva spēju aprakstīt savus noteikumus, izmantojot Cauruļvads sintakse, kas atvieglo būvēšanas skripta maiņu un saglabāšanu repozitorijā.

Tātad, ievietosim pašā repozitorijā īpašu Dockerfile failu, kurā būs visas veidošanai nepieciešamās bibliotēkas. Tādā veidā izstrādātājs var sagatavot atkārtojamu vidi, nelūdzot OPS instalēt konkrētu Node.JS versiju resursdatorā.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Šis būvējuma attēls ir piemērots lielākajai daļai Node.JS lietojumprogrammu. Bet ko darīt, ja, piemēram, projektam ir nepieciešams JVM attēls ar integrētu Sonar skeneri? Jūs varat brīvi izvēlēties būvējumam nepieciešamās komponentes.

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/

Mēs esam aprakstījuši būvēšanas vidi, bet kāda tam ir saistība ar Jenkins? Jenkins aģenti var strādāt ar šiem Docker attēliem un veidot tajos.

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"
    }
}

Direktīva agent izmanto īpašumu docker, kur varat norādīt:

  • montāžas konteinera nosaukums saskaņā ar jūsu nosaukumu piešķiršanas politiku;
  • argumenti, kas nepieciešami būvēšanas konteinera palaišanai, kur mūsu gadījumā mēs pievienojam pašreizējo direktoriju kā direktoriju konteinera iekšpusē.

Un būvēšanas soļos mēs norādām, kuras komandas palaist Docker būvēšanas aģentā. Tas var būt jebkas, tāpēc es arī vadu lietojumprogrammu izvietošanu, izmantojot Ansible.

Zemāk es vēlos parādīt vispārīgu Jenkinsfile, kas var izveidot vienkāršu Node.JS lietojumprogrammu.

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()
        }
    }

}

Tātad, kas notika?

Izmantojot šo metodi, mēs atrisinājām šādas problēmas:

  • būvēšanas vides konfigurēšanas laiks tiek samazināts līdz 10–15 minūtēm katram projektam;
  • pilnībā atkārtojama lietojumprogrammu veidošanas vide, jo to var veidot arī lokālā datorā;
  • nav problēmu ar konfliktiem starp dažādām būvēšanas rīku versijām;
  • vienmēr tīra darba vieta, kurā nav nekārtības.

Pats risinājums ir vienkāršs un acīmredzams, un tas piedāvā tikai priekšrocības. Jā, ienākšanas barjera ir nedaudz augstāka nekā ar vienkāršām būvēšanas komandām, taču tagad ir garantija, ka būvēšana vienmēr darbosies, un izstrādātājs var izvēlēties visu nepieciešamo savam būvēšanas procesam.

Varat arī izmantot attēlu, ko esmu apkopojis. Dženkinss + DokersVisi avoti ir atvērti un atrodas vietnē rmuhamedgaliev/jenkins_docker.

Rakstot šo rakstu, tika apspriesta aģentu izmantošana attālos serveros, lai izvairītos no galvenā mezgla ielādes ar spraudni. docker-pluginBet par šo es jums pastāstīšu nākotnē.

Avots: www.habr.com

Iegādājieties uzticamu mitināšanu vietnēm ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa vietņu mitināšanu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster