GitLabを使用してDockerイメージを自分のサーバーに自動デプロイする方法は?質問する

GitLabを使用してDockerイメージを自分のサーバーに自動デプロイする方法は?質問する

数時間 Google で検索してみましたが、見つかりません。Java/Spring アプリケーション (+MySQL も必要) があり、そのための CI を作成したいと考えています。

私は何をどうすればよいかを知っています:

  1. Git リポジトリを Gitlab に移動する必要があることはわかっています。
  2. リポジトリにプッシュすると、CI スクリプトがトリガーされます。
  3. Gitlab は私の Docker イメージを Gitlab Docker Registry にビルドします。

質問は次のとおりです:

VPS で docker compose を強制的に実行して Gitlab から新しいイメージをプルし、サーバーを再起動するにはどうすればいいですか? VPS ではdocker-compose pull && docker-compose upアプリ フォルダー内で実行する必要があることはわかっています (間違っていたら訂正してください) が、Gitlab で自動的に実行する方法がまったくわかりません。

ベストアンサー1

VPS で docker compose を強制的に実行して Gitlab から新しいイメージをプルし、サーバーを再起動するには、何をする必要がありますか?

@m-uu、サーバーを再起動する必要はまったくありません。docker-compose up新しいイメージを取得してサービスを再起動するだけです。

VPS 上で、アプリ フォルダー内で docker-compose pull && docker-compose up を実行する必要があることはわかっています (間違っていたら訂正してください)。しかし、Gitlab でこれを自動的に行う方法がまったくわかりません。

はい、正しい方向に進んでいます。私の Gitlab CI 構成ファイルを見てください。Java プロジェクト用に変更するのは難しくないと思います。ビルド方法、レジストリへのプッシュ方法、サーバーへのイメージのデプロイ方法のアイデアをお伝えします。必要なことの 1 つは、SSH キーを生成し、公開キーをサーバーにプッシュすること (.ssh/authorized_keys)、非公開キーを GITLAB パイプライン シークレット変数にプッシュすることです (https://docs.gitlab.com/ee/ci/variables/#secret-variables

cache:
  key: "cache"
  paths:
  - junte-api

stages:
  - build
  - build_image
  - deploy

build:
  image: golang:1.7
  stage: build
  script:
    - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" > ~/key && chmod 600 ~/key
    - ssh-add ~/key
    - mkdir -p ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'

    - go get -u github.com/kardianos/govendor
    - mkdir -p $GOPATH/src/github.com/junte/junte-api
    - mv * $GOPATH/src/github.com/junte/junte-api
    - cd $GOPATH/src/github.com/junte/junte-api
    - govendor sync
    - go build -o junte-api
    - cd -
    - cp $GOPATH/src/github.com/junte/junte-api .

build_image:
  image: docker:latest
  stage: build_image
  script:
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker build -t $CI_REGISTRY_IMAGE .
    - docker push $CI_REGISTRY_IMAGE

deploy-dev:
  stage: deploy
  image: junte/ssh-agent
  variables:
    # should be set up at Gitlab CI env vars
    SSH_PRIVATE_KEY: $SSH_DEV_PRIVATE_KEY
  script:
    # copy docker-compose yml to server
    - scp docker-compose.dev.yml root@SERVER_IP:/home/junte/junte-api/
    # login to gitlab registry       
    - ssh root@SERVER_IP docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    # then we cd to folder with docker-compose, run docker-compose pull to update images, and run services with `docker-compose up -d`
    - ssh root@SERVER_IP "cd /home/junte/junte-api/ && docker-compose -f docker-compose.dev.yml pull api-dev && HOME=/home/dev docker-compose -f docker-compose.dev.yml up -d"
  environment:
      name: dev
  only:
    - dev

Docker をサポートする Gitlab ランナーも必要です。インストール方法については、Gitlab のドキュメントを参照してください。

ステージについて:

  • build- 必要なものを構築するために変更するだけです
  • build_image- 非常に簡単です。GitLab レジストリにログインし、新しいイメージをビルドしてレジストリにプッシュするだけです。cache一部を見ると、ステージ間でファイルをキャッシュする必要があり、異なる場合があります。
  • deploy-dev- その部分は、あなたが尋ねたことについての詳細です。ここでの最初の 6 つのコマンドは、ssh をインストールし、VPS にアクセスするための秘密鍵ファイルを作成するだけです。それをコピーして、SSH_PRIVATE_KEY を Gitlab UI の秘密変数に追加するだけです。最後の 3 つの SSH コマンドは、あなたにとってより興味深いものです。

おすすめ記事