OhadP
OhadP

Reputation: 81

CI for a monorepo with Jenkins and BlueOcean

I'm trying to figure out what options do I have, when trying to build a good pipeline for CICD for a monorepo, I'm trying to have something like this (this is only a pseudo pipeline) and not really what I'm using ATM in my monorepo (or what I will have).

enter image description here

Explanation:

Pre: understand what I should build, test, etc.. Build dynamically a parallel step which will give me the later explained capabilities.

Foo: run the parallel and comfortably wait:)

This is the only way I thought of getting this features:

* Build process among the P’s can be shared and I can generate some waitUntil statements
  to make this works, I guess...

* Every P’s is independent from the other, if one Ut of P2 fails f.e, it doesn't affect the other progress
  of the pipeline, or if I want, it's only a failFast configuration 

* Every step within the way is again not related to the progress of other P’s,
  so when Ut finishes in any of the P's it starts immediately it's St. 
  (thought this might changed according to some configuration I'll probably need)

The main problems with that is:

1. I'm losing the control the Restart single steps (since I can only restart Top level steps)

2. It requires me to do a lot more with Scripted Pipeline, which looks like the support of BlueOcean
   (which is kind of critical to me), is questionable...
   seems that BlueOcean is more supported within the scope of the Declarative Pipeline.

NOTE: It probably looks like I can split every P’s to a another jenkins job but, this will require me to wait a lot of time in checkout workspace+preparation of the monorepo, and like I said the "build" step may have shared between the P’s and it's more efficient to do this like that

I will appreciate every feedback or any suggestion:)

Upvotes: 2

Views: 472

Answers (1)

MaratC
MaratC

Reputation: 6889

There's no problem whatsoever with doing what you want with a Declarative pipeline, since stage can have a stages child. So:

pipeline {

  stages { 
    stage("Pre") { }
    stage("Foo") {
      parallel {
        stage ("P1") {
          stages {
            stage("P1-Build") {}
            stage("P1-Ut") {}
            stage("P1-St") {}
          }
        }
        stage ("P2") {
          stages {
            stage("P2-Build") {}
            stage("P2-Ut") {}
          }
        }
    // etc..

Stages P1..P4 will run in parallel but within each their Build-unittest-test stages will run sequentially.

You won't be able to restart separate stages but it's not a good feature anyway.

Upvotes: 1

Related Questions