数時間 Google で検索してみましたが、見つかりません。Java/Spring アプリケーション (+MySQL も必要) があり、そのための CI を作成したいと考えています。
私は何をどうすればよいかを知っています:
- Git リポジトリを Gitlab に移動する必要があることはわかっています。
- リポジトリにプッシュすると、CI スクリプトがトリガーされます。
- 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 コマンドは、あなたにとってより興味深いものです。