Ρύθμιση του GitLab CI για τη μεταφόρτωση ενός έργου java στο maven central

Αυτό το άρθρο προορίζεται για προγραμματιστές java που έχουν την ανάγκη να δημοσιεύσουν γρήγορα τα προϊόντα τους σε κεντρικά αποθετήρια sonatype ή/και maven χρησιμοποιώντας το GitLab. Σε αυτό το άρθρο θα μιλήσω για τη ρύθμιση του gitlab-runner, του gitlab-ci και του maven-plugin για την επίλυση αυτού του προβλήματος.

Προαπαιτούμενα:

  • Ασφαλής αποθήκευση κλειδιών mvn και GPG.
  • Ασφαλής εκτέλεση εργασιών δημόσιας CI.
  • Μεταφόρτωση αντικειμένων (έκδοση/στιγμιότυπο) σε δημόσια αποθετήρια.
  • Αυτόματος έλεγχος των εκδόσεων έκδοσης για δημοσίευση στο maven central.
  • Μια γενική λύση για τη μεταφόρτωση τεχνουργημάτων σε ένα αποθετήριο για πολλαπλά έργα.
  • Απλότητα και ευκολία στη χρήση.

περιεχόμενο

Γενικές πληροφορίες

  • Μια λεπτομερής περιγραφή του μηχανισμού για τη δημοσίευση αντικειμένων στο Maven Central μέσω της υπηρεσίας φιλοξενίας αποθετηρίου Sonatype OSS έχει ήδη περιγραφεί στο αυτό το άρθρο χρήστης Googolplex, οπότε θα αναφερθώ σε αυτό το άρθρο στα σωστά σημεία.
  • Προεγγραφή για Sonatype JIRA και ανοίξτε ένα εισιτήριο για να ανοίξετε το αποθετήριο (διαβάστε την ενότητα για περισσότερες λεπτομέρειες Δημιουργήστε ένα εισιτήριο στο Sonatype JIRA). Μετά το άνοιγμα του αποθετηρίου, το ζεύγος σύνδεσης/κωδικού πρόσβασης από το JIRA (στο εξής θα αναφέρεται ως λογαριασμός Sonatype) θα χρησιμοποιηθεί για τη μεταφόρτωση τεχνουργημάτων στο Sonatype nexus.
  • Στη συνέχεια, η διαδικασία δημιουργίας ενός κλειδιού GPG περιγράφεται πολύ ξεκάθαρα. Δείτε την ενότητα για περισσότερες λεπτομέρειες Διαμόρφωση του GnuPG για υπογραφή τεχνουργημάτων
  • Εάν χρησιμοποιείτε την κονσόλα Linux για να δημιουργήσετε ένα κλειδί GPG (gnupg/gnupg2), τότε πρέπει να εγκαταστήσετε rng-εργαλεία για τη δημιουργία εντροπίας. Διαφορετικά, η δημιουργία κλειδιών μπορεί να διαρκέσει πολύ.
  • Υπηρεσίες αποθήκευσης δημόσιο Κλειδιά GPG

Στο περιεχόμενο

Ρύθμιση ενός έργου ανάπτυξης στο GitLab

  • Πρώτα απ 'όλα, πρέπει να δημιουργήσετε και να διαμορφώσετε ένα έργο στο οποίο ο αγωγός θα αποθηκευτεί για την ανάπτυξη τεχνουργημάτων. Ονόμασα το έργο μου απλά και χωρίς περίπλοκα - παρατάσσω
  • Μετά τη δημιουργία του αποθετηρίου, πρέπει να περιορίσετε την πρόσβαση για να αλλάξετε το αποθετήριο.
    Μεταβείτε στο έργο -> Ρυθμίσεις -> Αποθετήριο -> Προστατευμένα Υποκαταστήματα. Διαγράφουμε όλους τους κανόνες και προσθέτουμε έναν κανόνα με το χαρακτήρα μπαλαντέρ * με το δικαίωμα προώθησης και συγχώνευσης μόνο για χρήστες με ρόλο Συντηρητές. Αυτός ο κανόνας θα λειτουργεί για όλους τους χρήστες τόσο αυτού του έργου όσο και της ομάδας στην οποία ανήκει αυτό το έργο.
    Ρύθμιση του GitLab CI για τη μεταφόρτωση ενός έργου java στο maven central
  • Εάν υπάρχουν πολλοί συντηρητές, τότε η καλύτερη λύση θα ήταν να περιοριστεί κατ' αρχήν η πρόσβαση στο έργο.
    Μεταβείτε στο έργο -> Ρυθμίσεις -> Γενικά -> Ορατότητα, δυνατότητες έργου, δικαιώματα και ορίστε την ορατότητα έργου σε Private.
    Έχω ένα έργο προσβάσιμο στο κοινό, αφού χρησιμοποιώ το δικό μου GitLab Runner και μόνο εγώ έχω πρόσβαση για να αλλάξω το αποθετήριο. Λοιπόν, στην πραγματικότητα, δεν είναι προς το συμφέρον μου να εμφανίζω ιδιωτικές πληροφορίες σε δημόσια αρχεία καταγραφής αγωγών.
  • Αυστηροποίηση των κανόνων για την αλλαγή του αποθετηρίου
    Μεταβείτε στο έργο -> Ρυθμίσεις -> Αποθετήριο -> Κανόνες Push και ορίστε τον περιορισμό Committer, Ελέγξτε εάν ο συγγραφέας είναι σημαίες χρήστη του GitLab. Προτείνω επίσης τη ρύθμιση δέσμευση υπογραφήςκαι ορίστε τη σημαία Απόρριψη ανυπόγραφων δεσμεύσεων.
  • Στη συνέχεια, πρέπει να διαμορφώσετε ένα έναυσμα για την εκκίνηση εργασιών
    Μεταβείτε στο έργο -> Ρυθμίσεις -> CI / CD -> Ενεργοποιήσεις αγωγών και δημιουργήστε ένα νέο διακριτικό ενεργοποίησης
    Αυτό το διακριτικό μπορεί να προστεθεί αμέσως στη γενική διαμόρφωση των μεταβλητών για μια ομάδα έργων.
    Μεταβείτε στην ομάδα -> Ρυθμίσεις -> CI / CD -> Μεταβλητές και προσθέστε μια μεταβλητή DEPLOY_TOKEN με το trigger-token σε αξία.

Στο περιεχόμενο

GitLab Runner

Αυτή η ενότητα περιγράφει τη διαμόρφωση για την εκτέλεση εργασιών κατά την ανάπτυξη χρησιμοποιώντας τον δικό σας (Συγκεκριμένο) και δημόσιο (Κοινόχρηστο) δρομέα.

Συγκεκριμένος δρομέας

Χρησιμοποιώ τους δικούς μου δρομείς γιατί, πρώτα απ 'όλα, είναι βολικό, γρήγορο και φθηνό.
Για runner, προτείνω ένα Linux VDS με 1 CPU, 2 GB RAM, 20 GB HDD. Η τιμή έκδοσης είναι ~3000₽ ανά έτος.

Ο δρομέας μου

Για το runner πήρα VDS 4 CPU, 4 GB RAM, 50 GB SSD. Κόστος ~11000₽ και δεν το μετάνιωσα ποτέ.
Έχω συνολικά 7 μηχανήματα. 5 στην αρούμπα και 2 στο ihor.

Έχουμε λοιπόν έναν δρομέα. Τώρα θα το ρυθμίσουμε.
Πηγαίνουμε στο μηχάνημα μέσω SSH και εγκαθιστούμε java, git, maven, gnupg2.

Στο περιεχόμενο

Εγκατάσταση gitlab runner

  • Δημιουργήστε μια νέα ομάδα runner
    sudo groupadd runner
  • Δημιουργήστε έναν κατάλογο για την κρυφή μνήμη maven και εκχωρήστε δικαιώματα ομάδας runner
    Μπορείτε να παραλείψετε αυτό το σημείο εάν δεν σκοπεύετε να εκτελέσετε πολλούς δρομείς σε ένα μηχάνημα.

    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • Δημιουργήστε έναν χρήστη gitlab-deployer και προσθέστε στην ομάδα runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • Προσθήκη στο αρχείο /etc/ssh/sshd_config επόμενη γραμμή
    AllowUsers root@* [email protected]
  • Επανεκκίνηση sshd
    systemctl restart sshd
  • Ορισμός κωδικού πρόσβασης για τον χρήστη gitlab-deployer (μπορεί να είναι απλό, αφού υπάρχει περιορισμός για τον localhost)
    passwd gitlab-deployer
  • Εγκαταστήστε το GitLab Runner (Linux x86-64)
    sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
    sudo chmod +x /usr/local/bin/gitlab-runner
    ln -s /usr/local/bin/gitlab-runner /etc/alternatives/gitlab-runner
    ln -s /etc/alternatives/gitlab-runner /usr/bin/gitlab-runner
  • Μεταβείτε στον ιστότοπο gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners και αντιγράψτε το διακριτικό εγγραφής

Οθόνη

Ρύθμιση του GitLab CI για τη μεταφόρτωση ενός έργου java στο maven central

  • Εγγραφή δρομέα
    gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml

διαδικασία

Runtime platform arch=amd64 os=linux pid=17594 revision=3001a600 version=11.10.0
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://gitlab.com/
Please enter the gitlab-ci token for this runner:
REGISTRATION_TOKEN
Please enter the gitlab-ci description for this runner:
[ih1174328.vds.myihor.ru]: Deploy Runner
Please enter the gitlab-ci tags for this runner (comma separated):
deploy
Registering runner... succeeded                     runner=ZvKdjJhx
Please enter the executor: docker-ssh, parallels, virtualbox, docker-ssh+machine, kubernetes, docker, ssh, docker+machine, shell:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

  • Ελέγχουμε ότι ο δρομέας είναι εγγεγραμμένος. Μεταβείτε στον ιστότοπο gitlab.com -> deploy-project -> Ρυθμίσεις -> CI/CD -> Runners -> Specific Runners -> Runners που ενεργοποιήθηκαν για αυτό το έργο

Οθόνη

Ρύθμιση του GitLab CI για τη μεταφόρτωση ενός έργου java στο maven central

  • Προσθήκη ξεχωριστός υπηρεσία /etc/systemd/system/gitlab-deployer.service
    [Unit]
    Description=GitLab Deploy Runner
    After=syslog.target network.target
    ConditionFileIsExecutable=/usr/local/bin/gitlab-runner
    [Service]
    StartLimitInterval=5
    StartLimitBurst=10
    ExecStart=/usr/local/bin/gitlab-runner "run" "--working-directory" "/home/gitlab-deployer" "--config" "/etc/gitlab-runner/gitlab-deployer-config.toml" "--service" "gitlab-deployer" "--syslog" "--user" "gitlab-deployer"
    Restart=always
    RestartSec=120
    [Install]
    WantedBy=multi-user.target
  • Ας ξεκινήσουμε την υπηρεσία.
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • Ελέγχουμε ότι ο δρομέας τρέχει.

Παράδειγμα

Ρύθμιση του GitLab CI για τη μεταφόρτωση ενός έργου java στο maven central

Στο περιεχόμενο

Δημιουργία κλειδιών GPG

  • Από το ίδιο μηχάνημα συνδεόμαστε μέσω ssh κάτω από τον χρήστη gitlab-deployer (αυτό είναι σημαντικό για τη δημιουργία του κλειδιού GPG)

    ssh [email protected]

  • Δημιουργούμε ένα κλειδί απαντώντας σε ερωτήσεις. Χρησιμοποίησα το δικό μου όνομα και email.
    Βεβαιωθείτε ότι έχετε καθορίσει τον κωδικό πρόσβασης για το κλειδί. Τα τεχνουργήματα θα υπογράφονται με αυτό το κλειδί.

    gpg --gen-key 

  • Ελέγξτε

    gpg --list-keys -a
    /home/gitlab-deployer/.gnupg/pubring.gpg
    ----------------------------------------
    pub   4096R/00000000 2019-04-19
    uid                  Petruha Petrov <[email protected]>
    sub   4096R/11111111 2019-04-19

  • Μεταφόρτωση του δημόσιου κλειδιού μας στον διακομιστή κλειδιών

    gpg --keyserver keys.gnupg.net --send-key 00000000
    gpg: sending key 00000000 to hkp server keys.gnupg.net

Στο περιεχόμενο

Ρύθμιση του Maven

  • Συνδεθείτε ως χρήστης gitlab-deployer
    su gitlab-deployer 
  • Δημιουργήστε έναν κατάλογο maven Αποθήκη και σύνδεση με την προσωρινή μνήμη (μην κάνετε λάθος)
    Μπορείτε να παραλείψετε αυτό το σημείο εάν δεν σκοπεύετε να εκτελέσετε πολλούς δρομείς σε ένα μηχάνημα.

    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • Δημιουργήστε ένα κύριο κλειδί
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Δημιουργήστε ένα αρχείο ~/.m2/settings-security.xml
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Κρυπτογράφηση του κωδικού πρόσβασης για το λογαριασμό Sonatype
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Δημιουργήστε ένα αρχείο ~/.m2/settings.xml
    <settings>  
    <profiles>
        <profile>
            <id>env</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase>
            </properties>
        </profile>
    </profiles>
    <servers>
        <server>
            <id>sonatype</id>
            <username>SONATYPE_USERNAME</username>
            <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password>
        </server>
    </servers>
    </settings>

Οπου,
GPG_SECRET_KEY_PASSPHRASE - κωδικός πρόσβασης για το κλειδί GPG
SONATYPE_USERNAME — Σύνδεση λογαριασμού sonatype

Αυτό ολοκληρώνει τη ρύθμιση του δρομέα, μπορείτε να προχωρήσετε στην ενότητα GitLab CI

Στο περιεχόμενο

Shared Runner

Δημιουργία κλειδιών GPG

  • Πρώτα απ 'όλα, πρέπει να δημιουργήσετε ένα κλειδί GPG. Για να το κάνετε αυτό, εγκαταστήστε το gnupg.

    yum install -y gnupg

  • Δημιουργούμε ένα κλειδί απαντώντας σε ερωτήσεις. Χρησιμοποίησα το δικό μου όνομα και email. Βεβαιωθείτε ότι έχετε καθορίσει τον κωδικό πρόσβασης για το κλειδί.

    gpg --gen-key 

  • Εμφάνιση πληροφοριών στο κλειδί

    gpg --list-keys -a
    pub   rsa3072 2019-04-24 [SC] [expires: 2021-04-23]
      2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    uid           [ultimate] tttemp <[email protected]>
    sub   rsa3072 2019-04-24 [E] [expires: none]

  • Μεταφόρτωση του δημόσιου κλειδιού μας στον διακομιστή κλειδιών

    gpg --keyserver keys.gnupg.net --send-key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    gpg: sending key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 to hkp server keys.gnupg.net

  • Παίρνουμε το ιδιωτικό κλειδί

    gpg --export-secret-keys --armor 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    -----BEGIN PGP PRIVATE KEY BLOCK-----
    lQWGBFzAqp8BDADN41CPwJ/gQwiKEbyA902DKw/WSB1AvZQvV/ZFV77xGeG4K7k5
    ...
    =2Wd2
    -----END PGP PRIVATE KEY BLOCK-----

  • Μεταβείτε στις ρυθμίσεις έργου -> Ρυθμίσεις -> CI / CD -> Μεταβλητές και αποθηκεύστε το ιδιωτικό κλειδί σε μια μεταβλητή GPG_SECRET_KEY
    Ρύθμιση του GitLab CI για τη μεταφόρτωση ενός έργου java στο maven central

Στο περιεχόμενο

Ρύθμιση του Maven

  • Δημιουργήστε ένα κύριο κλειδί
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • Μεταβείτε στις ρυθμίσεις έργου -> Ρυθμίσεις -> CI / CD -> Μεταβλητές και αποθηκεύστε σε μια μεταβλητή SETTINGS_SECURITY_XML τις ακόλουθες γραμμές:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Κρυπτογράφηση του κωδικού πρόσβασης για το λογαριασμό Sonatype
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • Μεταβείτε στις ρυθμίσεις έργου -> Ρυθμίσεις -> CI / CD -> Μεταβλητές και αποθηκεύστε σε μια μεταβλητή SETTINGS_XML τις ακόλουθες γραμμές:
    <settings>  
    <profiles>
        <profile>
            <id>env</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase>
            </properties>
        </profile>
    </profiles>
    <servers>
        <server>
            <id>sonatype</id>
            <username>sonatype_username</username>
            <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password>
        </server>
    </servers>
    </settings>

Οπου,
GPG_SECRET_KEY_PASSPHRASE - κωδικός πρόσβασης για το κλειδί GPG
SONATYPE_USERNAME — Σύνδεση λογαριασμού sonatype

Στο περιεχόμενο

Ανάπτυξη εικόνας docker

  • Δημιουργούμε ένα αρκετά απλό Dockerfile για την εκτέλεση εργασιών ανάπτυξης με την απαιτούμενη έκδοση της Java. Παρακάτω είναι ένα παράδειγμα για τα αλπικά.

    FROM java:8u111-jdk-alpine
    RUN apk add gnupg maven git --update-cache 
    --repository http://dl-4.alpinelinux.org/alpine/edge/community/ --allow-untrusted && 
    mkdir ~/.m2/

  • Συναρμολόγηση κοντέινερ για το έργο σας

    docker build -t registry.gitlab.com/group/deploy .

  • Ελέγχουμε την ταυτότητα και φορτώνουμε το κοντέινερ στο μητρώο.

    docker login -u USER -p PASSWORD registry.gitlab.com
    docker push registry.gitlab.com/group/deploy

Στο περιεχόμενο

GitLab CI

Ανάπτυξη έργου

Προσθέστε το αρχείο .gitlab-ci.yml στη ρίζα του έργου ανάπτυξης
Το σενάριο παρουσιάζει δύο αμοιβαία αποκλειστικές εργασίες ανάπτυξης. Specific Runner ή Shared Runner αντίστοιχα.

.gitlab-ci.yml

stages:
  - deploy

Specific Runner:
  extends: .java_deploy_template
  # Задача будет выполняться на вашем shell-раннере
  tags:
    - deploy

Shared Runner:
  extends: .java_deploy_template
  # Задача будет выполняться на публичном docker-раннере
  tags:
    - docker
  # Образ из раздела GitLab Runner -> Shared Runner -> Docker
  image: registry.gitlab.com/group/deploy-project:latest
  before_script:
    # Импортируем GPG ключ
    - printf "${GPG_SECRET_KEY}" | gpg --batch --import
    # Сохраняем maven конфигурацию
    - printf "${SETTINGS_SECURITY_XML}" > ~/.m2/settings-security.xml
    - printf "${SETTINGS_XML}" > ~/.m2/settings.xml

.java_deploy_template:
  stage: deploy
  # Задача сработает по триггеру, если передана переменная DEPLOY со значением java
  only:
    variables:
    - $DEPLOY == "java"
  variables:
    # отключаем клонирование текущего проекта
    GIT_STRATEGY: none
  script:
    # Предоставляем возможность хранения пароля в незашифрованном виде
    - git config --global credential.helper store
    # Сохраняем временные креды пользователя gitlab-ci-token
    # Токен работает для всех публичных проектов gitlab.com и для проектов группы
    - echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/.git-credentials
    # Полностью чистим текущую директорию
    - rm -rf .* *
    # Клонируем проект который, будем деплоить в Sonatype Nexus
    - git clone ${DEPLOY_CI_REPOSITORY_URL} .
    # Переключаемся на нужный коммит
    - git checkout ${DEPLOY_CI_COMMIT_SHA} -f
    # Если хоть один pom.xml содержит параметр autoReleaseAfterClose валим сборку.
    # В противном случае есть риск залить сырые артефакты в maven central
    - >
      for pom in $(find . -name pom.xml); do
        if [[ $(grep -q autoReleaseAfterClose "$pom" && echo $?) == 0 ]]; then
          echo "File $pom contains prohibited setting: <autoReleaseAfterClose>";
          exit 1;
        fi;
      done
    # Если параметр DEPLOY_CI_COMMIT_TAG пустой, то принудительно ставим SNAPSHOT-версию
    - >
      if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then
        mvn versions:set -DnewVersion=${DEPLOY_CI_COMMIT_TAG}
      else
        VERSION=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
        if [[ "${VERSION}" == *-SNAPSHOT ]]; then
          mvn versions:set -DnewVersion=${VERSION}
        else
          mvn versions:set -DnewVersion=${VERSION}-SNAPSHOT
        fi
      fi
    # Запускаем задачу на сборку и деплой артефактов
    - mvn clean deploy -DskipTests=true

Στο περιεχόμενο

Έργο Java

Σε έργα java που υποτίθεται ότι θα μεταφορτωθούν σε δημόσια αποθετήρια, πρέπει να προσθέσετε 2 βήματα για τη λήψη των εκδόσεων Έκδοσης και Στιγμιότυπου.

.gitlab-ci.yml

stages:
  - build
  - test
  - verify
  - deploy

<...>

Release:
  extends: .trigger_deploy
  # Запускать задачу только пo тегу.
  only:
    - tags

Snapshot:
  extends: .trigger_deploy
  # Запускаем задачу на публикацию SNAPSHOT версии вручную
  when: manual
  # Не запускать задачу, если проставлен тег.
  except:
    - tags

.trigger_deploy:
  stage: deploy
  variables:
    # Отключаем клонирование текущего проекта
    GIT_STRATEGY: none
    # Ссылка на триггер deploy-задачи
    URL: "https://gitlab.com/api/v4/projects/<deploy project ID>/trigger/pipeline"
    # Переменные deploy-задачи
    POST_DATA: "
      token=${DEPLOY_TOKEN}&
      ref=master&
      variables[DEPLOY]=${DEPLOY}&
      variables[DEPLOY_CI_REPOSITORY_URL]=${CI_REPOSITORY_URL}&
      variables[DEPLOY_CI_PROJECT_NAME]=${CI_PROJECT_NAME}&
      variables[DEPLOY_CI_COMMIT_SHA]=${CI_COMMIT_SHA}&
      variables[DEPLOY_CI_COMMIT_TAG]=${CI_COMMIT_TAG}
      "
  script:
    # Не использую cURL, так как с флагами --fail --show-error
    # он не выводит тело ответа, если HTTP код 400 и более 
    - wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}

Σε αυτή τη λύση, προχώρησα λίγο πιο πέρα ​​και αποφάσισα να χρησιμοποιήσω ένα πρότυπο CI για έργα java.

Λεπτομερώς

Δημιούργησα ένα ξεχωριστό έργο gitlab-ci στο οποίο τοποθέτησα ένα πρότυπο CI για έργα java κοινά.yml.

κοινά.yml

stages:
  - build
  - test
  - verify
  - deploy

variables:
  SONAR_ARGS: "
  -Dsonar.gitlab.commit_sha=${CI_COMMIT_SHA} 
  -Dsonar.gitlab.ref_name=${CI_COMMIT_REF_NAME} 
  "

.build_java_project:
  stage: build
  tags:
    - touchbit-shell
  variables:
    SKIP_TEST: "false"
  script:
    - mvn clean
    - mvn package -DskipTests=${SKIP_TEST}
  artifacts:
    when: always
    expire_in: 30 day
    paths:
      - "*/target/reports"

.build_sphinx_doc:
  stage: build
  tags:
    - touchbit-shell
  variables:
    DOCKERFILE: .indirect/docs/Dockerfile
  script:
    - docker build --no-cache -t ${CI_PROJECT_NAME}/doc -f ${DOCKERFILE} .

.junit_module_test_run:
  stage: test
  tags:
    - touchbit-shell
  variables:
    MODULE: ""
  script:
    - cd ${MODULE}
    - mvn test
  artifacts:
    when: always
    expire_in: 30 day
    paths:
      - "*/target/reports"

.junit_test_run:
  stage: test
  tags:
    - touchbit-shell
  script:
    - mvn test
  artifacts:
    when: always
    expire_in: 30 day
    paths:
    - "*/target/reports"

.sonar_review:
  stage: verify
  tags:
    - touchbit-shell
  dependencies: []
  script:
    - >
      if [ "$CI_BUILD_REF_NAME" == "master" ]; then
        mvn compile sonar:sonar -Dsonar.login=$SONAR_LOGIN $SONAR_ARGS
      else
        mvn compile sonar:sonar -Dsonar.login=$SONAR_LOGIN $SONAR_ARGS -Dsonar.analysis.mode=preview
      fi

.trigger_deploy:
  stage: deploy
  tags:
    - touchbit-shell
  variables:
    URL: "https://gitlab.com/api/v4/projects/10345765/trigger/pipeline"
    POST_DATA: "
      token=${DEPLOY_TOKEN}&
      ref=master&
      variables[DEPLOY]=${DEPLOY}&
      variables[DEPLOY_CI_REPOSITORY_URL]=${CI_REPOSITORY_URL}&
      variables[DEPLOY_CI_PROJECT_NAME]=${CI_PROJECT_NAME}&
      variables[DEPLOY_CI_COMMIT_SHA]=${CI_COMMIT_SHA}&
      variables[DEPLOY_CI_COMMIT_TAG]=${CI_COMMIT_TAG}
      "
  script:
  - wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}

.trigger_release_deploy:
  extends: .trigger_deploy
  only:
    - tags

.trigger_snapshot_deploy:
  extends: .trigger_deploy
  when: manual
  except:
    - tags

Ως αποτέλεσμα, στα ίδια τα έργα java, το .gitlab-ci.yml φαίνεται πολύ συμπαγές και όχι περίπλοκο

.gitlab-ci.yml

include: https://gitlab.com/TouchBIT/gitlab-ci/raw/master/common.yml

Shields4J:
  extends: .build_java_project

Sphinx doc:
  extends: .build_sphinx_doc
  variables:
    DOCKERFILE: .docs/Dockerfile

Sonar review:
  extends: .sonar_review
  dependencies:
    - Shields4J

Release:
  extends: .trigger_release_deploy

Snapshot:
  extends: .trigger_snapshot_deploy

Στο περιεχόμενο

Διαμόρφωση Pom.xml

Αυτό το θέμα περιγράφεται με μεγάλη λεπτομέρεια. Googolplex в Ρύθμιση του maven για αυτόματη υπογραφή και αποστολή τεχνουργημάτων σε αποθετήρια στιγμιότυπων και σταδιοποίησης, οπότε θα περιγράψω μερικές από τις αποχρώσεις της χρήσης προσθηκών. Θα περιγράψω επίσης πόσο εύκολα και ξεκούραστα μπορείτε να χρησιμοποιήσετε nexus-staging-maven-pluginεάν δεν θέλετε ή δεν μπορείτε να χρησιμοποιήσετε το org.sonatype.oss:oss-parent ως γονέα για το έργο σας.

maven-install-plug

Εγκαθιστά ενότητες στο τοπικό αποθετήριο.
Πολύ χρήσιμο για τοπική επαλήθευση λύσεων σε άλλα έργα, καθώς και άθροισμα ελέγχου.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-install-plugin</artifactId>
  <executions>
    <execution>
      <id>install-project</id>
      <!-- Если у вас многомодульный проект с деплоем родительского помика -->
      <phase>install</phase>
      <!-- Явно указываем файлы для локальной установки -->
      <configuration>
        <file>target/${project.artifactId}-${project.version}.jar</file>
```target/${project.artifactId}-${project.version}-sources.jar</sources>
        <pomFile>dependency-reduced-pom.xml</pomFile>
        <!-- Принудительное обновление метаданных проекта -->
        <updateReleaseInfo>true</updateReleaseInfo>
        <!-- Контрольные суммы для проверки целостности -->
        <createChecksum>true</createChecksum>
      </configuration>
    </execution>
  </executions>
</plugin>

Στο περιεχόμενο

maven-javadoc-plugin

Δημιουργία javadoc για το έργο.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-javadoc-plugin</artifactId>
  <executions>
    <execution>
      <goals>
        <goal>jar</goal>
      </goals>
      <!-- Генерация javadoc должна быть после фазы генерации ресурсов -->
      <phase>prepare-package</phase>
      <configuration>
        <!-- Очень помогает в публичных проектах -->
        <failOnError>true</failOnError>
        <failOnWarnings>true</failOnWarnings>
        <!-- Убирает ошибку поиска документации в target директории -->
        <detectOfflineLinks>false</detectOfflineLinks>
      </configuration>
    </execution>
  </executions>
</plugin>

Εάν έχετε μια λειτουργική μονάδα που δεν περιέχει java (για παράδειγμα μόνο πόρους)
Ή δεν θέλετε να δημιουργήσετε javadoc κατ 'αρχήν, τότε βοηθήστε maven-jar-plugin

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <executions>
    <execution>
      <id>empty-javadoc-jar</id>
      <phase>generate-resources</phase>
      <goals>
        <goal>jar</goal>
      </goals>
      <configuration>
        <classifier>javadoc</classifier>
        <classesDirectory>${basedir}/javadoc</classesDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

Στο περιεχόμενο

maven-gpg-plug

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-gpg-plugin</artifactId>
  <executions>
    <execution>
      <id>sign-artifacts</id>
      <!-- Сборка будет падать, если отсутствует GPG ключ -->
      <!-- Подписываем артефакты только на фазе deploy -->
      <phase>deploy</phase>
      <goals>
        <goal>sign</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Στο περιεχόμενο

nexus-staging-maven-plugin

Διαμόρφωση:

<project>
  <!-- ... -->
  <build>
    <plugins>
      <!-- ... -->
      <plugin>
        <groupId>org.sonatype.plugins</groupId>
        <artifactId>nexus-staging-maven-plugin</artifactId>
      </plugin>
    </plugins>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.sonatype.plugins</groupId>
          <artifactId>nexus-staging-maven-plugin</artifactId>
          <extensions>true</extensions>
          <configuration>
            <serverId>sonatype</serverId>
            <nexusUrl>https://oss.sonatype.org/</nexusUrl>
            <!-- Обновляем метаданные, чтобы пометить артефакт как release -->
            <!-- Не влияет на snapshot версии -->
            <updateReleaseInfo>true</updateReleaseInfo>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-deploy-plugin</artifactId>
          <configuration>
            <!-- Отключаем плагин -->
            <skip>true</skip>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
  <distributionManagement>
    <snapshotRepository>
      <id>sonatype</id>
      <name>Nexus Snapshot Repository</name>
      <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
    </snapshotRepository>
    <repository>
      <id>sonatype</id>
      <name>Nexus Release Repository</name>
      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
  </distributionManagement>
</project>

Εάν έχετε ένα έργο πολλών ενοτήτων και δεν χρειάζεται να ανεβάσετε μια συγκεκριμένη ενότητα στο αποθετήριο, τότε πρέπει να προσθέσετε nexus-staging-maven-plugin με σημαία skipNexusStagingDeployMojo

<build>
  <plugins>
    <plugin>
      <groupId>org.sonatype.plugins</groupId>
      <artifactId>nexus-staging-maven-plugin</artifactId>
      <configuration>
        <skipNexusStagingDeployMojo>true</skipNexusStagingDeployMojo>
      </configuration>
    </plugin>
  </plugins>
</build>

Μετά τη λήψη, οι εκδόσεις στιγμιότυπου/έκδοσης είναι διαθέσιμες στο σταδιοποίηση αποθετηρίων

<repositories>
  <repository>
    <id>SonatypeNexus</id>
    <url>https://oss.sonatype.org/content/groups/staging/</url>
    <!-- Не надо указывать флаги snapshot/release для репозитория -->
  </repository>
</repositories>

Περισσότερα συν

  • Μια πολύ πλούσια λίστα στόχων για εργασία με το αποθετήριο nexus (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • Αυτόματος έλεγχος απελευθέρωσης για μεταφόρτωση στο maven central

Στο περιεχόμενο

Αποτέλεσμα

Δημοσίευση έκδοσης SNAPSHOT

Κατά τη δημιουργία ενός έργου, είναι δυνατή η μη αυτόματη εκκίνηση μιας εργασίας για τη λήψη της έκδοσης SNAPSHOT στο nexus

Ρύθμιση του GitLab CI για τη μεταφόρτωση ενός έργου java στο maven central

Όταν εκκινηθεί αυτή η εργασία, ενεργοποιείται η αντίστοιχη εργασία στο έργο ανάπτυξης (παράδειγμα).

Κομμένο κούτσουρο

Running with gitlab-runner 11.10.0 (3001a600)
  on Deploy runner JSKWyxUw
Using Shell executor...
Running on ih1174328.vds.myihor.ru...
Skipping Git repository setup
Skipping Git checkout
Skipping Git submodules setup
$ rm -rf .* *
$ git config --global credential.helper store
$ echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/.git-credentials
$ git clone ${DEPLOY_CI_REPOSITORY_URL} .
Cloning into 'shields4j'...
$ git checkout ${DEPLOY_CI_COMMIT_SHA}
Note: checking out '850f86aa317194395c5387790da1350e437125a7'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
  git checkout -b new_branch_name
HEAD is now at 850f86a... skip deploy test-core
$ for pom in $(find . -name pom.xml); do # collapsed multi-line command
$ if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then # collapsed multi-line command
[INFO] Scanning for projects...
[INFO] Inspecting build with total of 4 modules...
[INFO] Installing Nexus Staging features:
[INFO]   ... total of 4 executions of maven-deploy-plugin replaced with nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Shields4J client                                                   [jar]
[INFO] TestNG listener                                                    [jar]
[INFO] 
[INFO] --------------< org.touchbit.shields4j:shields4j-parent >---------------
[INFO] Building Shields4J 1.0.0                                           [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- versions-maven-plugin:2.5:set (default-cli) @ shields4j-parent ---
[INFO] Searching for local aggregator root...
[INFO] Local aggregation root: /home/gitlab-deployer/JSKWyxUw/0/TouchBIT/deploy/shields4j
[INFO] Processing change of org.touchbit.shields4j:shields4j-parent:1.0.0 -> 1.0.0-SNAPSHOT
[INFO] Processing org.touchbit.shields4j:shields4j-parent
[INFO]     Updating project org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] Processing org.touchbit.shields4j:client
[INFO]     Updating parent org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]     Updating dependency org.touchbit.shields4j:test-core
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] Processing org.touchbit.shields4j:test-core
[INFO]     Updating parent org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] Processing org.touchbit.shields4j:testng
[INFO]     Updating parent org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]     Updating dependency org.touchbit.shields4j:client
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]     Updating dependency org.touchbit.shields4j:test-core
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... SUCCESS [  0.992 s]
[INFO] test-core .......................................... SKIPPED
[INFO] Shields4J client ................................... SKIPPED
[INFO] TestNG listener 1.0.0 .............................. SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.483 s
[INFO] Finished at: 2019-04-21T02:40:42+03:00
[INFO] ------------------------------------------------------------------------
$ mvn clean deploy -DskipTests=${SKIP_TESTS}
[INFO] Scanning for projects...
[INFO] Inspecting build with total of 4 modules...
[INFO] Installing Nexus Staging features:
[INFO]   ... total of 4 executions of maven-deploy-plugin replaced with nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Shields4J client                                                   [jar]
[INFO] TestNG listener                                                    [jar]
[INFO] 
[INFO] --------------< org.touchbit.shields4j:shields4j-parent >---------------
[INFO] Building Shields4J 1.0.0-SNAPSHOT                                  [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
...
DELETED
...
[INFO]  * Bulk deploy of locally gathered snapshot artifacts finished.
[INFO] Remote deploy finished with success.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0-SNAPSHOT ........................... SUCCESS [  2.375 s]
[INFO] test-core .......................................... SUCCESS [  3.929 s]
[INFO] Shields4J client ................................... SUCCESS [  3.815 s]
[INFO] TestNG listener 1.0.0-SNAPSHOT ..................... SUCCESS [ 36.134 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 47.629 s
[INFO] Finished at: 2019-04-21T02:41:32+03:00
[INFO] ------------------------------------------------------------------------

Ως αποτέλεσμα, η έκδοση φορτώνεται στο nexus 1.0.0-SNAPSHOT.

Όλες οι εκδόσεις στιγμιότυπου μπορούν να διαγραφούν από το αποθετήριο στον ιστότοπο oss.sonatype.org κάτω από τον λογαριασμό σας.

Ρύθμιση του GitLab CI για τη μεταφόρτωση ενός έργου java στο maven central

Στο περιεχόμενο

Δημοσίευση έκδοσης έκδοσης

Όταν εγκατασταθεί μια ετικέτα, η αντίστοιχη εργασία στο έργο ανάπτυξης ενεργοποιείται αυτόματα για λήψη της έκδοσης έκδοσης στο nexus (παράδειγμα).

Ρύθμιση του GitLab CI για τη μεταφόρτωση ενός έργου java στο maven central

Το καλύτερο μέρος είναι ότι το κλείσιμο της απελευθέρωσης ενεργοποιείται αυτόματα στο nexus.

[INFO] Performing remote staging...
[INFO] 
[INFO]  * Remote staging into staging profile ID "9043b43f77dcc9"
[INFO]  * Created staging repository with ID "orgtouchbit-1037".
[INFO]  * Staging repository at https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1037
[INFO]  * Uploading locally staged artifacts to profile org.touchbit
[INFO]  * Upload of locally staged artifacts finished.
[INFO]  * Closing staging repository with ID "orgtouchbit-1037".
Waiting for operation to complete...
.........
[INFO] Remote staged 1 repositories, finished with success.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... SUCCESS [  9.603 s]
[INFO] test-core .......................................... SUCCESS [  3.419 s]
[INFO] Shields4J client ................................... SUCCESS [  9.793 s]
[INFO] TestNG listener 1.0.0 .............................. SUCCESS [01:23 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:47 min
[INFO] Finished at: 2019-04-21T04:05:46+03:00
[INFO] ------------------------------------------------------------------------

Και αν κάτι πάει στραβά, το έργο σίγουρα θα αποτύχει

[INFO] Performing remote staging...
[INFO] 
[INFO]  * Remote staging into staging profile ID "9043b43f77dcc9"
[INFO]  * Created staging repository with ID "orgtouchbit-1038".
[INFO]  * Staging repository at https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1038
[INFO]  * Uploading locally staged artifacts to profile org.touchbit
[INFO]  * Upload of locally staged artifacts finished.
[INFO]  * Closing staging repository with ID "orgtouchbit-1038".
Waiting for operation to complete...
.......
[ERROR] Rule failure while trying to close staging repository with ID "orgtouchbit-1039".
[ERROR] 
[ERROR] Nexus Staging Rules Failure Report
[ERROR] ==================================
[ERROR] 
[ERROR] Repository "orgtouchbit-1039" failures
[ERROR]   Rule "signature-staging" failures
[ERROR]     * No public key: Key with id: (1f42b618d1cbe1b5) was not able to be located on &lt;a href=http://keys.gnupg.net:11371/&gt;http://keys.gnupg.net:11371/&lt;/a&gt;. Upload your public key and try the operation again.
...
[ERROR] Cleaning up local stage directory after a Rule failure during close of staging repositories: [orgtouchbit-1039]
[ERROR]  * Deleting context 9043b43f77dcc9.properties
[ERROR] Cleaning up remote stage repositories after a Rule failure during close of staging repositories: [orgtouchbit-1039]
[ERROR]  * Dropping failed staging repository with ID "orgtouchbit-1039" (Rule failure during close of staging repositories: [orgtouchbit-1039]).
[ERROR] Remote staging finished with a failure: Staging rules failure!
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... SUCCESS [  4.073 s]
[INFO] test-core .......................................... SUCCESS [  2.788 s]
[INFO] Shields4J client ................................... SUCCESS [  3.962 s]
[INFO] TestNG listener 1.0.0 .............................. FAILURE [01:07 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------

Ως αποτέλεσμα, μας μένει μόνο μία επιλογή. Είτε διαγράψτε αυτήν την έκδοση είτε δημοσιεύστε την.

Ρύθμιση του GitLab CI για τη μεταφόρτωση ενός έργου java στο maven central

Μετά την απελευθέρωση, μετά από κάποιο χρονικό διάστημα τα αντικείμενα θα είναι μέσα Ρύθμιση του GitLab CI για τη μεταφόρτωση ενός έργου java στο maven central

εκτός θέματος

Ήταν μια ανακάλυψη για μένα ότι το maven ευρετηριάζει άλλα δημόσια αποθετήρια.
Έπρεπε να προσθέσω το robots.txt επειδή ευρετηρίασε το παλιό μου αποθετήριο.

Στο περιεχόμενο

Συμπέρασμα

Τι έχουμε

  • Ένα ξεχωριστό έργο ανάπτυξης στο οποίο μπορείτε να εφαρμόσετε πολλές εργασίες CI για τη μεταφόρτωση τεχνουργημάτων σε δημόσιους χώρους αποθήκευσης για διάφορες γλώσσες ανάπτυξης.
  • Το έργο Deploy είναι απομονωμένο από εξωτερικές παρεμβολές και μπορεί να αλλάξει μόνο από χρήστες με τους ρόλους Κάτοχος και Συντηρητής.
  • Ένα ξεχωριστό Specific Runner με μια «καυτή» κρυφή μνήμη για την εκτέλεση μόνο εργασιών ανάπτυξης.
  • Δημοσίευση στιγμιότυπου/εκδόσεων εκδόσεων σε δημόσιο αποθετήριο.
  • Αυτόματος έλεγχος της έκδοσης κυκλοφορίας για ετοιμότητα για δημοσίευση στο maven central.
  • Προστασία από την αυτόματη δημοσίευση «ακατέργαστων» εκδόσεων στο maven central.
  • Δημιουργήστε και δημοσιεύστε εκδόσεις στιγμιότυπων "με κλικ".
  • Ένα ενιαίο αποθετήριο για τη λήψη εκδόσεων στιγμιότυπου/έκδοσης.
  • Γενικός αγωγός για την κατασκευή/δοκιμή/δημοσίευση ενός έργου java.

Η ρύθμιση του GitLab CI δεν είναι τόσο περίπλοκο θέμα όσο φαίνεται με την πρώτη ματιά. Αρκεί να ρυθμίσετε το CI με το κλειδί στο χέρι μερικές φορές και τώρα δεν είστε ερασιτέχνης σε αυτό το θέμα. Επιπλέον, η τεκμηρίωση του GitLab είναι πολύ περιττή. Μην φοβάστε να κάνετε το πρώτο βήμα. Ο δρόμος εμφανίζεται κάτω από τα βήματα του ατόμου που περπατάει (δεν θυμάμαι ποιος το είπε :)

Θα χαρώ να λάβω σχόλια.

Στο επόμενο άρθρο θα μιλήσω για το πώς να ρυθμίσετε το GitLab CI για να εκτελείτε εργασίες με δοκιμές ενοποίησης ανταγωνιστικά (εκτελώντας τις υπό δοκιμή υπηρεσίες χρησιμοποιώντας το docker-compose) εάν έχετε μόνο ένα πρόγραμμα εκτέλεσης φλοιού.

Στο περιεχόμενο

Πηγή: www.habr.com

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