Mengkonfigurasi pengiriman berkelanjutan di gitlab.com

Suatu kali saya berpikir untuk mengotomatiskan penyebaran proyek saya. gitlab.com dengan ramah menyediakan semua alat untuk ini, dan tentu saja saya memutuskan untuk menggunakannya setelah memilah dan menulis skrip penerapan kecil. Dalam artikel ini, saya berbagi pengalaman saya dengan komunitas.

TL; DR


  1. Konfigurasi VPS: nonaktifkan root, login kata sandi, pasang dockerd, konfigurasikan ufw
  2. Hasilkan sertifikat untuk server dan klien docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Aktifkan kontrol dockerd melalui soket tcp: hapus opsi -H fd: / / dari konfigurasi buruh pelabuhan.
  3. Daftarkan jalur sertifikat di docker.json
  4. Daftarkan dalam variabel gitlab dalam pengaturan CI / CD dengan konten sertifikat. Tulis skrip .gitlab-ci.yml untuk penerapan.

Saya akan menunjukkan semua contoh pada kit distribusi Debian.

Pengaturan VPS awal


Jadi Anda membeli contoh misalnya pada DO , hal pertama yang harus dilakukan adalah melindungi server Anda dari dunia luar yang agresif. Saya tidak akan membuktikan dan mengklaim apa pun, cukup tampilkan log / var / log / pesan dari server virtual saya:

Tangkapan layar
gambar

Pertama, instal ufw firewall:

apt-get update && apt-get install ufw 

Aktifkan kebijakan default: blokir semua koneksi masuk, izinkan semua koneksi keluar:

 ufw default deny incoming ufw default allow outgoing 

Penting: jangan lupa untuk mengizinkan koneksi ssh:

 ufw allow OpenSSH 

Sintaks umumnya adalah: Izinkan koneksi port: ufw allow 12345, di mana 12345 adalah nomor port atau nama layanan. Tolak: ufw deny 12345

Nyalakan firewall:

 ufw enable 

Kami meninggalkan sesi dan masuk lagi melalui ssh.

Tambahkan pengguna, berikan dia kata sandi dan tambahkan dia ke grup sudo.

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

Selanjutnya, sesuai rencana, Anda harus menonaktifkan entri kata sandi. Untuk melakukan ini, salin kunci ssh Anda ke server:

 ssh-copy-id root@10.101.10.28 

IP server Anda harus ditentukan. Coba sekarang untuk login di bawah pengguna yang dibuat sebelumnya, Anda tidak perlu lagi memasukkan kata sandi. Selanjutnya, dalam pengaturan konfigurasi, ubah yang berikut:

 sudo nano /etc/ssh/sshd_config 

nonaktifkan entri kata sandi:

 PasswordAuthentication no 

Mulai kembali daemon sshd:

 sudo systemctl reload sshd 

Sekarang, jika Anda atau orang lain mencoba masuk sebagai root, itu tidak akan berhasil.

Selanjutnya, atur dockerd, saya tidak akan menjelaskan prosesnya di sini, karena semuanya sudah dapat diubah, ikuti tautan ke situs web resmi dan lakukan langkah-langkah untuk menginstal buruh pelabuhan di mesin virtual Anda: https://docs.docker.com/install/linux/docker- ce / debian /

Pembuatan Sertifikat


Untuk mengelola daemon buruh pelabuhan dari jarak jauh, diperlukan koneksi TLS terenkripsi. Untuk melakukan ini, Anda harus memiliki sertifikat dan kunci, yang harus dibuat dan ditransfer ke mesin jarak jauh Anda. Ikuti langkah-langkah yang diberikan dalam instruksi di situs buruh pelabuhan resmi: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Semua dihasilkan * .pem file untuk server, yaitu ca.pem, server.pem, key.pem harus ditempatkan di direktori / etc / docker di server.

Pengaturan Dockerd


Dalam skrip untuk meluncurkan daemon buruh pelabuhan, hapus opsi -H df: //, opsi ini menjawab host mana yang dapat mengendalikan daemon buruh pelabuhan.

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

Selanjutnya, buat file pengaturan, jika belum ada dan tentukan opsi:

/etc/docker/daemon.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 } 


Mari kita aktifkan koneksi di port 2376:

 sudo ufw allow 2376 

Mulai ulang dockerd dengan pengaturan baru:

 sudo systemctl daemon-reload && sudo systemctl restart docker 

Periksa:

 sudo systemctl status docker 

Jika semuanya berwarna hijau, maka kami percaya bahwa kami telah berhasil mengkonfigurasi buruh pelabuhan di server.

Mengkonfigurasi pengiriman berkelanjutan pada gitlab


Agar pekerja gitalab dapat menjalankan perintah pada host jarak jauh buruh pelabuhan, perlu untuk menentukan bagaimana dan di mana menyimpan sertifikat dan kunci untuk koneksi terenkripsi dengan dockerd. Saya memecahkan masalah ini dengan hanya menuliskannya ke dalam variabel di pengaturan gitlbab:

Judul spoiler
gambar

Cukup tampilkan konten sertifikat dan kunci melalui cat: cat ca.pem . Salin dan tempel ke nilai variabel.

Mari kita menulis skrip untuk penyebaran melalui gitlab. Gambar docker-in-docker (dind) akan digunakan.

.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 #    


Konten skrip penerapan dengan komentar:

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 


Masalah utama adalah โ€œmengekstraksiโ€ isi sertifikat dalam bentuk normal dari variabel gitlab CI / CD. Saya tidak mengerti mengapa koneksi ke host jarak jauh tidak berfungsi. Di tuan rumah, saya melihat jurnal buruh pelabuhan sudo journalctl -u, ada kesalahan jabat tangan. Saya memutuskan untuk melihat apa yang umumnya disimpan dalam variabel, untuk ini Anda dapat melihat cat -A $ DOCKER_CERT_PATH / key.pem. Kesalahan ini diatasi dengan menambahkan penghapusan simbol carriage tr -d '\ r'.

Selanjutnya dalam skrip, Anda dapat menambahkan tugas pasca-rilis sesuai kebijakan Anda. Anda dapat melihat versi yang berfungsi di repositori saya https://gitlab.com/isqad/gitlab-ci-cd

Source: https://habr.com/ru/post/id449952/


All Articles