Jenkins'te, birden fazla farklı ortam gerekiyorsa projeleri nasıl derlenir

Jenkins'te, birden fazla farklı ortam gerekiyorsa projeleri nasıl derlenir

Habr'da Jenkins hakkında birçok makale var, ancak Jenkins ve Docker ajanlarının çalışma örneği pek az yerde açıklanıyor. Proje derleme araçları olan bütün popüler araçlar gibi Drone.io, Bitbucket Pipeline, GitLab, GitHub actions ve diğerleri, her şeyi konteynerlerde derleyebilir. Peki Jenkins ne durumda?

Günümüzde bu sorunun bir çözümü mevcut: Jenkins 2, Docker ajanlarıylaharika bir şekilde çalışabiliyor. Bu yazıda deneyimlerimi paylaşmak ve bunu nasıl kendi başınıza yapabileceğinizi göstermek istiyorum.

Neden bu sorunu çözmeyi üstlendim?

Şirketimizde, Citronium birçok farklı teknoloji kullandığımız için, derleme makinesinde birçok Node.JS, Gradle, Ruby, JDK ve diğerlerinin farklı sürümlerini bulundurmak zorundayız. Ancak çoğu zaman sürüm çatışmalarından kaçınmak mümkün olmuyor. Evet, nvm, rvm gibi çeşitli sürüm yöneticilerinin olduğunu söylerseniz haklısınız, ama bunlarla ilgili işler o kadar da kolay değil ve bu çözümlerin bazı sorunları var:

  • geliştiricilerin temizlemeyi unuttukları büyük bir runtime hacmi;
  • birbirine ait farklı runtime sürümleri arasında çatışmalar mevcut;
  • her geliştiricinin farklı bir bileşen setine ihtiyacı var.

Başka sorunlar da var ama en iyisi çözümden bahsedelim.

Docker içinde Jenkins

Docker şimdi geliştirme alanında iyi bir şekilde yerleştiği için, neredeyse her şey Docker yardımıyla çalıştırılabiliyor. Benim çözümüm ise Jenkins'in Docker içinde olması ve başka Docker konteynerlerini çalıştırabilmesidir. Bu konu 2013 yılında "Docker can now run within Docker«.

başlıklı makalede sorulmaya başlanmıştı. Kısaca, çalışma konteynerine Docker'ı kurmak ve bir dosyayı bağlamak gerekiyor. /var/run/docker.sock.

İşte Jenkins için elde edilen bir Dockerfile örneği.

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

Böylece Docker komutlarını ana makinede çalıştırabilen bir Docker konteynerine sahip olduk.

Derleme ayarları

Yakın zamanda Jenkins, kurallarını Pipeline sözdizimiyle tanımlama yeteneği kazandı ve bu da derleme scriptini değiştirmeyi ve onu bir depoda saklamayı oldukça kolay hale getiriyor.

O halde, derleme için gerekli tüm kütüphaneleri içeren özel bir Dockerfile'ı doğrudan depoya koyalım. Bu sayede geliştirici tekrar edilebilir bir ortam hazırlayabilir ve OPS'ten ana makineye belirli bir Node.JS sürümünü kurmasını istemez.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Bu aracı görüntü, əksər Node.JS tətbiqləri üçün uyğundur. Məsələn, daxilində Sonar skaneri olan bir JVM layihəsi üçün görüntü lazımdırsa, özünüz lazım olan komponentləri seçə bilərsiniz.

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 qurma mühitini təsvir etdik, amma Jenkins burada necədir? Jenkins agentləri bu cür Docker görüntüləri ilə işləyə bilir və daxilində qurma həyata keçirir.

stage("Layihəni qur") {
    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 özəlliyindən istifadə edir docker, burada siz göstərə bilərsiniz:

  • yeni adlandırma siyasətinizə uyğun qurma konteynerinin adı;
  • lazım olan qurma konteynerini işə salmaq üçün lazım olan arqumentlər, burada olduğumuz vəziyyətdə hazırki dərci konteynerin içərisinə montaj edirik.

Qurma addımlarında, qurma Docker agentinin daxilində hansı komutların yerinə yetiriləcəyini göstəririk. Bu hər şey ola bilər, bu şəkildə ansible ilə tətbiqlərin yerləşdirilməsini də həyata keçirirəm.

Aşağıda sadə bir Node.JS tətbiqini qura biləcək ümumi bir Jenkinsfile göstərmək istəyirəm.

def DOCKER_IMAGE_BRANCH = ""
def GIT_COMMIT_HASH = ""

pipeline { 
    options {
        buildDiscarder(
            logRotator(
                artifactDaysToKeepStr: "",
                artifactNumToKeepStr: "",
                daysToKeepStr: "",
                numToKeepStr: "10"
            )
        )
        disableConcurrentBuilds()
    }

    agent any

    stages {

        stage("Yaradın qurma görüntüsünü") {
            steps {
                sh "docker build -f Dockerfile.build . -t project-build:${DOCKER_IMAGE_BRANCH}"
            }
        }

        stage("Layihəni qur") {
            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()
        }
    }

}

Nəticə nə oldu?

Bu üsul sayəsində aşağıdakı problemləri həll etdik:

  • qurma mühitinin konfiqurasiyası, layihəyə 10-15 dəqiqədir;
  • tamamilə təkrarlana bilən tətbiq qurma mühiti, çünki bunu yerli kompüterdə də qura bilərik;
  • fərqli versiya qurma alətləri ilə münaqişə problemi yoxdur;
  • həmişə təmiz bir iş sahəsi var, bu da dolmur.

Həmin qərar sadə və aydındır və yalnız müsbət nəticələr əldə etməyə imkan tanıyır. Bəli, giriş həddi bir az qalxdı, ancaq indi hər zaman toplanmasının təminatı var və proqramçı öz yığım prosesi üçün lazım olan hər şeyi seçə bilər.

Eyni zamanda, mənim topladığım imkandan da istifadə edə bilərsiniz. Jenkins + Docker. Bütün mənbələr açıqdır və burada yerləşir rmuhamedgaliev/jenkins_docker.

Məqaləni yazarkən, master nodunu yükləməmək üçün uzaq serverlərdə agentlərin istifadəsi barədə müzakirə yarandı, docker-plugin. Ancaq bunu gələcəkdə izah edəcəyəm.

Mənbə: habr.com

DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər 🔥 DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər | ProHoster