Agar sizga turli xil muhitlar kerak bo'lsa, Jenkinsdagi loyihalarni qanday yig'ish kerak

Agar sizga turli xil muhitlar kerak bo'lsa, Jenkinsdagi loyihalarni qanday yig'ish kerak

HabrΓ©-da Jenkins haqida ko'plab maqolalar mavjud, ammo Jenkins va doker agentlari qanday ishlashiga misollar kam. Barcha mashhur loyihalarni yaratish vositalari kabi Drone.io, Bitbuket quvur liniyasi, GitLab, GitHub harakatlari va boshqalar, hamma narsani konteynerlarda to'plashi mumkin. Ammo Jenkins haqida nima deyish mumkin?

Bugun muammoning yechimi bor: Jenkins 2 u bilan ishlashda ajoyib Docker agentlari. Ushbu maqolada men o'z tajribamni baham ko'rmoqchiman va buni o'zingiz qanday qilishingiz mumkinligini ko'rsatmoqchiman.

Nega men bu muammoni hal qila boshladim?

Biz kompaniyada bo'lganimiz uchun Citronium Biz juda ko'p turli xil texnologiyalardan foydalanganimiz uchun yig'ish mashinasida Node.JS, Gradle, Ruby, JDK va boshqalarning turli versiyalarini saqlashimiz kerak. Lekin ko'pincha versiya ziddiyatlaridan qochib bo'lmaydi. Ha, agar siz nvm, rvm kabi turli xil versiya menejerlari borligini aytsangiz, to'g'ri bo'lasiz, ammo ular bilan hamma narsa unchalik silliq emas va bu echimlarda muammolar mavjud:

  • ishlab chiquvchilar tozalashni unutadigan katta hajmdagi ish vaqti;
  • bir xil ish vaqtlarining turli versiyalari o'rtasida ziddiyatlar mavjud;
  • Har bir ishlab chiquvchiga turli xil komponentlar to'plami kerak.

Boshqa muammolar ham bor, lekin yechimi haqida aytib beraman.

Dockerdagi Jenkins

Docker hozirda rivojlanish dunyosida yaxshi o'rnatilganligi sababli, Docker yordamida deyarli hamma narsani ishlatish mumkin. Mening yechimim - Jenkins-ning Docker-da bo'lishi va boshqa Docker konteynerlarini ishga tushirish. Bu savol 2013 yilda "" maqolasida berila boshlandi.Docker endi Docker ichida ishlashi mumkin".

Muxtasar qilib aytganda, siz Docker-ning o'zini ishlaydigan konteynerga o'rnatishingiz va faylni o'rnatishingiz kerak /var/run/docker.sock.

Jenkins uchun yaratilgan Dockerfile misoli.

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

Shunday qilib, biz asosiy kompyuterda Docker buyruqlarini bajara oladigan Docker konteyneriga ega bo'ldik.

Qurilish sozlamalari

Yaqinda Jenkins o'z qoidalarini ishlatib tasvirlash imkoniyatiga ega bo'ldi quvuri sintaksis, bu qurilish skriptini o'zgartirishni va uni omborda saqlashni juda oson qiladi.

Shunday qilib, keling, omborning o'ziga maxsus Dockerfile qo'yaylik, unda qurish uchun zarur bo'lgan barcha kutubxonalar mavjud. Shunday qilib, ishlab chiquvchining o'zi takrorlanadigan muhitni tayyorlashi mumkin va OPSdan xostga Node.JS ning ma'lum bir versiyasini o'rnatishni so'rashi shart emas.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Ushbu qurilish tasviri ko'pchilik Node.JS ilovalari uchun mos keladi. Masalan, sizga Sonar skaneri o'rnatilgan JVM loyihasi uchun rasm kerak bo'lsa-chi? Yig'ish uchun kerakli komponentlarni tanlashda erkinsiz.

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/

Biz yig'ilish muhitini tasvirlab berdik, ammo Jenkinsning bunga nima aloqasi bor? Va Jenkins agentlari bunday Docker tasvirlari bilan ishlashi va ularni ichkarida qurishi mumkin.

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

Direktiv agent mulkdan foydalanadi dockerqaerda belgilashingiz mumkin:

  • nomlash siyosatiga muvofiq yig'ish konteynerining nomi;
  • argumentlar qurilish konteynerini ishga tushirish uchun kerak bo'ladi, bu erda bizning holatlarimizda biz joriy katalogni konteyner ichidagi katalog sifatida o'rnatamiz.

Qurilish bosqichlarida biz Docker qurish agentida qaysi buyruqlar bajarilishini ko'rsatamiz. Bu hamma narsa bo'lishi mumkin, shuning uchun men ansible yordamida ilovalarni joylashtirishni ham ishga tushiraman.

Quyida oddiy Node.JS ilovasi yaratishi mumkin bo'lgan umumiy Jenkinsfaylni ko'rsatmoqchiman.

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

}

Nima bo'ldi?

Ushbu usul tufayli biz quyidagi muammolarni hal qildik:

  • atrof-muhitni yig'ish konfiguratsiya vaqti har bir loyiha uchun 10 - 15 daqiqaga qisqartiriladi;
  • butunlay takrorlanadigan ilovalar yaratish muhiti, chunki uni mahalliy kompyuteringizda shu tarzda yaratishingiz mumkin;
  • yig'ish vositalarining turli versiyalari o'rtasidagi ziddiyatlar bilan bog'liq muammolar yo'q;
  • har doim tiqilib qolmaydigan toza ish joyi.

Yechimning o'zi oddiy va ravshan va sizga ba'zi afzalliklarni olish imkonini beradi. Ha, yig'ilishlar uchun oddiy buyruqlar bilan solishtirganda kirish chegarasi biroz ko'tarildi, ammo endi u har doim qurilishi va ishlab chiquvchining o'zi qurish jarayoni uchun zarur bo'lgan hamma narsani tanlashi mumkinligiga kafolat bor.

Men to'plagan rasmdan ham foydalanishingiz mumkin Jenkins + Docker. Barcha manbalar ochiq va manzilda joylashgan rmuhamedgaliev/jenkins_docker.

Ushbu maqolani yozish paytida plagin yordamida asosiy tugunni yuklamaslik uchun uzoq serverlarda agentlardan foydalanish haqida munozaralar paydo bo'ldi. docker plagini. Ammo men bu haqda kelajakda gaplashaman.

Manba: www.habr.com

a Izoh qo'shish