Πώς να συλλέξετε έργα στο Jenkins εάν χρειάζεστε πολλά διαφορετικά περιβάλλοντα

Πώς να συλλέξετε έργα στο Jenkins εάν χρειάζεστε πολλά διαφορετικά περιβάλλοντα

Υπάρχουν πολλά άρθρα στο Habré σχετικά με τον Jenkins, αλλά λίγα περιγράφουν παραδείγματα για το πώς λειτουργούν οι Jenkins και οι πράκτορες docker. Όλα τα δημοφιλή εργαλεία κατασκευής έργων όπως Drone.io, Bitbucket Pipeline, GitLab, Ενέργειες GitHub και άλλοι, μπορούν να συλλέξουν τα πάντα σε δοχεία. Τι γίνεται όμως με τον Τζένκινς;

Σήμερα υπάρχει μια λύση στο πρόβλημα: Ο Jenkins 2 είναι εξαιρετικός στη συνεργασία Πράκτορες Docker. Σε αυτό το άρθρο θέλω να μοιραστώ την εμπειρία μου και να δείξω πώς μπορείτε να το κάνετε μόνοι σας.

Γιατί άρχισα να λύνω αυτό το πρόβλημα;

Αφού είμαστε παρέα Κιτρόνιο Επειδή χρησιμοποιούμε πολλές διαφορετικές τεχνολογίες, πρέπει να διατηρήσουμε διαφορετικές εκδόσεις των Node.JS, Gradle, Ruby, JDK και άλλων στη μηχανή συναρμολόγησης. Αλλά συχνά οι συγκρούσεις εκδόσεων δεν μπορούν να αποφευχθούν. Ναι, θα έχετε δίκιο αν πείτε ότι υπάρχουν διάφοροι διαχειριστές εκδόσεων όπως nvm, rvm, αλλά δεν είναι όλα τόσο ομαλά με αυτούς και αυτές οι λύσεις έχουν προβλήματα:

  • ένας μεγάλος χρόνος εκτέλεσης που οι προγραμματιστές ξεχνούν να καθαρίσουν.
  • Υπάρχουν συγκρούσεις μεταξύ διαφορετικών εκδόσεων των ίδιων χρόνων εκτέλεσης.
  • Κάθε προγραμματιστής χρειάζεται ένα διαφορετικό σύνολο στοιχείων.

Υπάρχουν άλλα προβλήματα, αλλά επιτρέψτε μου να σας πω για τη λύση.

Τζένκινς στο Ντόκερ

Δεδομένου ότι το Docker έχει πλέον εδραιωθεί στον κόσμο της ανάπτυξης, σχεδόν οτιδήποτε μπορεί να εκτελεστεί χρησιμοποιώντας το Docker. Η λύση μου είναι να έχω τον Jenkins στο Docker και να μπορώ να τρέχω άλλα κοντέινερ Docker. Αυτή η ερώτηση άρχισε να τίθεται το 2013 στο άρθρο "Το Docker μπορεί πλέον να τρέξει μέσα στο Docker".

Εν ολίγοις, χρειάζεται απλώς να εγκαταστήσετε το ίδιο το Docker σε ένα κοντέινερ που λειτουργεί και να προσαρτήσετε το αρχείο /var/run/docker.sock.

Εδώ είναι ένα παράδειγμα Dockerfile που αποδείχθηκε για τον 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

Έτσι, πήραμε ένα κοντέινερ Docker που μπορεί να εκτελέσει εντολές Docker στον κεντρικό υπολογιστή.

Ρύθμιση κατασκευής

Πριν από λίγο καιρό ο Jenkins είχε την ευκαιρία να περιγράψει τους κανόνες του χρησιμοποιώντας Pipeline σύνταξη, που καθιστά αρκετά εύκολη την αλλαγή του σεναρίου κατασκευής και την αποθήκευση του στο αποθετήριο.

Ας βάλουμε λοιπόν ένα ειδικό Dockerfile στο ίδιο το αποθετήριο, το οποίο θα περιέχει όλες τις απαραίτητες βιβλιοθήκες για την κατασκευή. Με αυτόν τον τρόπο, ο ίδιος ο προγραμματιστής μπορεί να προετοιμάσει ένα επαναλαμβανόμενο περιβάλλον και δεν θα χρειαστεί να ζητήσει από το OPS να εγκαταστήσει μια συγκεκριμένη έκδοση του Node.JS στον κεντρικό υπολογιστή.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Αυτή η εικόνα κατασκευής είναι κατάλληλη για τις περισσότερες εφαρμογές Node.JS. Τι γίνεται αν, για παράδειγμα, χρειάζεστε μια εικόνα για ένα έργο JVM με σαρωτή Sonar που περιλαμβάνεται μέσα; Είστε ελεύθεροι να επιλέξετε τα εξαρτήματα που χρειάζεστε για τη συναρμολόγηση.

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/

Περιγράψαμε το περιβάλλον συναρμολόγησης, αλλά τι σχέση έχει ο Jenkins; Και οι πράκτορες Jenkins μπορούν να εργαστούν με τέτοιες εικόνες Docker και να τις δημιουργήσουν εσωτερικά.

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

Διευθυντικός agent χρησιμοποιεί ιδιοκτησία dockerόπου μπορείτε να καθορίσετε:

  • το όνομα του κοντέινερ συναρμολόγησης σύμφωνα με την πολιτική ονομασίας σας·
  • ορίσματα που απαιτούνται για την εκτέλεση του κοντέινερ κατασκευής, όπου στην περίπτωσή μας προσαρτούμε τον τρέχοντα κατάλογο ως κατάλογο μέσα στο κοντέινερ.

Και ήδη στα βήματα δημιουργίας υποδεικνύουμε ποιες εντολές θα εκτελεστούν μέσα στον παράγοντα κατασκευής Docker. Αυτό μπορεί να είναι οτιδήποτε, επομένως ξεκινώ επίσης την ανάπτυξη εφαρμογών χρησιμοποιώντας το ansible.

Παρακάτω θέλω να δείξω ένα γενικό αρχείο Jenkins που μπορεί να δημιουργήσει μια απλή εφαρμογή Node.JS.

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

}

Τι συνέβη?

Χάρη σε αυτή τη μέθοδο, λύσαμε τα ακόλουθα προβλήματα:

  • Ο χρόνος διαμόρφωσης της συναρμολόγησης περιβάλλοντος μειώνεται σε 10 - 15 λεπτά ανά έργο.
  • ένα πλήρως επαναλαμβανόμενο περιβάλλον δημιουργίας εφαρμογών, αφού μπορείτε να το δημιουργήσετε με αυτόν τον τρόπο στον τοπικό σας υπολογιστή.
  • δεν υπάρχουν προβλήματα με διενέξεις μεταξύ διαφορετικών εκδόσεων εργαλείων συναρμολόγησης.
  • πάντα ένας καθαρός χώρος εργασίας που δεν βουλώνει.

Η ίδια η λύση είναι απλή και προφανής και σας επιτρέπει να έχετε κάποια πλεονεκτήματα. Ναι, το όριο εισόδου έχει αυξηθεί λίγο σε σύγκριση με απλές εντολές για συγκροτήματα, αλλά τώρα υπάρχει εγγύηση ότι θα χτίζεται πάντα και ο ίδιος ο προγραμματιστής μπορεί να επιλέξει όλα όσα είναι απαραίτητα για τη διαδικασία κατασκευής του.

Μπορείτε επίσης να χρησιμοποιήσετε την εικόνα που συγκέντρωσα Τζένκινς + Ντόκερ. Όλες οι πηγές είναι ανοιχτές και βρίσκονται στο rmuhamedgaliev/jenkins_docker.

Κατά τη σύνταξη αυτού του άρθρου, προέκυψε μια συζήτηση σχετικά με τη χρήση πρακτόρων σε απομακρυσμένους διακομιστές, ώστε να μην φορτωθεί ο κύριος κόμβος χρησιμοποιώντας ένα πρόσθετο docker-plugin. Αλλά θα μιλήσω για αυτό στο μέλλον.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο