เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ CD เบœเปˆเบฒเบ™ gitlab

เป€เบกเบทเปˆเบญเบ‚เป‰เบญเบเบ„เบดเบ”เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เปƒเบซเป‰เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเบกเบตเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”. gitlab.com เปƒเบซเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบฑเบ‡เบซเบกเบปเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เบตเป‰เบ”เป‰เบงเบเบ„เบงเบฒเบกเป€เบกเบ”เบ•เบฒ, เปเบฅเบฐเปเบ™เปˆเบ™เบญเบ™เบ‚เป‰เบญเบเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบ›เบฐเป‚เบซเบเบ”เบˆเบฒเบเบกเบฑเบ™, เบ„เบดเบ”เป„เบฅเปˆเบกเบฑเบ™เบญเบญเบเปเบฅเบฐเบ‚เบฝเบ™ script เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ. เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเปเบšเปˆเบ‡เบ›เบฑเบ™เบ›เบฐเบชเบปเบšเบเบฒเบ™เบ‚เบญเบ‡เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบเบฑเบšเบŠเบธเบกเบŠเบปเบ™.

TL; DR

  1. เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ VPS: เบ›เบดเบ”เบเบฒเบ™เปƒเบŠเป‰เบ‡เบฒเบ™เบฎเบฒเบ, เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเบ”เป‰เบงเบเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™, เบ•เบดเบ”เบ•เบฑเป‰เบ‡ dockerd, เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ ufw
  2. เบชเป‰เบฒเบ‡เปƒเบšเบขเบฑเป‰เบ‡เบขเบทเบ™เบชเปเบฒเบฅเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปเบฅเบฐเบฅเบนเบเบ„เป‰เบฒ docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl เป€เบ›เบตเบ”เปƒเบŠเป‰เบเบฒเบ™เบ„เบงเบšเบ„เบธเบก dockerd เบœเปˆเบฒเบ™เบŠเปˆเบญเบ‡เบชเบฝเบš tcp: เป€เบญเบปเบฒเบ•เบปเบงเป€เบฅเบทเบญเบ -H fd:// เบญเบญเบเบˆเบฒเบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ docker.
  3. เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป„เบ›เบซเบฒเปƒเบšเบขเบฑเป‰เบ‡เบขเบทเบ™เปƒเบ™ docker.json
  4. เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบขเบนเปˆเปƒเบ™เบ•เบปเบงเปเบ› gitlab เปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ CI/CD เบ—เบตเปˆเบกเบตเป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เปƒเบšเบขเบฑเป‰เบ‡เบขเบทเบ™. เบ‚เบฝเบ™เบชเบฐเบ„เบฃเบดเบš .gitlab-ci.yml เป€เบžเบทเปˆเบญเบ™เบณเปƒเบŠเป‰.

เบ‚เป‰เบญเบเบˆเบฐเบชเบฐเปเบ”เบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เปเบˆเบเบขเบฒเบ Debian.

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ VPS เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ—เปˆเบฒเบ™เป„เบ”เป‰เบŠเบทเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆ DO, เบชเบดเปˆเบ‡เบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เปเบกเปˆเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบˆเบฒเบเป‚เบฅเบเบžเบฒเบเบ™เบญเบเบ—เบตเปˆเบฎเบธเบเบฎเบฒเบ™. เบ‚เป‰เบญเบเบˆเบฐเบšเปเปˆเบžเบดเบชเบนเบ”เบซเบผเบทเบขเบทเบ™เบขเบฑเบ™เบซเบเบฑเบ‡, เบ‚เป‰เบญเบเบžเบฝเบ‡เปเบ•เปˆเบˆเบฐเบชเบฐเปเบ”เบ‡เบšเบฑเบ™เบ—เบถเบ /var/log/messages เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ virtual เบ‚เบญเบ‡เบ‚เป‰เบญเบ:

เบžเบฒเบš เปœเป‰เบฒ เบˆเปเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ CD เบœเปˆเบฒเบ™ gitlab

เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบ•เบดเบ”เบ•เบฑเป‰เบ‡ ufw firewall:

apt-get update && apt-get install ufw

เบกเบฒเป€เบ›เบตเบ”เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบ™เบฐเป‚เบเบšเบฒเบเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™: เบšเบฅเบฑเบญเบเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบฒเป€เบ‚เบปเป‰เบฒเบ—เบฑเบ‡เปเบปเบ”, เบญเบฐเบ™เบธเบเบฒเบ”เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบฒเบญเบญเบเบ—เบฑเบ‡เปเบปเบ”:

ufw default deny incoming
ufw default allow outgoing

เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™: เบขเปˆเบฒเบฅเบทเบกเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบœเปˆเบฒเบ™ ssh:

ufw allow OpenSSH

syntax เบ—เบปเปˆเบงเป„เบ›เบกเบตเบ”เบฑเปˆเบ‡เบ™เบตเป‰: เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบ”เบเบžเบญเบ”: ufw เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰ 12345, เบšเปˆเบญเบ™เบ—เบตเปˆ 12345 เปเบกเปˆเบ™เบ•เบปเบงเป€เบฅเบเบžเบญเบ”เบซเบผเบทเบŠเบทเปˆเบ‚เบญเบ‡เบšเปเบฅเบดเบเบฒเบ™. เบ›เบฐเบ•เบดเป€เบชเบ”: ufw เบ›เบฐเบ•เบดเป€เบชเบ” 12345

เป€เบ›เบตเบ”เป„เบŸเบงเป:

ufw enable

เบžเบงเบเป€เบฎเบปเบฒเบญเบญเบเบˆเบฒเบเบเบญเบ‡เบ›เบฐเบŠเบธเบกเปเบฅเบฐเป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡เบœเปˆเบฒเบ™ ssh.

เป€เบžเบตเปˆเบกเบœเบนเป‰เปƒเบŠเป‰, เบกเบญเบšเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เปƒเบซเป‰เบฅเบฒเบง, เปเบฅเบฐเป€เบžเบตเปˆเบกเบฅเบฒเบงเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบเบธเปˆเบก sudo.

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

เบ•เปเปˆเป„เบ›, เบญเบตเบ‡เบ•เบฒเบกเปเบœเบ™เบเบฒเบ™, เบ—เปˆเบฒเบ™เบ„เบงเบ™เบ›เบดเบ”เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบ„เบฑเบ”เบฅเบญเบเบฅเบฐเบซเบฑเบ” ssh เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปƒเบชเปˆเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ:

ssh-copy-id [email protected]

ip เป€เบŠเบตเบšเป€เบงเบตเบ•เป‰เบญเบ‡เป€เบ›เบฑเบ™เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ. เบ•เบญเบ™เบ™เบตเป‰เบžเบฐเบเบฒเบเบฒเบกเป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเป‚เบ”เบเปƒเบŠเป‰เบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเป‰เบฒเบ‡เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰; เบ—เปˆเบฒเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบชเปˆเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบญเบตเบเบ•เปเปˆเป„เบ›. เบ•เปเปˆเป„เบ›, เปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ, เบ›เปˆเบฝเบ™เบชเบดเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

sudo nano /etc/ssh/sshd_config

เบ›เบดเบ”เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™:

PasswordAuthentication no

เบฃเบตเบชเบฐเบ•เบฒเบ” sshd daemon:

sudo systemctl reload sshd

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบ—เปˆเบฒเบ™เบซเบผเบทเบ„เบปเบ™เบญเบทเปˆเบ™เบžเบฐเบเบฒเบเบฒเบกเป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเป€เบ›เบฑเบ™เบœเบนเป‰เปƒเบŠเป‰เบฎเบฒเบ, เบกเบฑเบ™เบˆเบฐเบšเปเปˆเป€เบฎเบฑเบ”เบงเบฝเบ.

เบ•เปเปˆเป„เบ›, เบ•เบดเบ”เบ•เบฑเป‰เบ‡ dockerd, เบ‚เป‰เบญเบเบˆเบฐเบšเปเปˆเบญเบฐเบ—เบดเบšเบฒเบเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰, เป€เบžเบฒเบฐเบงเปˆเบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เปเบ›เบ‡เป„เบ”เป‰, เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบฒเบ‡เบเบฒเบ™เปเบฅเบฐเบœเปˆเบฒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ docker เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡ virtual เบ‚เบญเบ‡เบ—เปˆเบฒเบ™: https://docs.docker.com/install/linux/docker-ce/debian/

เบเบฒเบ™เบชเป‰เบฒเบ‡เปƒเบšเบขเบฑเป‰เบ‡เบขเบทเบ™

เป€เบžเบทเปˆเบญเบ„เบงเบšเบ„เบธเบก docker daemon เบˆเบฒเบเป„เบฅเบเบฐเป„เบ, เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบกเบตเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ TLS เบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เป„เบงเป‰. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบกเบตเปƒเบšเบขเบฑเป‰เบ‡เบขเบทเบ™เปเบฅเบฐเบเบฐเปเบˆ, เป€เบŠเบดเปˆเบ‡เบ•เป‰เบญเบ‡เบ–เบทเบเบชเป‰เบฒเบ‡เปเบฅเบฐเป‚เบญเบ™เป„เบ›เบซเบฒเป€เบ„เบทเปˆเบญเบ‡เบซเปˆเบฒเบ‡เป„เบเบชเบญเบเบซเบผเบตเบ. เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบตเปˆเป„เบ”เป‰เบฅเบฐเบšเบธเป„เบงเป‰เปƒเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบขเบนเปˆเปƒเบ™เป€เบงเบฑเบšเป„เบŠเบ—เปŒ docker เบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl เป„เบŸเบฅเปŒ *.pem เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบ—เบฑเบ‡เปเบปเบ”เบชเปเบฒเบฅเบฑเบšเป€เบŠเบตเบšเป€เบงเบต, เบ„เบท ca.pem, server.pem, key.pem, เบˆเบฐเบ•เป‰เบญเบ‡เบ–เบทเบเบงเบฒเบ‡เป„เบงเป‰เปƒเบ™เบฅเบฐเบšเบปเบš /etc/docker เปƒเบ™เป€เบŠเบตเบšเป€เบงเบต.

เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ dockerd

เปƒเบ™เบชเบฐเบ„เบฃเบดเบšเป€เบ›เบตเบ” docker daemon, เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบปเบฒเบ•เบปเบงเป€เบฅเบทเบญเบ -H df://, เบ•เบปเบงเป€เบฅเบทเบญเบเบ™เบตเป‰เบเปเบฒเบ™เบปเบ”เบงเปˆเบฒ host docker daemon เบชเบฒเบกเบฒเบ”เบ„เบงเบšเบ„เบธเบกเป„เบ”เป‰.

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

เบ•เปเปˆเป„เบ›, เบ—เปˆเบฒเบ™เบ„เบงเบ™เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ, เบ–เป‰เบฒเบกเบฑเบ™เบšเปเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง, เปเบฅเบฐเบฅเบฐเบšเบธเบ—เบฒเบ‡เป€เบฅเบทเบญเบ:

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

เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปƒเบ™เบžเบญเบ” 2376:

sudo ufw allow 2376

เบกเบฒเบฃเบตเบชเบฐเบ•เบฒเบ” dockerd เบ”เป‰เบงเบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปƒเปเปˆ:

sudo systemctl daemon-reload && sudo systemctl restart docker

เปƒเบซเป‰เบเบงเบ”เป€เบšเบดเปˆเบ‡:

sudo systemctl status docker

เบ–เป‰เบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™ "เบชเบตเบ‚เบฝเบง", เบžเบงเบเป€เบฎเบปเบฒเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ docker เบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ.

เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡เบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡เปƒเบ™ gitlab

เป€เบžเบทเปˆเบญเปƒเบซเป‰เบžเบฐเบ™เบฑเบเบ‡เบฒเบ™ Gitalaba เบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เบขเบนเปˆเปƒเบ™เป‚เบฎเบ” Docker เบซเปˆเบฒเบ‡เป„เบเบชเบญเบเบซเบผเบตเบ, เบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบงเบดเบ—เบตเบเบฒเบ™เปเบฅเบฐเบšเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเป€เบเบฑเบšเปƒเบšเบขเบฑเป‰เบ‡เบขเบทเบ™เปเบฅเบฐเบเบธเบ™เปเบˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเบ–เบทเบเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบเบฑเบš Dockerd. เบ‚เป‰เบญเบเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰เป‚เบ”เบเบžเบฝเบ‡เปเบ•เปˆเป€เบžเบตเปˆเบกเบชเบดเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰เปƒเบชเปˆเบ•เบปเบงเปเบ›เปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ gitlbab:

เบŠเบทเปˆ Spoilerเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ CD เบœเปˆเบฒเบ™ gitlab

เบžเบฝเบ‡เปเบ•เปˆเบญเบญเบเป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เปƒเบšเบขเบฑเป‰เบ‡เบขเบทเบ™เปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™ cat: cat ca.pem. เบ„เบฑเบ”เบฅเบญเบเปเบฅเบฐเบงเบฒเบ‡เบฅเบปเบ‡เปƒเบ™เบ„เปˆเบฒเบ•เบปเบงเปเบ›.

เบกเบฒเบ‚เบฝเบ™เบชเบฐเบ„เบฃเบดเบšเป€เบžเบทเปˆเบญเบ™เบณเปƒเบŠเป‰เบœเปˆเบฒเบ™ GitLab. เบฎเบนเบšเบžเบฒเบš docker-in-docker (dind) เบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰.

.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 # ัะบั€ะธะฟั‚ ะดะตะฟะปะพั ั‚ัƒั‚

เป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เบชเบฐเบ„เบฃเบดเบšเบ™เบณเปƒเบŠเป‰เบเบฑเบšเบ„เบณเป€เบซเบฑเบ™:

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

เบšเบฑเบ™เบซเบฒเบ•เบปเป‰เบ™เบ•เปเปเบกเปˆเบ™เบเบฒเบ™ "เบ”เบถเบ‡" เป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เปƒเบšเบขเบฑเป‰เบ‡เบขเบทเบ™เปƒเบ™เบฎเบนเบšเปเบšเบšเบ›เบปเบเบเบฐเบ•เบดเบˆเบฒเบเบ•เบปเบงเปเบ› gitlab CI / CD. เบ‚เป‰เบญเบเบšเปเปˆเบชเบฒเบกเบฒเบ”เบ„เบดเบ”เป„เบ”เป‰เบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเปเบกเปˆเบ‚เปˆเบฒเบเบ—เบฒเบ‡เป„เบเบˆเบถเปˆเบ‡เบšเปเปˆเป€เบฎเบฑเบ”เบงเบฝเบ. เบเปˆเบฝเบงเบเบฑเบšเป€เบˆเบปเป‰เบฒเบžเบฒเบšเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบšเบดเปˆเบ‡ log sudo journalctl -u docker, เบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบˆเบฑเบšเบกเบท. เบ‚เป‰เบญเบเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเป€เบšเบดเปˆเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปƒเบ™เบ•เบปเบงเปเบ›; เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เปเบšเบšเบ™เบตเป‰: cat -A $DOCKER_CERT_PATH/key.pem. เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เป„เบ”เป‰โ€‹เป€เบญเบปเบฒโ€‹เบŠเบฐโ€‹เบ™เบฐโ€‹เบ„เบงเบฒเบกโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹เป‚เบ”เบโ€‹เบเบฒเบ™โ€‹เป€เบžเบตเปˆเบกโ€‹เบเบฒเบ™โ€‹เป‚เบเบโ€‹เบเป‰เบฒเบโ€‹เบ‚เบญเบ‡โ€‹เบ•เบปเบงโ€‹เบญเบฑเบโ€‹เบชเบญเบ™ carriage tr -d 'r'.

เบ•เปเปˆเป„เบ›, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบกเบงเบฝเบเบ‡เบฒเบ™เบซเบผเบฑเบ‡เบเบฒเบ™เบ›เปˆเบญเบเบ•เบปเบงเปƒเบซเป‰เบเบฑเบšเบชเบฐเบ„เบฃเบดเบšเบ•เบฒเบกเบเบฒเบ™เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ‚เบญเบ‡เบ—เปˆเบฒเบ™. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เบชเบฐเบšเบฑเบšเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบ https://gitlab.com/isqad/gitlab-ci-cd

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™