ฉันจะส่งต่อสิ่งประดิษฐ์ไปยังด่านอื่นได้อย่างไร


118

ฉันต้องการใช้ GitLab CI กับไฟล์. gitlab-ci.yml เพื่อเรียกใช้ขั้นตอนต่างๆโดยใช้สคริปต์แยกกัน ขั้นตอนแรกสร้างเครื่องมือที่ต้องใช้ในขั้นตอนต่อไปเพื่อทำการทดสอบ ฉันได้ประกาศให้เครื่องมือที่สร้างขึ้นเป็นสิ่งประดิษฐ์

ตอนนี้ฉันจะเรียกใช้เครื่องมือนั้นในงานระยะหลังได้อย่างไร เส้นทางที่ถูกต้องคืออะไรและจะมีไฟล์อะไรอยู่รอบ ๆ

ตัวอย่างเช่นขั้นแรกสร้างสิ่งประดิษฐ์ / bin / TestTool / TestTool.exe และไดเร็กทอรีนั้นมีไฟล์อื่น ๆ ที่จำเป็น (DLL และอื่น ๆ ) ไฟล์. gitlab-ci.yml ของฉันมีลักษณะดังนี้:

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

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

การสร้างและการทดสอบทำงานบน Windows หากมีความเกี่ยวข้อง

คำตอบ:


109

ใช้dependencies. ด้วยขั้นตอนการทดสอบการกำหนดค่านี้จะดาวน์โหลดไฟล์ที่ไม่ได้ติดตามที่สร้างขึ้นระหว่างขั้นตอนการสร้าง:

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

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

9
ในที่สุดก็ใช้งานได้! ประเด็นสำคัญที่นี่คือการอ้างอิงควรใช้ร่วมกับสิ่งประดิษฐ์ เฉพาะอาร์ติแฟกต์ที่ถูกรวมไว้เท่านั้นที่จะใช้ได้ในขั้นตอนต่อไป ไม่จำเป็นต้องพูดให้ระมัดระวังสิ่งที่กำลังอัปโหลด ฉันจะบอกว่าใช้ expire_in มิฉะนั้นเราอาจต้องเสียพื้นที่เก็บข้อมูลจำนวนมาก อาร์ติแฟกต์เหล่านี้อัปโหลดไปยัง gitlab ใน build job / stage / step และดาวน์โหลดในการทดสอบ
ravikanth

22
คุณต้องใช้การอ้างอิงหรือไม่? Gitlab Note that artifacts from all previous stages are passed by default.รัฐเอกสาร คำถามคือคุณต้องใช้การอ้างอิงเมื่อใด

2
เอกสารประกอบช่วยให้เข้าใจได้ดี: docs.gitlab.com/ee/ci/yaml/#dependencies
chetbox

3
สิ่งประดิษฐ์ @Josef จากทุกขั้นตอนก่อนหน้านี้จะถูกส่งผ่านไปโดยค่าเริ่มต้น (ไม่ใช่จากงานก่อนหน้า)
Vivek

1
เอกสารมีความสับสน - การส่งต่อสิ่งประดิษฐ์ของ "ขั้นตอนก่อนหน้าทั้งหมด" หมายความว่าอย่างไร ถ้าฉันเข้าใจถูกต้องหากผ่านทุกขั้นตอนก่อนหน้านี้เสมอข้อมูลทั้งหมดจากงานทั้งหมดจะพร้อมใช้งานและฉันไม่จำเป็นต้องใช้แท็ก "การอ้างอิง" กรณีเดียวที่ฉันคิดได้คือถ้าฉันไม่ต้องการพฤติกรรมนั้นและส่งผ่านสิ่งประดิษฐ์จากงานหนึ่งหรือสองสามงานที่เลือกเท่านั้น
skofgar

64

เนื่องจากอาร์ติแฟกต์จากขั้นตอนก่อนหน้าทั้งหมดจะถูกส่งไปตามค่าเริ่มต้นเราจึงต้องกำหนดขั้นตอนตามลำดับที่ถูกต้อง โปรดลองดูตัวอย่างด้านล่างซึ่งจะช่วยให้เข้าใจได้

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

ป้อนคำอธิบายภาพที่นี่

และในกรณีที่จะผ่านสิ่งประดิษฐ์ระหว่างงานในขั้นตอนที่แตกต่างกันเราสามารถใช้อ้างอิงพร้อมกับสิ่งประดิษฐ์ที่จะผ่านสิ่งประดิษฐ์ตามที่อธิบายจากเอกสาร

และอีกหนึ่งตัวอย่างที่ง่ายกว่า:

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

คำอธิบายที่ชัดเจนมากขอบคุณ ถ้าสเตจตั้งชื่ออาร์ติแฟกต์ด้วยชื่อเดียวกับอาร์ติแฟกต์จากสเตจก่อนหน้าอาร์ติแฟกต์ดั้งเดิมจะถูกเขียนทับหรือไม่
Michael Osofsky

1
@MichaelOsofsky คุณสามารถตั้งชื่ออาร์ติแฟกต์ด้วยชื่อเดียวกันอาร์ติแฟกต์ดั้งเดิมจะไม่ถูกเขียนทับโดยอันจากขั้นตอนถัดไปที่มีชื่อเดียวกัน ขั้นตอนต่อไปจะดาวน์โหลดเฉพาะสิ่งประดิษฐ์จากขั้นตอนเดิมเท่านั้นซึ่งเป็นสำเนาของมัน ฉันตั้งชื่อให้แตกต่างกันในตัวอย่างส่วนใหญ่เนื่องจากการทดสอบหน่วยและการรวมจะดำเนินการควบคู่กัน ถ้าเราลบงานทดสอบการรวม. eg งานทั้งหมดจะดำเนินการตามลำดับจากนั้นเราสามารถใช้ชื่อเดียวกันสำหรับสิ่งประดิษฐ์ทั้งหมดได้โดยไม่ต้องสับสน FYI ฉันอัปเดตคำตอบพร้อมอีกหนึ่งตัวอย่าง
ชวน

ในตัวอย่างของคุณฉันเห็นว่าคุณกำลังต่อท้าย result.txt หากคุณเขียนทับ result.txt ใน job unit_test ฉันถือว่าการปรับใช้งานจะไม่มีสิทธิ์เข้าถึงเนื้อหาของ result.txt จากการสร้างงาน ฉันแค่ขอให้แน่ใจว่าฉันไม่เคยทำให้เกิดข้อผิดพลาดประเภทนี้ในสคริปต์ของฉัน
Michael Osofsky

2
ตามบันทึกขั้นตอนการปรับใช้จะดาวน์โหลดทั้ง result.txt จากขั้นตอนการสร้างและการทดสอบ แต่ขั้นตอนต่อมาจะเขียนทับขั้นตอนก่อนหน้า
ชวน

2
BTW ไม่ได้สัมผัสสิ่งประดิษฐ์ดั้งเดิมและสามารถดาวน์โหลดได้จาก CI / CD -> ไปป์ไลน์เสมอจากนั้นคลิกปุ่มดรอปดาวน์สำหรับ Artifacts ทางด้านขวาคุณจะพบสิ่งประดิษฐ์ทั้งหมดของทุกขั้นตอน
ชวน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.