Birçok farklı ortama ihtiyacınız varsa Jenkins'te projeler nasıl toplanır?

Birçok farklı ortama ihtiyacınız varsa Jenkins'te projeler nasıl toplanır?

Habré'de Jenkins hakkında pek çok makale var, ancak çok azı Jenkins ve liman işçisi temsilcilerinin nasıl çalıştığına dair örnekleri açıklıyor. Gibi tüm popüler proje oluşturma araçları Drone.io, Bitbucket Boru Hattı, GitLab, GitHub eylemleri ve diğerleri her şeyi kaplarda toplayabilir. Peki ya Jenkins?

Bugün bu sorunun bir çözümü var: Jenkins 2, Liman işçisi aracıları. Bu yazıda deneyimlerimi paylaşmak ve bunu kendi başınıza nasıl yapabileceğinizi göstermek istiyorum.

Neden bu sorunu çözmeye başladım?

Şirkette olduğumuz için Sitronyum Birçok farklı teknoloji kullandığımız için Node.JS, Gradle, Ruby, JDK ve diğerlerinin farklı sürümlerini montaj makinesinde tutmamız gerekiyor. Ancak çoğu zaman sürüm çakışmalarından kaçınılamaz. Evet nvm, rvm gibi çeşitli versiyon yöneticileri var diyorsanız haklısınız ama onlarda her şey o kadar düzgün değil ve bu çözümlerin sorunları var:

  • geliştiricilerin temizlemeyi unuttuğu büyük miktarda çalışma zamanı;
  • aynı çalışma zamanlarının farklı sürümleri arasında çakışmalar var;
  • Her geliştiricinin farklı bileşenlere ihtiyacı vardır.

Başka sorunlar da var ama çözümünü anlatayım.

Docker'da Jenkins

Docker artık geliştirme dünyasında iyice yerleşmiş olduğundan neredeyse her şey Docker kullanılarak çalıştırılabilir. Benim çözümüm Jenkins'in Docker'da olması ve diğer Docker konteynerlerini çalıştırabilmesidir. Bu soru 2013 yılında “Docker artık Docker'ın içinde çalışabiliyor".

Kısacası, Docker'ın kendisini çalışan bir konteynere kurmanız ve dosyayı bağlamanız yeterlidir. /var/run/docker.sock.

İşte Jenkins için ortaya çıkan örnek bir Dockerfile.

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 ana makinede Docker komutlarını yürütebilecek bir Docker konteynerimiz oldu.

Derleme kurulumu

Kısa bir süre önce Jenkins, kurallarını kullanarak açıklama fırsatı buldu. Boru Hattı sözdizimi, derleme komut dosyasını değiştirmeyi ve depoda saklamayı oldukça kolaylaştırır.

Öyleyse, deponun kendisine, derleme için gerekli tüm kütüphaneleri içerecek özel bir Docker dosyası koyalım. Bu şekilde geliştiricinin kendisi tekrarlanabilir bir ortam hazırlayabilir ve OPS'den ana bilgisayara Node.JS'nin belirli bir sürümünü yüklemesini istemek zorunda kalmaz.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Bu yapı görüntüsü çoğu Node.JS uygulaması için uygundur. Örneğin, içinde Sonar tarayıcı bulunan bir JVM projesi için bir görüntüye ihtiyacınız varsa ne olur? Montaj için ihtiyacınız olan bileşenleri seçmekte özgürsünüz.

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/

Montaj ortamını anlattık ama Jenkins'in bununla ne alakası var? Jenkins aracıları bu tür Docker görüntüleriyle çalışabilir ve bunları dahili olarak oluşturabilir.

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

yönerge agent özelliği kullanır dockerburada belirtebilirsiniz:

  • adlandırma politikanıza göre montaj konteynerinin adı;
  • derleme konteynerini çalıştırmak için gerekli argümanlar; bizim durumumuzda mevcut dizini konteynerin içindeki bir dizin olarak monte ediyoruz.

Ve zaten derleme adımlarında Docker derleme aracısında hangi komutların yürütüleceğini belirtiyoruz. Bu herhangi bir şey olabilir, bu yüzden uygulama dağıtımını da ansible'ı kullanarak başlatıyorum.

Aşağıda basit bir Node.JS uygulamasının oluşturabileceği genel bir Jenkinsfile göstermek istiyorum.

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

}

Ne oldu?

Bu yöntem sayesinde aşağıdaki sorunları çözdük:

  • ortam montajı yapılandırma süresi proje başına 10 - 15 dakikaya düşürülür;
  • tamamen tekrarlanabilir bir uygulama oluşturma ortamı, çünkü bunu yerel bilgisayarınızda bu şekilde oluşturabilirsiniz;
  • montaj araçlarının farklı sürümleri arasındaki çatışmalarla ilgili herhangi bir sorun yoktur;
  • her zaman tıkanmayan temiz bir çalışma alanı.

Çözümün kendisi basit ve açıktır ve bazı avantajlar elde etmenizi sağlar. Evet, montajlar için basit komutlara kıyasla giriş eşiği biraz arttı, ancak artık her zaman inşa edileceğine ve geliştiricinin kendi inşa süreci için gerekli olan her şeyi seçebileceğine dair bir garanti var.

Topladığım görseli de kullanabilirsiniz Jenkins + Docker. Tüm kaynaklar açıktır ve şu adreste bulunmaktadır: rmuhamedgaliev/jenkins_docker.

Bu makaleyi yazarken, ana düğümün bir eklenti kullanarak yüklenmemesi için uzak sunucularda aracıların kullanılmasıyla ilgili bir tartışma ortaya çıktı. liman işçisi eklentisi. Ancak gelecekte bunun hakkında konuşacağım.

Kaynak: habr.com

DDoS korumalı siteler, VPS VDS sunucuları için güvenilir hosting satın alın 🔥 DDoS korumalı, güvenilir VPS ve VDS sunucu barındırma hizmeti satın alın | ProHoster