Υπάρχουν πολλά άρθρα στο Habré σχετικά με τον Jenkins, αλλά λίγα περιγράφουν παραδείγματα για το πώς λειτουργούν οι Jenkins και οι πράκτορες docker. Όλα τα δημοφιλή εργαλεία κατασκευής έργων όπως
Σήμερα υπάρχει μια λύση στο πρόβλημα: Ο Jenkins 2 είναι εξαιρετικός στη συνεργασία
Γιατί άρχισα να λύνω αυτό το πρόβλημα;
Αφού είμαστε παρέα
- ένας μεγάλος χρόνος εκτέλεσης που οι προγραμματιστές ξεχνούν να καθαρίσουν.
- Υπάρχουν συγκρούσεις μεταξύ διαφορετικών εκδόσεων των ίδιων χρόνων εκτέλεσης.
- Κάθε προγραμματιστής χρειάζεται ένα διαφορετικό σύνολο στοιχείων.
Υπάρχουν άλλα προβλήματα, αλλά επιτρέψτε μου να σας πω για τη λύση.
Τζένκινς στο Ντόκερ
Δεδομένου ότι το Docker έχει πλέον εδραιωθεί στον κόσμο της ανάπτυξης, σχεδόν οτιδήποτε μπορεί να εκτελεστεί χρησιμοποιώντας το Docker. Η λύση μου είναι να έχω τον Jenkins στο Docker και να μπορώ να τρέχω άλλα κοντέινερ Docker. Αυτή η ερώτηση άρχισε να τίθεται το 2013 στο άρθρο "
Εν ολίγοις, χρειάζεται απλώς να εγκαταστήσετε το ίδιο το 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 είχε την ευκαιρία να περιγράψει τους κανόνες του χρησιμοποιώντας
Ας βάλουμε λοιπόν ένα ειδικό 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 λεπτά ανά έργο.
- ένα πλήρως επαναλαμβανόμενο περιβάλλον δημιουργίας εφαρμογών, αφού μπορείτε να το δημιουργήσετε με αυτόν τον τρόπο στον τοπικό σας υπολογιστή.
- δεν υπάρχουν προβλήματα με διενέξεις μεταξύ διαφορετικών εκδόσεων εργαλείων συναρμολόγησης.
- πάντα ένας καθαρός χώρος εργασίας που δεν βουλώνει.
Η ίδια η λύση είναι απλή και προφανής και σας επιτρέπει να έχετε κάποια πλεονεκτήματα. Ναι, το όριο εισόδου έχει αυξηθεί λίγο σε σύγκριση με απλές εντολές για συγκροτήματα, αλλά τώρα υπάρχει εγγύηση ότι θα χτίζεται πάντα και ο ίδιος ο προγραμματιστής μπορεί να επιλέξει όλα όσα είναι απαραίτητα για τη διαδικασία κατασκευής του.
Μπορείτε επίσης να χρησιμοποιήσετε την εικόνα που συγκέντρωσα
Κατά τη σύνταξη αυτού του άρθρου, προέκυψε μια συζήτηση σχετικά με τη χρήση πρακτόρων σε απομακρυσμένους διακομιστές, ώστε να μην φορτωθεί ο κύριος κόμβος χρησιμοποιώντας ένα πρόσθετο
Πηγή: www.habr.com