gitlab 経由の CD セットアップ

私はかつて、プロジェクトのデプロイメントを自動化することを考えました。 gitlab.com は、このためのすべてのツールを親切に提供してくれています。もちろん、私はそれを理解して小さなデプロイメント スクリプトを作成して、それを使用することにしました。 この記事では、私の経験をコミュニティと共有します。

TL; DR

  1. VPS のセットアップ: root を無効にし、パスワードでログインし、dockerd をインストールし、ufw を構成します。
  2. サーバーとクライアントの証明書を生成する docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl TCP ソケット経由で dockerd 制御を有効にします。docker 構成から -H fd:// オプションを削除します。
  3. docker.json で証明書へのパスを設定する
  4. 証明書の内容をCI/CD設定のgitlab変数に登録します。 デプロイメント用の .gitlab-ci.yml スクリプトを作成します。

Debian ディストリビューション上のすべての例を示します。

VPSの初期設定

ここでは、たとえばインスタンスを購入しました DO、最初に行うべきことは、攻撃的な外部世界からサーバーを保護することです。 何も証明したり主張したりしません。仮想サーバーの /var/log/messages ログを表示するだけです。

スクリーンショットgitlab 経由の CD セットアップ

まず、ufw ファイアウォールをインストールします。

apt-get update && apt-get install ufw

デフォルトのポリシーを有効にします。すべての受信接続をブロックし、すべての送信接続を許可します。

ufw default deny incoming
ufw default allow outgoing

重要: SSH 経由の接続を許可することを忘れないでください。

ufw allow OpenSSH

一般的な構文は次のとおりです。 ポートでの接続を許可します: ufw allowed 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 デーモンを再起動します。

sudo systemctl reload sshd

ここで、あなたまたは他の誰かが root としてログインしようとすると、失敗します。

次に、dockerd をインストールします。すべてはすでに変更できるため、ここではプロセスについては説明しません。公式 Web サイトへのリンクに従って、仮想マシンに docker をインストールする手順を実行します。 https://docs.docker.com/install/linux/docker-ce/debian/

証明書の生成

Docker デーモンをリモートで制御するには、暗号化された TLS 接続が必要です。 これを行うには、証明書とキーを生成してリモート マシンに転送する必要があります。 公式 Docker Web サイトの指示に示されている手順に従います。 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 ディレクトリに配置する必要があります。

ドッカーのセットアップ

docker デーモンの起動スクリプトで、-H df:// オプションを削除します。このオプションは、docker デーモンを制御できるホストを指定します。

# 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 で継続的デリバリーを設定する

gitalab ワーカーがリモート Docker ホスト上でコマンドを実行できるようにするには、証明書と dockerd への暗号化接続用のキーを保存する方法と場所を決定する必要があります。 この問題は、gitlbab 設定の変数に単純に書き込むことで解決しました。

ネタバレタイトルgitlab 経由の CD セットアップ

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 変数から通常の形式で「引き出す」ことでした。 リモート ホストへの接続が機能しない理由がわかりませんでした。 ホスト上の sudojournalctl -u docker ログを確認したところ、ハンドシェイクでエラーが発生しました。 一般に変数に何が保存されているかを確認することにしました。これについては、cat -A $DOCKER_CERT_PATH/key.pem を参照してください。 キャレット文字 tr -d 'r' の削除を追加することで、このエラーを解決しました。

さらに、自由裁量でリリース後のタスクをスクリプトに追加できます。 私のリポジトリで動作バージョンをチェックアウトできます https://gitlab.com/isqad/gitlab-ci-cd

出所: habr.com

コメントを追加します