Làm cách nào để chuyển hiện vật sang giai đoạn khác?


107

Tôi muốn sử dụng GitLab CI với tệp .gitlab-ci.yml để chạy các giai đoạn khác nhau với các tập lệnh riêng biệt. Giai đoạn đầu tiên tạo ra một công cụ phải được sử dụng trong giai đoạn sau để thực hiện các thử nghiệm. Tôi đã khai báo công cụ được tạo là tạo tác.

Bây giờ làm cách nào để tôi có thể thực thi công cụ đó trong công việc ở giai đoạn sau? Đường dẫn chính xác là gì và những tệp nào sẽ có xung quanh nó?

Ví dụ, giai đoạn đầu tiên xây dựng các tạo tác / bin / TestTool / TestTool.exe và thư mục đó chứa các tệp bắt buộc khác (DLL và các tệp khác). Tệp .gitlab-ci.yml của tôi trông giống như sau:

releasebuild:
  script:
    - chcp 65001
    - build.cmd
  stage: build
  artifacts:
    paths:
      - artifacts/bin/TestTool/

systemtests:
  script:
    - chcp 65001
    - WHAT TO WRITE HERE?
  stage: test

Bản dựng và thử nghiệm chạy trên Windows nếu có liên quan.

Câu trả lời:


102

Sử dụng dependencies. Với giai đoạn kiểm tra cấu hình này sẽ tải xuống các tệp không được theo dõi đã được tạo trong giai đoạn xây dựng:

build:
  stage: build
  artifacts:
    untracked: true
  script:
    - ./Build.ps1

test:
  stage: test
  dependencies: 
    - build
  script:
    - ./Test.ps1

9
Cuối cùng thì nó cũng hoạt động được! Điểm mấu chốt ở đây là các phụ thuộc nên được sử dụng cùng với các tạo tác. Chỉ những đồ tạo tác được đưa vào mới có thể tiêu thụ được trong giai đoạn tiếp theo. Không cần phải nói, hãy thận trọng với những gì đang được tải lên. Tôi sẽ nói sử dụng expire_in. Nếu không, chúng tôi có thể sẽ lãng phí rất nhiều dung lượng lưu trữ. Các tạo tác này được tải lên gitlab trong công việc / giai đoạn / bước xây dựng và tải xuống trong thử nghiệm.
ravikanth

18
Bạn có thực sự phải sử dụng phụ thuộc không? Tài liệu Gitlab cho biết Note that artifacts from all previous stages are passed by default.. Câu hỏi là khi nào bạn cần sử dụng các phụ thuộc.

2
Tài liệu làm rõ vấn đề này khá tốt: docs.gitlab.com/ee/ci/yaml/#dependencies
chetbox

3
Hiện vật @Josef từ khắp nơi trước giai đoạn được truyền theo mặc định (Không phải từ những công việc trước đây)
Vivek

1
@Josef khi bạn không cần tất cả hiện vật từ tất cả các giai đoạn trước cho công việc hiện tại. Giả sử bạn có 10 GB tệp nhị phân được tạo bởi giai đoạn xây dựng, nhưng giai đoạn cuối cùng của bạn chỉ gửi một số email về việc xây dựng thành công - bạn không cần phải tải xuống tất cả 10 GB cho công việc này
Ezh

49

Vì các tạo tác từ tất cả các giai đoạn trước được chuyển theo mặc định, chúng ta chỉ cần xác định các giai đoạn theo đúng thứ tự. Vui lòng thử ví dụ dưới đây, có thể giúp bạn hiểu.

image: ubuntu:18.04

stages:
  - build_stage
  - test_stage
  - deploy_stage

build:
  stage: build_stage
  script:
    - echo "building..." >> ./build_result.txt
  artifacts:
    paths:
    - build_result.txt
    expire_in: 1 week

unit_test:
  stage: test_stage
  script:
    - ls
    - cat build_result.txt
    - cp build_result.txt unittest_result.txt
    - echo "unit testing..." >> ./unittest_result.txt
  artifacts:
    paths:
    - unittest_result.txt
    expire_in: 1 week

integration_test:
  stage: test_stage
  script:
    - ls
    - cat build_result.txt
    - cp build_result.txt integration_test_result.txt
    - echo "integration testing..." >> ./integration_test_result.txt
  artifacts:
    paths:
    - integration_test_result.txt
    expire_in: 1 week

deploy:
  stage: deploy_stage
  script:
    - ls
    - cat build_result.txt
    - cat unittest_result.txt
    - cat integration_test_result.txt

nhập mô tả hình ảnh ở đây

Và trong trường hợp để chuyển hiện vật giữa các công việc trong các giai đoạn khác nhau, chúng ta có thể sử dụng các phụ thuộc cùng với hiện vật để chuyển hiện vật, như được mô tả từ tài liệu .

Và một ví dụ đơn giản hơn:

image: ubuntu:18.04

build:
  stage: build
  script:
    - echo "building..." >> ./result.txt
  artifacts:
    paths:
    - result.txt
    expire_in: 1 week

unit_test:
  stage: test
  script:
    - ls
    - cat result.txt
    - echo "unit testing..." >> ./result.txt
  artifacts:
    paths:
    - result.txt
    expire_in: 1 week

deploy:
  stage: deploy
  script:
    - ls
    - cat result.txt

Giải thích rất rõ ràng, cảm ơn bạn. Nếu một giai đoạn đặt tên một hiện vật trùng tên với một hiện vật ở giai đoạn trước, thì cổ vật gốc có bị ghi đè không?
Michael Osofsky

1
@MichaelOsofsky Bạn có thể đặt tên cho hiện vật bằng cùng một tên, hiện vật gốc sẽ không bị ghi đè bởi một hiện vật ở màn sau có cùng tên. Giai đoạn tiếp theo chỉ tải xuống hiện vật từ giai đoạn cũ, nó là một bản sao của nó. Tôi đặt tên chúng khác nhau trong ví dụ chủ yếu là do thử nghiệm đơn vị và tích hợp sẽ được thực hiện song song. Nếu chúng tôi xóa công việc kiểm tra tích hợp .eg, tất cả các công việc sẽ thực thi theo trình tự, sau đó chúng tôi có thể sử dụng cùng một tên cho tất cả các tạo tác mà không có bất kỳ sự nhầm lẫn nào. FYI, tôi cập nhật câu trả lời bằng một ví dụ nữa.
Chuan

Trong ví dụ của bạn, tôi thấy bạn đang thêm vào result.txt. Nếu bạn ghi đè lên result.txt trong job unit_test, tôi cho rằng job triển khai sẽ không bao giờ có quyền truy cập vào nội dung của result.txt từ job build. Tôi chỉ yêu cầu đảm bảo rằng tôi không bao giờ gây ra loại lỗi này trong tập lệnh của mình.
Michael Osofsky

1
Theo nhật ký, giai đoạn triển khai sẽ tải xuống cả result.txt từ các giai đoạn xây dựng và thử nghiệm, nhưng giai đoạn sau sẽ ghi đè lên giai đoạn trước.
Chuan

1
BTW, hiện vật gốc không được chạm vào và luôn có sẵn để tải xuống từ CI / CD -> Pipelines, sau đó nhấp vào nút thả xuống cho Cổ vật ở bên phải, bạn sẽ tìm thấy tất cả các hiện vật của tất cả các giai đoạn.
Chuan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.