web-dev-qa-db-ja.com

Dockerにキャッシュを備えたGitlabCIランナー構成

GitlabCIのジョブ間でキャッシュまたはアーティファクトを引き継ぐことができないようです。自分の設定と関係があるのではないかと思いますが、よくわかりません。次のdocker-compose構成を使用して、両方ともdockerでgitlabとgitlab-ci-multirunnerを実行しています。簡潔にするために、データベース構成といくつかの環境変数を省略しました。

version: '2'

services:
  gitlab:
    image: sameersbn/gitlab:8.5.1
    links:
      - redis:redisio
      - postgresql:postgresql
    ports:
      - "10080:80"
      - "10022:22"
    environment:
      ...
    volumes:
      - gitlab_data:/home/git/data

  gitlab-ci-runner:
    restart: always
    image: gitlab/gitlab-runner
    volumes:
      - gitlab_runner_config_data:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/nginx/ssl/gitlab.crt:/etc/gitlab-runner/certs/ca.crt
      - /etc/ssh:/ssh
    links:
      - gitlab:gitlab

  redis:
    ...
  postgresql:
    ...


volumes:
  postgresql_data:
  redis_data:
  gitlab_data:
  gitlab_runner_config_data:

ランナー構成(config.toml)は:

concurrent = 1

[[runners]]
  name = "docker"
  url = <public gitlab url>/ci 
  token = <gitlab token>
  tls-ca-file = "/etc/gitlab-runner/certs/ca.crt"
  executor = "docker"
  [runners.docker]
    image = "docker-bash"
    volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]

docker-bash参照されているイメージは、公式の docker:1.1 bashがインストールされているイメージです。

私のビルドプロセスは3つのステップで構成されています。

  1. 実行npm installおよび公式のテスト node:5 画像。今のところ、デプロイをテストするためにこのステップを省略しました。
  2. コードを含むDockerイメージを作成します
  3. カスタムビルドのansibledockerイメージを介してansibleを使用し、ビルドされたイメージを本番サーバーにデプロイします。

.gitlab-ci.ymlファイルは次のようになります:

variables:
  FULL_IMAGE_TAG: deploy-$CI_BUILD_REF_NAME:$CI_BUILD_ID-$CI_BUILD_REF
  IMAGE_FILE: deploy-$CI_BUILD_REF_NAME.tar.gz

cache:
  paths:
    - $IMAGE_FILE

build:
  stage: build
  script:
    - docker build -t $FULL_IMAGE_TAG .
    - docker save $FULL_IMAGE_TAG | gzip -cf - > $IMAGE_FILE
  artifacts:
    paths:
      - $IMAGE_FILE

deploy:
  stage: deploy
  image: ansible-ssh
  script:
    - ls
    - ansible-playbook -e image_file=$IMAGE_FILE -e branch=$CI_BUILD_REF_NAME -e full_image_name=$FULL_IMAGE_TAG deploy-playbook.yml
  only:
    - develop
    - master

ご覧のとおり、圧縮されたDockerイメージは、ここではキャッシュとアーティファクトの両方のセクションで参照されていますが、ansibleがリモートマシンにコピーすることになっているデプロイステップでは実際には利用できません。 lsコマンドを含めてみたので、フォルダーの内容を確認すると、ファイルが明らかに存在しませんが、確実にビルドされており、gitlabUIからダウンロードできます。デプロイジョブのログは次のとおりです。

gitlab-ci-multi-runner 1.0.4 (014aa8c)
Using Docker executor with image ansible-ssh ...
Pulling docker image ansible-ssh ...
WARNING: Cannot pull the latest version of image ansible-ssh : Error: image library/ansible-ssh not found
WARNING: Locally found image will be used instead.

Running on runner-59d43cf3-project-8-concurrent-0 via 381c2ea97744...
Fetching changes...
Removing artifacts.Zip
Removing deploy-develop.tar.gz
HEAD is now at 6009bd0 test
Checking out 6009bd0f as develop...
HEAD is now at 6009bd0... test

$ ls
Dockerfile
deploy-playbook.yml
server
$ ansible-playbook -e image_file=$IMAGE_FILE -e branch=$CI_BUILD_REF_NAME -e full_image_name=$FULL_IMAGE_TAG deploy-playbook.yml
Using /etc/ansible/ansible.cfg as config file
1 plays in deploy-playbook.yml

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [deploy-Host]

TASK [copy docker image] *******************************************************
task path: /builds/test/test/deploy-playbook.yml:44
fatal: [deploy-Host]: FAILED! => {"changed": false, "failed": true, "msg": "could not find src=/builds/test/test/deploy-develop.tar.gz"}

NO MORE HOSTS LEFT *************************************************************
    to retry, use: --limit @deploy-playbook.retry

PLAY RECAP *********************************************************************
deploy-Host            : ok=1    changed=0    unreachable=0    failed=1   


ERROR: Build failed with: exit code 1

ランナーを正しく設定または使用していないのではないかと思いますが、ドキュメントには本当に単純なケース以外のことはあまり見当たらず、ツールが内部でどのように組み合わされているかを十分に理解していません。 。

9
aquavitae

キャッシングは、ビルドのステージ間でファイルを渡すようには設計されていません。

doc から

キャッシュ:後続の実行の間にキャッシュする必要があるファイルのリストを定義します

必要なものは実際に進行中であると思います: WIP:前の段階からビルドアーティファクトをダウンロードし、ビルドのコンテキストでそれらを復元します(テクノロジープレビュー)

5
Pascal

アーティファクトを有効にしましたかgitlab.rb

gitlab_Rails['artifacts_enabled'] = false

ビルドアーティファクトのドキュメント ?で説明されているように

1
Diego Ferri

まず、gitlabとgitlab runnerを更新します。特に、1.0.4ランナーは静かな実験でした。

次に、キャッシュ定義でキーを追加する必要があります。 https://docs.gitlab.com/ce/ci/yaml/README.html#cache-key

cache:
  key: "$CI_BUILD_REF_NAME"
  paths:
  - ..

https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/configuration/advanced-configuration.md#the-runners-section から、 config.tomlを変更し、キャッシュディレクトリを追加する必要があります

cache_dir:

選択したエグゼキュータ(ローカル、Docker、SSH)のコンテキストでビルドキャッシュが保存されるディレクトリ。 docker executorを使用する場合は、このディレクトリをそのボリュームパラメータに含める必要があります。

1
Danny

キャッシングは少し奇妙ですが、本質的には次のとおりです。

<dir path>アンダーキャッシュは、ビルドジョブ間で使用できますが、<dir path>アーティファクトを使用すると、同じジョブ内で使用できます。

そう:

cache:
  untracked: true
  key: "$CI_BUILD_REF_NAME"
  paths:
    - cache-dir/

setup:
  stage: setup
  [snip]
  artifacts:
    paths:
     - cache-dir/ #notice that the path above is the same

これにより、同じキャッシュを使用できるようにしながら、各ビルドジョブ間でファイルをキャッシュできます内部同じジョブ。

ビルドステップごとに、必要なファイルをアーティファクトに追加することを忘れないでください。

0
avluis