web-dev-qa-db-ja.com

Gitlab CIを使用して複数のDockerコンテナーを構築、プッシュ、プルする方法は?

ノードアプリとngnixサーバーの2つのコンテナーを構築するdocker-composeファイルがあります。ここで、Gitlabランナーの助けを借りて、サーバーでのビルドと実行のプロセスを自動化したいと思います。私はCI関連のものにかなり慣れていないので、私のアプローチを許してください:

Gitlab.comに複数のリポジトリを作成し、それぞれにDockerfileを作成したいと思います。イメージをビルドするために、gitlab-runnerインスタンスをこれらの各プロジェクトに関連付けて、Dockerリポジトリにプッシュし、サーバーにそこからプルさせる必要がありますか?そして、どういうわけか、docker-composeファイルをサーバーにプッシュして、そこからすべてを作成する必要があります。

だから私の質問は:

  1. 1つのサーバーですべてのリポジトリに対して複数(2または3)のgitlab-runnerを実行できますか?
  2. 特定のランナーまたは共有ランナーが必要ですか?違いは何ですか?
  3. すべてのチュートリアルで、gitlabリポジトリを使用するだけでなくセルフホストのGitlabインスタンスを使用するのはなぜですか(gitlab.comリポジトリでgitlab-runnerを使用することはできませんか?)
  4. Gitlab-runnerパイプラインでdocker-composeを使用して、すべてを一度にビルドすることは可能ですか?
4
Ipsider

まず第一に、GitLab CI/CD機能は https://gitlab.com とセルフホストのGitLabインスタンスで明らかに使用できます。ランナーを登録するホストを除いて、何も変更されません。

必要な数のランナーを追加できます(そう思います。少なくとも、プロジェクトごとに5〜6人のランナーが問題なく存在します)。これらのランナーをそれぞれプロジェクトに登録する必要があります。詳細については、 ランナーの登録 を参照してください。

共有ランナーと特定のランナーについては、GitLab CI/CDを試してみたい場合は、共有ランナーに固執する必要があると思います。

GitLab.comの共有ランナーは自動スケールモードで実行され、DigitalOceanを利用しています。自動スケーリングとは、ビルドを起動するための待機時間を短縮し、プロジェクトごとにVMを分離することで、セキュリティを最大化することを意味します。

これらはパブリックオープンソースプロジェクトに無料で使用でき、プライベートプロジェクトの場合はグループあたり月額2000CI分に制限されています。すべてのGitLab.comプランについてお読みください。

ただし、laptotpなど、文字通りどのマシンにも独自のランナーをインストールできます。クイックスタートのために Dockerでデプロイ できます。

最後に、ssh executorを使用し、サーバーにgitlab-ci.ymlをインストールしている場合は、docker-composeファイルでdocker-composeを使用できます。ただし、docker executorを使用し、 docker:dind (DockerのDocker)イメージを使用することをお勧めします

DockerのDockerとは何ですか?

Docker内でDockerを実行することは一般的に推奨されていませんが、Docker自体の開発など、いくつかの正当なユースケースがあります。

docker-composeを使用しない使用例を次に示します。

image: docker:latest

services:
  - name: docker:dind
    command: ["--experimental"]


before_script:
  - apk add --no-cache py-pip      # <-- add python package install pip
  - pip install docker-compose     # <--- add docker-compose 
  - echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin    # <---- Login to your registry

build-master:
  stage: build
  script:
    - docker build --squash --pull -t "$CI_REGISTRY_USER"/"$CI_REGISTRY_IMAGE":latest .
    - docker Push "$CI_REGISTRY_USER"/"$CI_REGISTRY_IMAGE":latest
  only:
    - master

build-dev:
  stage: build
  script:
    - docker build --squash --pull -t "$CI_REGISTRY_USER"/"$CI_REGISTRY_IMAGE":"$CI_COMMIT_REF_SLUG" .
    - docker Push "$CI_REGISTRY_USER"/"$CI_REGISTRY_IMAGE":"$CI_COMMIT_REF_SLUG"
  except:
    - master

ご覧のとおり、Dockerイメージを作成してタグを付け、Dockerレジストリにプッシュしますが、任意のレジストリにプッシュできます。そしてもちろん、script宣言でいつでもdocker-composeを使用できます

私のGitリポジトリは次のようになります:

/my_repo
|---- .gitignore    
|---- .gitlab-ci.yml    
|---- Dockerfile    
|---- README.md

そして、私のランナーのconfig.tomlは次のようになります。

[[runners]]
  name = "4Gb Digital Ocean vps"
  url = "https://gitlab.com"
  token = "efnrong44d77a5d40f74fc2ba84d8"
  executor = "docker"
  [runners.docker]
    tls_verify = false
    image = "docker:dind"
    privileged = false
    disable_cache = false
    volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
    shm_size = 0
  [runners.cache]

ランナー構成の詳細については、 https://docs.gitlab.com/runner/configuration/advanced-configuration.html を参照してください。

注:ここで使用されるすべての変数は秘密変数です。説明については https://docs.gitlab.com/ee/ci/variables/ を参照してください

それがあなたの質問に答えることを願っています

9
gcharbon