Apakah mungkin untuk "mengunci" kelompok pekerjaan di berbagai pipa gitlab

11

Saya memiliki banyak pekerjaan yang bekerja dengan satu sumber daya eksternal (server). Pekerjaan pertama menyebarkan aplikasi ke lingkungan, menjalankan tes kedua di lingkungan ini, melakukan pengujian integrasi ketiga di lingkungan ini.

Saya tahu ada opsi grup Sumber Daya . Tapi itu hanya mengunci pekerjaan. Jika dua pipa berjalan bersamaan saya harus menjalankan job1, job2, job3dari pipa pertama dan hanya ketika rilis pipa sumber pertama - pipa kedua dapat memulai jobs1-3. Apakah ada cara untuk mencapai ini? Ada pekerjaan lain dalam pipa - mereka harus bekerja secara bersamaan.

Zufar Muhamadeev
sumber

Jawaban:

1

Siapkan pelari khusus untuk pekerjaan1-3.

  1. Siapkan pelari baru dengan tag unik misalnya 'jobs-1-2-3' dan atur opsi concurrentmenjadi1 .

  2. Tambahkan tag unik misalnya 'pekerjaan-1-2-3' ke pekerjaan yang dimaksud.

    job1:
      tags:
        - jobs-1-2-3
    job2:
      tags:
        - jobs-1-2-3
    job3:
      tags:
        - jobs-1-2-3
    

IMHO ini kurang usaha dan lebih dapat diandalkan.

RiWe
sumber
Tidak yakin itu akan berhasil. Skenario yang mungkin: pipeline1 (p1) jalankan job1 (j1), kemudian pipeline2 (p2) jalankan job1 (j1), kemudian pipa 1 mulai job2. Saya perlu menjalankan p1 j1, j2, j3 kemudian p2 menjalankan j1, j2, j3. Sepertinya grup sumber daya akan melakukan hal yang sama
Zufar Muhamadeev
Karena pelari baru akan memproses hanya satu pekerjaan pada satu waktu dan karena tag unik tidak ada pelari lain akan memilih pekerjaan, dipastikan p2 menunggu p1 selesai. Lihat juga docs.gitlab.com/ee/user/project/pipelines/…
RiWe
Saya tidak ingin membatalkan pipa yang tertunda. Seperti yang saya katakan ada pekerjaan lain - mereka harus bekerja secara bersamaan. Jadi, apakah Anda bersaing jika dua pipa berjalan dan opsi bersamaan disetel - pelari akan selalu memilih pekerjaan dari pipa pertama?
Zufar Muhamadeev
Ya, pelari akan menyelesaikan pekerjaan di p1 sebelum memproses pekerjaan dari p2.
RiWe
Pendekatan ini bekerja sejauh ini
Zufar Muhamadeev
0

Saya pikir itu dapat dilaksanakan melalui needsdan resource_groupkata kunci dan gitlab API.

Setiap pekerjaan menerima id pipa yang menjadi miliknya predefined-variable. Jika Anda menggunakan api gitlab, Anda dapat melihat status pekerjaan lain di dalam pipa. Jika Anda dapat menggunakan status ini, needsdan resource_groupkata kunci saya pikir Anda dapat mencapai apa yang Anda inginkan. Lihat deskripsi kode di bawah ini dan komentarnya untuk lebih jelasnya.

stages:
  - ready
  - build

job1:
  stage: build
  needs: [starting_signal]
  script: 
    - sleep 10 && echo "job1"
job2:
  stage: build
  needs: [starting_signal]
  script:
    - sleep 20 && echo "job2"
job3:
  stage: build
  needs: [starting_signal]
  script:
    - sleep 30 && echo "job3"

starting_signal:
  stage: ready
  script:
    - # TODO: You need to implement it using the GitLab API.
    - # The starting condition for "job1-3" is
    - # that this `starting_signal` job finished successfully.
    - # And the condition that ends with the success of this job
    - # is that `traffic_light` becomes running.

traffic_light: 
  stage: ready
  resource_group: traffic_light
  script:
    - # TODO: You need to implement it using the GitLab API.
    - # The end condition for `traffic_light` is
    - # the end of job1-3 execution.
    - # In other words, this job must be checked and waited
    - # through gitlab api until job 1,2,3 is finished.
    - # Since this job locks the execution of a `traffic_light` job
    - # in another pipeline, the `starting_signal` job in another 
    - # pipeline does not succeed.

(Saya tidak mengujinya sendiri, jadi metode ini perlu ditinjau.)

Referenecs:

aluc
sumber
Terima kasih atas jawaban anda. Jika saya mengerti benar dalam traffic_lightpekerjaan saya harus menunggu penyelesaian pelaksanaan job1-3 dalam pipa bersamaan. Apa yang saya tidak suka dalam pendekatan ini - menit Anda akan terbuang untuk memeriksa status pipa bersamaan.
Zufar Muhamadeev
Jika Anda khawatir tentang ci menit, Anda dapat menggunakan gitlab-runner yang di-host sendiri untuk traffic_lightmenggunakan tagskata kunci. Banyak vendor cloud saat ini menyediakan contoh tingkat gratis, yang cukup untuk menjalankan pekerjaan tunggu sederhana seperti traffic_light.
aluc
Sepertinya gitlab menghitung menit bahkan pada pelari yang di-host sendiri. Saya mencoba untuk mencoba lagi pekerjaan yang memiliki tag untuk pelari yang di-host-sendiri - tetapi tidak meluncurkan dan menampilkan pesan tentang batas menit pipa melebihi: i.imgur.com/vBftxmk.png
Zufar Muhamadeev
1
Jika terkait dengan masalah ini ( gitlab.com/gitlab-org/gitlab-foss/issues/58942 ), tampaknya pelari spesifik tidak berfungsi setelah kuota terlampaui. Saya tidak yakin apakah ini jelas, tetapi ini tidak terkait langsung dengan pertanyaan awal Anda, jadi saya sarankan memposting pertanyaan terpisah di sini atau di gitlab.
aluc