Gosod CD trwy gitlab

Meddyliais unwaith am awtomeiddio'r defnydd o fy mhrosiect. Mae gitlab.com yn ddigon caredig i ddarparu'r holl offer ar gyfer hyn, ac wrth gwrs penderfynais ei ddefnyddio trwy ei ddarganfod ac ysgrifennu sgript lleoli bach. Yn yr erthygl hon, rwy'n rhannu fy mhrofiad gyda'r gymuned.

TL; DR

  1. Sefydlu VPS: analluogi gwraidd, mewngofnodi cyfrinair, gosod dockerd, ffurfweddu ufw
  2. Cynhyrchu tystysgrifau ar gyfer gweinydd a chleient docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Galluogi rheolaeth dockerd trwy soced tcp: tynnwch yr opsiwn -H fd:// o gyfluniad y docwr.
  3. Gosodwch lwybrau i dystysgrifau yn docker.json
  4. Cofrestrwch yn y newidynnau gitlab yn y gosodiadau CI / CD gyda chynnwys y tystysgrifau. Ysgrifennwch sgript .gitlab-ci.yml i'w defnyddio.

Byddaf yn dangos pob enghraifft ar y dosbarthiad Debian.

Gosodiad VPS cychwynnol

Yma fe brynoch chi enghraifft ar DO, y peth cyntaf i'w wneud yw amddiffyn eich gweinydd rhag y byd ymosodol y tu allan. Ni fyddaf yn profi nac yn honni unrhyw beth, byddaf yn dangos log /var/log/messages fy gweinydd rhithwir:

CiplunGosod CD trwy gitlab

Yn gyntaf, gosodwch wal dΓ’n ufw:

apt-get update && apt-get install ufw

Galluogi'r polisi rhagosodedig: rhwystro pob cysylltiad sy'n dod i mewn, caniatΓ‘u pob cysylltiad sy'n mynd allan:

ufw default deny incoming
ufw default allow outgoing

Pwysig: peidiwch ag anghofio caniatΓ‘u cysylltiad trwy ssh:

ufw allow OpenSSH

Y gystrawen gyffredinol yw: CaniatΓ‘u cysylltiad ar borthladd: ufw caniatΓ‘u 12345, lle mae 12345 yn rhif porthladd neu enw gwasanaeth. Gwadu: ufw gwadu 12345

Trowch wal dΓ’n ymlaen:

ufw enable

Rydyn ni'n gadael y sesiwn ac yn mewngofnodi eto trwy ssh.

Ychwanegu defnyddiwr, aseinio cyfrinair iddo, a'i ychwanegu at y grΕ΅p sudo.

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

Nesaf, yn Γ΄l y cynllun, dylech analluogi mewngofnodi cyfrinair. i wneud hyn, copΓ―wch eich allwedd ssh i'r gweinydd:

ssh-copy-id [email protected]

Rhaid i ip y gweinydd fod yn eiddo i chi. Nawr ceisiwch fewngofnodi o dan y defnyddiwr a grΓ«wyd yn gynharach, nid oes angen i chi nodi cyfrinair mwyach. Nesaf, yn y gosodiadau cyfluniad, newidiwch y canlynol:

sudo nano /etc/ssh/sshd_config

analluogi mewngofnodi cyfrinair:

PasswordAuthentication no

Ailgychwyn yr daemon sshd:

sudo systemctl reload sshd

Nawr os ydych chi neu rywun arall yn ceisio mewngofnodi fel gwraidd, bydd yn methu.

Nesaf, rydyn ni'n gosod dockerd, ni fyddaf yn disgrifio'r broses yma, oherwydd gellir newid popeth eisoes, dilynwch y ddolen i'r wefan swyddogol a mynd trwy'r camau o osod docker ar eich peiriant rhithwir: https://docs.docker.com/install/linux/docker-ce/debian/

Cynhyrchu Tystysgrif

Er mwyn rheoli'r ellyll docwr o bell, mae angen cysylltiad TLS wedi'i amgryptio. I wneud hyn, mae angen i chi gael tystysgrif ac allwedd y mae angen i chi ei gynhyrchu a'i drosglwyddo i'ch peiriant anghysbell. Dilynwch y camau a roddir yn y cyfarwyddiadau ar wefan swyddogol y docwr: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Dylid gosod pob ffeil *.pem a gynhyrchir ar gyfer y gweinydd, sef ca.pem, server.pem, key.pem, yn y cyfeiriadur /etc/docker ar y gweinydd.

gosodiad docwr

Yn y sgript cychwyn daemon docwr, tynnwch yr opsiwn -H df: //, mae'r opsiwn hwn yn dweud ar ba westeiwr y gellir rheoli'r ellyll docwr.

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

Nesaf, crΓ«wch ffeil gosodiadau os nad yw'n bodoli eisoes a gosodwch yr opsiynau:

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

CaniatΓ‘u cysylltiadau ar borth 2376:

sudo ufw allow 2376

Ailgychwyn dockerd gyda gosodiadau newydd:

sudo systemctl daemon-reload && sudo systemctl restart docker

Gadewch i ni wirio:

sudo systemctl status docker

Os yw popeth yn wyrdd, yna rydym yn ystyried ein bod wedi ffurfweddu docwr yn llwyddiannus ar y gweinydd.

Sefydlu dosbarthiad parhaus ar gitlab

Er mwyn i'r gweithiwr gitalab allu gweithredu gorchmynion ar westeiwr docwr o bell, mae angen i chi benderfynu sut a ble i storio tystysgrifau ac allwedd ar gyfer cysylltiad wedi'i amgryptio i dockerd. Datrysais y broblem hon trwy ysgrifennu at y newidynnau yn y gosodiadau gitlbab:

teitl anrheithiwrGosod CD trwy gitlab

Allbynnwch gynnwys y tystysgrifau a'r allwedd trwy gath: cat ca.pem. CopΓ―wch a gludwch i mewn i werthoedd newidiol.

Gadewch i ni ysgrifennu sgript i'w defnyddio trwy gitlab. Bydd delwedd y docwr-mewn-docer (dind) yn cael ei ddefnyddio.

.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 # скрипт дСплоя Ρ‚ΡƒΡ‚

Cynnwys y sgript defnyddio gyda sylwadau:

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

Y brif broblem oedd "tynnu allan" cynnwys y tystysgrifau yn y ffurf arferol o'r newidynnau gitlab CI/CD. Ni allwn ddarganfod pam nad oedd y cysylltiad Γ’'r gwesteiwr o bell yn gweithio. Edrychais ar y log docker sudo journalctl -u ar y gwesteiwr, mae gwall gyda'r ysgwyd llaw. Penderfynais edrych ar yr hyn sy'n cael ei storio'n gyffredinol mewn newidynnau, ar gyfer hyn gallwch weld cath -A $DOCKER_CERT_PATH/key.pem. Gorchfygodd y gwall trwy ychwanegu tynnu'r nod caret tr -d 'r'.

Ymhellach, gallwch ychwanegu tasgau Γ΄l-ryddhau at y sgript yn Γ΄l eich disgresiwn. Gallwch edrych ar y fersiwn gweithio yn fy ystorfa https://gitlab.com/isqad/gitlab-ci-cd

Ffynhonnell: hab.com

Ychwanegu sylw