Usanidi wa CD kupitia gitlab

Wakati mmoja nilifikiria juu ya kuelekeza upelekaji wa mradi wangu kiotomatiki. gitlab.com hutoa kwa huruma zana zote za hii, na kwa kweli niliamua kuitumia kwa kuifikiria na kuandika hati ndogo ya kupeleka. Katika nakala hii, ninashiriki uzoefu wangu na jamii.

TL; DR

  1. Sanidi VPS: afya ya mizizi, kuingia kwa nenosiri, kusakinisha dockerd, kusanidi ufw
  2. Tengeneza cheti kwa seva na mteja docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Washa udhibiti wa dockerd kupitia tundu la tcp: ondoa -H fd:// chaguo kutoka kwa usanidi wa kizimbani.
  3. Weka njia za vyeti katika docker.json
  4. Sajili katika vigeu vya gitlab katika mipangilio ya CI/CD na yaliyomo kwenye vyeti. Andika hati ya .gitlab-ci.yml kwa matumizi.

Nitaonyesha mifano yote kwenye usambazaji wa Debian.

Mpangilio wa awali wa VPS

Hapa ulinunua mfano kwa mfano kwenye DO, jambo la kwanza kufanya ni kulinda seva yako dhidi ya ulimwengu wa nje wenye fujo. Sitathibitisha au kudai chochote, nitaonyesha tu /var/log/messages logi ya seva yangu ya kawaida:

Picha ya skriniUsanidi wa CD kupitia gitlab

Kwanza, sasisha firewall ya ufw:

apt-get update && apt-get install ufw

Washa sera chaguo-msingi: zuia miunganisho yote inayoingia, ruhusu miunganisho yote inayotoka:

ufw default deny incoming
ufw default allow outgoing

Muhimu: usisahau kuruhusu unganisho kupitia ssh:

ufw allow OpenSSH

Sintaksia ya jumla ni: Ruhusu muunganisho kwenye mlango: ufw ruhusu 12345, ambapo 12345 ni nambari ya mlango au jina la huduma. Kataa: ufw kataa 12345

Washa firewall:

ufw enable

Tunatoka kwenye kikao na kuingia tena kupitia ssh.

Ongeza mtumiaji, mpe nenosiri, na umwongeze kwenye kikundi cha sudo.

apt-get install sudo
adduser scoty
usermod -aG sudo scoty

Ifuatayo, kwa mujibu wa mpango huo, unapaswa kuzima kuingia kwa nenosiri. kufanya hivyo, nakili ufunguo wako wa ssh kwa seva:

ssh-copy-id [email protected]

IP ya seva lazima iwe yako. Sasa jaribu kuingia chini ya mtumiaji aliyeundwa mapema, huna haja ya kuingiza nenosiri tena. Ifuatayo, katika mipangilio ya usanidi, badilisha yafuatayo:

sudo nano /etc/ssh/sshd_config

Lemaza kuingia kwa nenosiri:

PasswordAuthentication no

Anzisha tena daemon ya sshd:

sudo systemctl reload sshd

Sasa ikiwa wewe au mtu mwingine atajaribu kuingia kama mzizi, itashindwa.

Ifuatayo, tunasanikisha dockerd, sitaelezea mchakato hapa, kwani kila kitu kinaweza kubadilishwa, fuata kiunga cha wavuti rasmi na upitie hatua za kusanikisha docker kwenye mashine yako ya kawaida: https://docs.docker.com/install/linux/docker-ce/debian/

Uzalishaji wa cheti

Ili kudhibiti daemoni ya kituo ukiwa mbali, muunganisho uliosimbwa wa TLS unahitajika. Ili kufanya hivyo, unahitaji kuwa na cheti na ufunguo ambao unahitaji kuzalisha na kuhamisha kwenye mashine yako ya mbali. Fuata hatua zilizotolewa katika maagizo kwenye tovuti rasmi ya docker: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Faili zote za *.pem zinazozalishwa za seva, yaani ca.pem, server.pem, key.pem, zinapaswa kuwekwa kwenye saraka ya /etc/docker kwenye seva.

usanidi wa docker

Kwenye hati ya kuanza ya daemon ya docker, ondoa -H df:// chaguo, chaguo hili linaambia ni mwenyeji gani daemon ya docker inaweza kudhibitiwa.

# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd

Ifuatayo, unda faili ya mipangilio ikiwa haipo tayari na uweke chaguo:

/etc/docker/docker.json

{
  "hosts": [
    "unix:///var/run/docker.sock",
    "tcp://0.0.0.0:2376"
  ],
  "labels": [
    "is-our-remote-engine=true"
  ],
  "tls": true,
  "tlscacert": "/etc/docker/ca.pem",
  "tlscert": "/etc/docker/server.pem",
  "tlskey": "/etc/docker/key.pem",
  "tlsverify": true
}

Ruhusu miunganisho kwenye bandari 2376:

sudo ufw allow 2376

Anzisha tena dockerd na mipangilio mipya:

sudo systemctl daemon-reload && sudo systemctl restart docker

Hebu tuangalie:

sudo systemctl status docker

Ikiwa kila kitu ni kijani, basi tunazingatia kwamba tumefanikiwa kusanidi docker kwenye seva.

Kuweka uwasilishaji unaoendelea kwenye gitlab

Ili mfanyakazi wa gitalab aweze kutekeleza amri kwenye seva pangishi ya kidhibiti cha mbali, unahitaji kuamua jinsi na mahali pa kuhifadhi vyeti na ufunguo wa muunganisho uliosimbwa kwa njia fiche kwenye dockerd. Nilitatua shida hii kwa kuandika tu kwa anuwai kwenye mipangilio ya gitlbab:

cheo cha mharibifuUsanidi wa CD kupitia gitlab

Toa tu yaliyomo kwenye cheti na ufunguo kupitia paka: cat ca.pem. Nakili na ubandike katika maadili tofauti.

Wacha tuandike hati ya kupelekwa kupitia gitlab. Picha ya docker-in-docker (dind) itatumika.

.gitlab-ci.yml

image:
  name: docker/compose:1.23.2
  # ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ entrypoint , Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ Π² dind
  entrypoint: ["/bin/sh", "-c"]

variables:
  DOCKER_HOST: tcp://docker:2375/
  DOCKER_DRIVER: overlay2

services:
  - docker:dind

stages:
  - deploy

deploy:
  stage: deploy
  script:
    - bin/deploy.sh # скрипт дСплоя Ρ‚ΡƒΡ‚

Yaliyomo kwenye hati ya kupeleka na maoni:

bin/deploy.sh

#!/usr/bin/env sh
# ПадаСм сразу, Ссли Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ошибки
set -e
# Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ, Ρ‚ΠΎ , Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅ΠΌ
set -v

# 
DOCKER_COMPOSE_FILE=docker-compose.yml
# ΠšΡƒΠ΄Π° Π΄Π΅ΠΏΠ»ΠΎΠΈΠΌ
DEPLOY_HOST=185.241.52.28
# ΠŸΡƒΡ‚ΡŒ для сСртификатов ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π² нашСм случаС - gitlab-Π²ΠΎΡ€ΠΊΠ΅Ρ€Π°
DOCKER_CERT_PATH=/root/.docker

# ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ всС имССтся
docker info
docker-compose version

# создаСм ΠΏΡƒΡ‚ΡŒ (сСйчас Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ Π² ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ - Π²ΠΎΡ€ΠΊΠ΅Ρ€Π΅ gitlab'Π°)
mkdir $DOCKER_CERT_PATH
# ΠΈΠ·Ρ‹ΠΌΠ°Π΅ΠΌ содСрТимоС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΏΡ€ΠΈ этом удаляСм лишниС символы Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈ сохранСнии ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….
echo "$CA_PEM" | tr -d 'r' > $DOCKER_CERT_PATH/ca.pem
echo "$CERT_PEM" | tr -d 'r' > $DOCKER_CERT_PATH/cert.pem
echo "$KEY_PEM" | tr -d 'r' > $DOCKER_CERT_PATH/key.pem
# Π½Π° всякий случай Π΄Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ
chmod 400 $DOCKER_CERT_PATH/ca.pem
chmod 400 $DOCKER_CERT_PATH/cert.pem
chmod 400 $DOCKER_CERT_PATH/key.pem

# Π΄Π°Π»Π΅Π΅ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ ΡƒΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ docker-Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ. БобствСнно, сам Π΄Π΅ΠΏΠ»ΠΎΠΉ
export DOCKER_TLS_VERIFY=1
export DOCKER_HOST=tcp://$DEPLOY_HOST:2376

# ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ коннСктится всС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ
docker-compose 
  -f $DOCKER_COMPOSE_FILE 
  ps

# логинимся Π² docker-рСгистри, Ρ‚ΡƒΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ свой "мСстный" рСгистри
docker login -u $DOCKER_USER -p $DOCKER_PASSWORD

docker-compose 
  -f $DOCKER_COMPOSE_FILE 
  pull app
# ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
docker-compose 
  -f $DOCKER_COMPOSE_FILE 
  up -d app

Shida kuu ilikuwa "kutoa" yaliyomo kwenye cheti katika fomu ya kawaida kutoka kwa anuwai za gitlab CI / CD. Sikuweza kujua kwa nini muunganisho wa seva pangishi ya mbali haukufanya kazi. Nilitazama logi ya sudo journalctl -u docker kwenye mwenyeji, kuna hitilafu na kushikana mikono. Niliamua kuangalia kile ambacho kwa ujumla kimehifadhiwa katika anuwai, kwa hii unaweza kuona cat -A $DOCKER_CERT_PATH/key.pem. Ilishinda hitilafu kwa kuongeza kuondolewa kwa herufi ya caret tr -d 'r'.

Zaidi ya hayo, unaweza kuongeza kazi za baada ya toleo kwenye hati kwa hiari yako. Unaweza kuangalia toleo la kufanya kazi kwenye hazina yangu https://gitlab.com/isqad/gitlab-ci-cd

Chanzo: mapenzi.com

Kuongeza maoni