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つのステップで構成されています。
npm install
および公式のテスト node:5 画像。今のところ、デプロイをテストするためにこのステップを省略しました。.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
ランナーを正しく設定または使用していないのではないかと思いますが、ドキュメントには本当に単純なケース以外のことはあまり見当たらず、ツールが内部でどのように組み合わされているかを十分に理解していません。 。
キャッシングは、ビルドのステージ間でファイルを渡すようには設計されていません。
doc から
キャッシュ:後続の実行の間にキャッシュする必要があるファイルのリストを定義します
必要なものは実際に進行中であると思います: WIP:前の段階からビルドアーティファクトをダウンロードし、ビルドのコンテキストでそれらを復元します(テクノロジープレビュー)
まず、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を使用する場合は、このディレクトリをそのボリュームパラメータに含める必要があります。
キャッシングは少し奇妙ですが、本質的には次のとおりです。
<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
これにより、同じキャッシュを使用できるようにしながら、各ビルドジョブ間でファイルをキャッシュできます内部同じジョブ。
ビルドステップごとに、必要なファイルをアーティファクトに追加することを忘れないでください。