2016-03-23 20 views
9

Tôi dường như không nhận được bộ nhớ cache hoặc các đồ tạo tác để chuyển đổi giữa các công việc trong gitlab CI. Tôi nghi ngờ nó là một cái gì đó để làm với cấu hình của tôi, nhưng tôi không chắc chắn những gì. Tôi đang chạy gitlab và gitlab-ci-multirunner, cả trong docker, sử dụng cấu hình docker-compose sau. Tôi đã bỏ qua cấu hình cơ sở dữ liệu và một số biến môi trường cho ngắn gọn:Cấu hình Á hậu CI Gitlab với bộ nhớ đệm trên docker

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: 

Cấu hình á quân (config.toml) là:

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"] 

Hình ảnh docker-bash gọi là chỉ là hình ảnh chính thức docker:1.10 với bash Cài đặt.

quá trình xây dựng của tôi bao gồm 3 bước:

  1. Run npm install và các bài kiểm tra trong node:5 hình ảnh chính thức. Bây giờ, tôi đã rời khỏi bước này để kiểm tra triển khai.
  2. Tạo hình ảnh trên đế có chứa mã
  3. Sử dụng ansible, qua hình ảnh docker được xây dựng theo yêu cầu để triển khai hình ảnh được xây dựng cho máy chủ sản xuất.

File .gitlab-ci.yml trông như thế này:

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 

Như bạn thấy, hình ảnh Docker nén được gọi đến đây cả hai trong các phần bộ nhớ cache và hiện vật, nhưng là không thực sự sẵn ở bước triển khai , nơi ansible là nghĩa vụ phải sao chép nó vào máy từ xa. Tôi đã thử bao gồm một lệnh ls để kiểm tra nội dung thư mục và tệp rõ ràng là không có, nhưng nó chắc chắn được xây dựng và tôi có thể tải xuống từ giao diện người dùng gitlab. Đây là nhật ký từ công việc triển khai:

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 

Tôi nghi ngờ rằng tôi không thiết lập hoặc sử dụng nhân vật chính xác, nhưng tôi không thể tìm thấy nhiều tài liệu cho bất kỳ trường hợp nào thực sự đơn giản và tôi không ' t biết công cụ đủ tốt để biết làm thế nào nó phù hợp với nhau dưới mui xe.

+0

để đảm bảo các bước đang thực hiện một bước sau khi bạn đã thử thêm các giai đoạn: - xây dựng - triển khai – Pascal

+0

Tôi đã làm, nhưng tôi có thể thấy thứ tự chúng chạy và ổn. – aquavitae

+0

Điều gì sẽ xảy ra nếu bạn thêm bước "tạo tác" vào công việc 'deploy'? Hoặc di chuyển nó xuống bên dưới 'cache' để nó sẽ ảnh hưởng đến tất cả các công việc? Câu hỏi khác là, bạn có chắc chắn cả 'cache' và' artifacts' có thể trỏ tới cùng một đường dẫn? Tôi không biết, tôi chỉ cố gắng giúp bạn với logic. ;) –

Trả lời

5

Caching không được thiết kế để truyền tệp giữa các giai đoạn của một bản dựng.

Từ doc

cache: Xác định danh sách các tập tin cần được lưu trữ giữa sau chạy

Tôi nghĩ rằng những gì bạn cần là trong thực tế cơ bản dở dang: WIP: Download build artifacts from previous stages and restore them in context of the build (Technology Preview)

+0

Vâng, đó là những gì tôi muốn và là những gì tôi đang cố gắng để làm, butit không hoạt động. Tôi đã đọc cả hai liên kết đó và chỉ thêm bộ nhớ cache để xem liệu nó có tạo nên sự khác biệt hay không. Mặc dù những gì tài liệu nói mặc dù, các hiện vật không được phục hồi trong công việc thứ hai. – aquavitae

+0

xây dựng: và triển khai: không phải là hai công việc mà chỉ có hai bước của cùng một công việc – Pascal

+0

Ok, có thể ngữ nghĩa là gây tranh cãi, nhưng vì vậy cái gì? Liệu nó có làm cho một sự khác biệt? – aquavitae

1

Did bạn bật các tạo tác trong bạn gitlab.rb

gitlab_rails['artifacts_enabled'] = false 

như được mô tả trong Build Artifacts documentation?

0

Trước hết, cập nhật gitlab và gitlab runner, đặc biệt là Á hậu 1.0.4 là thử nghiệm yên tĩnh.

Thứ hai trong định nghĩa bộ nhớ cache, bạn nên thêm một phím thấy https://docs.gitlab.com/ce/ci/yaml/README.html#cache-key

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

Từ https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/configuration/advanced-configuration.md#the-runners-section, bạn nên thay đổi config.toml và thêm một thư mục bộ nhớ cache

cache_dir:

thư mục nơi xây dựng bộ nhớ cache sẽ được lưu trữ trong bối cảnh của người thực hiện được chọn (cục bộ, Docker, SSH). Nếu trình điều khiển docker được sử dụng, thư mục này cần phải được bao gồm trong tham số khối lượng của nó.

0

Caching là một chút lạ, nhưng về cơ bản:

<dir path> dưới bộ nhớ cache có sẵn giữa xây dựng công ăn việc làm trong khi <dir path> hiện vật sẽ cho phép bạn sử dụng nó trong công việc tương tự.

Vì vậy:

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 

này sẽ cho phép bạn để cache các tập tin của bạn giữa mỗi xây dựng công việc đồng thời cho phép bạn sử dụng cùng một bộ nhớ cache bên công việc tương tự.

Đừng quên thêm các tệp bạn cần vào các tạo tác trên mỗi bước xây dựng.

Các vấn đề liên quan