gitlabを介してCDをセットアップする

プロジェクトの展開の自動化について考えたことがあります。 gitlab.comは、このためのすべてのツールを親切に提供します。もちろん、小さな展開スクリプトを整理して記述して使用することにしました。 この記事では、自分の経験をコミュニティと共有します。



TL; DR



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


Debian配布キットのすべての例を示します。



初期VPSセットアップ



したがって、たとえばDOでインスタンスを購入した場合、最初に行うことは、攻撃的な外界からサーバーを保護することです。 私は何も証明も主張もせず、私の仮想サーバーのログ/変数/ログ/メッセージを表示するだけです:



スクリーンショット
画像



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



apt-get update && apt-get install ufw
      
      





デフォルトポリシーをオンにします。すべての着信接続をブロックし、すべての発信接続を許可します。



 ufw default deny incoming ufw default allow outgoing
      
      





重要:ssh接続を許可することを忘れないでください:



 ufw allow OpenSSH
      
      





一般的な構文は次のとおりです。ポート接続を許可:ufw allow 12345、ここで12345はポート番号またはサービスの名前です。 拒否:ufw deny 12345



ファイアウォールをオンにします。



 ufw enable
      
      





セッションを終了し、ssh経由で再度ログインします。



ユーザーを追加し、パスワードを割り当てて、sudoグループに追加します。



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





次に、計画に従って、パスワード入力を無効にする必要があります。 これを行うには、sshキーをサーバーにコピーします。



 ssh-copy-id root@10.101.10.28
      
      





サーバーの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接続が必要です。 これを行うには、証明書とキーが必要です。これらは生成され、リモートマシンに転送される必要があります。 公式のドッカー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ディレクトリに配置する必要があります。



Dockerdセットアップ



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



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





次に、設定ファイルがまだ存在しない場合は作成し、オプションを指定する必要があります。



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







ポート2376で接続を有効にしましょう。



 sudo ufw allow 2376
      
      





新しい設定でdockerdを再起動します。



 sudo systemctl daemon-reload && sudo systemctl restart docker
      
      





チェック:



 sudo systemctl status docker
      
      





すべてが緑色の場合、サーバーでdockerが正常に構成されていると考えられます。



gitlabでの継続的な配信の構成



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



ネタバレ見出し
画像



cat: cat ca.pem



を使用して、証明書とキーの内容を表示するだけ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変数から通常の形式の証明書の内容を「抽出」することでした。 リモートホストへの接続が機能しなかった理由を理解できませんでした。 sudo journalctl -u dockerログを確認したホストで、ハンドシェイクエラーがあります。 一般に変数に保存されるものを調べることにしました。これについては、cat -A $ DOCKER_CERT_PATH / key.pemを確認できます。 このエラーは、キャリッジシンボルtr -d '\ r'の削除を追加することで克服されました。



さらにスクリプトでは、裁量でリリース後のタスクを追加できます。 リポジトリhttps://gitlab.com/isqad/gitlab-ci-cdで作業バージョンを確認できます



All Articles