Bagaimana cara mengirimkan artefak ke tahap lain?

107

Saya ingin menggunakan GitLab CI dengan file .gitlab-ci.yml untuk menjalankan tahapan berbeda dengan skrip terpisah. Tahap pertama menghasilkan alat yang harus digunakan di tahap selanjutnya untuk melakukan pengujian. Saya telah menyatakan alat yang dihasilkan sebagai artefak.

Sekarang bagaimana saya bisa menjalankan alat itu di pekerjaan tahap selanjutnya? Apa jalur yang benar, dan file apa yang akan ada di sekitarnya?

Misalnya tahap pertama membangun artefak / bin / TestTool / TestTool.exe dan direktori tersebut berisi file lain yang diperlukan (DLL dan lainnya). File .gitlab-ci.yml saya terlihat seperti ini:

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

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

Build dan tes berjalan di Windows jika itu relevan.

ygoe
sumber

Jawaban:

102

Gunakan dependencies. Dengan konfigurasi ini tahap pengujian akan mengunduh file yang tidak terlacak yang dibuat selama tahap pembuatan:

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

test:
  stage: test
  dependencies: 
    - build
  script:
    - ./Test.ps1
pengguna1495793
sumber
9
Akhirnya berhasil! Poin kuncinya di sini adalah ketergantungan harus digunakan bersama dengan artefak. Hanya artefak yang disertakan akan tersedia untuk konsumsi pada tahap selanjutnya. Tak perlu dikatakan, bersikap konservatif pada apa yang sedang diupload. Saya akan mengatakan menggunakan expire_in. Jika tidak, kami bisa menghabiskan banyak penyimpanan. Artefak ini diunggah ke gitlab dalam pekerjaan pembangunan / tahapan / langkah dan diunduh dalam pengujian.
ravikanth
18
Apakah Anda benar-benar harus menggunakan dependensi? Status dokumentasi Gitlab Note that artifacts from all previous stages are passed by default.. Pertanyaannya adalah kapan Anda perlu menggunakan dependensi.
2
Dokumentasi menjelaskan
chetbox
3
@Josef artefak dari semua tahap sebelumnya dilewatkan secara default (Bukan dari pekerjaan sebelumnya)
Vivek
1
@Josef ketika Anda tidak membutuhkan semua artefak dari semua tahapan sebelumnya untuk pekerjaan saat ini. Katakanlah Anda memiliki 10 GB biner yang dihasilkan oleh tahap pembuatan, tetapi tahap terakhir Anda hanya mengirimkan beberapa email tentang pembuatan yang berhasil - Anda tidak perlu mengunduh semua 10 GB untuk pekerjaan ini
Ezh
50

Karena artefak dari semua tahapan sebelumnya diteruskan secara default, kita hanya perlu mendefinisikan tahapan dalam urutan yang benar. Silakan coba contoh di bawah ini, yang dapat membantu pemahaman.

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

masukkan deskripsi gambar di sini

Dan jika melewati artefak di antara pekerjaan dalam tahapan yang berbeda, kita dapat menggunakan dependensi bersama dengan artefak untuk meneruskan artefak, seperti yang dijelaskan dari dokumen .

Dan satu contoh lagi yang lebih sederhana:

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
Chuan
sumber
Penjelasan yang sangat jelas, terima kasih. Jika sebuah panggung menamai artefak dengan nama yang sama dengan artefak dari panggung sebelumnya, apakah artefak aslinya akan ditimpa?
Michael Osofsky
1
@MichaelOsofsky Anda dapat menamai artefak dengan nama yang sama, artefak asli tidak akan ditimpa oleh artefak dari tahap berikutnya dengan nama yang sama. Tahap berikutnya hanya mengunduh artefak dari tahap sebelumnya, itu adalah salinannya. Saya memberi nama berbeda dalam contoh ini terutama karena pengujian unit dan integrasi akan dijalankan secara paralel. Jika kita menghapus tugas uji integrasi .eg, semua tugas akan dijalankan secara berurutan, lalu kita dapat menggunakan nama yang sama untuk semua artefak tanpa kebingungan. FYI, saya perbarui jawabannya dengan satu contoh lagi.
Chuan
Dalam contoh Anda, saya melihat Anda menambahkan result.txt. Jika Anda menimpa result.txt di pekerjaan unit_test, saya berasumsi bahwa penerapan pekerjaan tidak akan pernah memiliki akses ke konten result.txt dari pembuatan pekerjaan. Saya hanya meminta untuk memastikan bahwa saya tidak pernah menyebabkan jenis bug ini di skrip saya.
Michael Osofsky
1
Menurut log, tahap penerapan akan mendownload result.txt dari tahap build dan pengujian, tetapi tahap yang nanti akan menimpa tahap sebelumnya.
Chuan
1
BTW, artefak asli tidak tersentuh dan selalu tersedia untuk diunduh dari CI / CD -> Pipelines, lalu klik tombol tarik-turun untuk Artefak di sebelah kanan, Anda akan menemukan semua artefak dari semua tahapan.
Chuan