[XEN PATCH 3/3] CI: New stage "containers" to rebuild some containers

Anthony PERARD posted 3 patches 5 days, 21 hours ago
There is a newer version of this series
[XEN PATCH 3/3] CI: New stage "containers" to rebuild some containers
Posted by Anthony PERARD 5 days, 21 hours ago
Rebuild rolling release containers when XEN_CI_REBUILD_CONTAINERS is
set. This is to be use with a scheduled pipeline.

When $XEN_CI_REBUILD_CONTAINERS is set, only build jobs related to the
containers been rebuild will be executed.

Build jobs that are using one of the containers been rebuild should
wait for the container to be rebuild. If it's a normal pipeline, those
dependency are simply ignored.

Signed-off-by: Anthony PERARD <anthony.perard@vates.tech>
---
 .gitlab-ci.yml                       |  2 +
 automation/gitlab-ci/build.yaml      | 57 ++++++++++++++++++----------
 automation/gitlab-ci/containers.yaml | 29 ++++++++++++++
 automation/gitlab-ci/test.yaml       | 13 +++++++
 4 files changed, 81 insertions(+), 20 deletions(-)
 create mode 100644 automation/gitlab-ci/containers.yaml

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 941e5822e8..dab9171086 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -8,11 +8,13 @@ workflow:
     - when: always
 
 stages:
+  - containers
   - analyze
   - build
   - test
 
 include:
+  - 'automation/gitlab-ci/containers.yaml'
   - 'automation/gitlab-ci/analyze.yaml'
   - 'automation/gitlab-ci/build.yaml'
   - 'automation/gitlab-ci/test.yaml'
diff --git a/automation/gitlab-ci/build.yaml b/automation/gitlab-ci/build.yaml
index 1ca6764225..e01eec1423 100644
--- a/automation/gitlab-ci/build.yaml
+++ b/automation/gitlab-ci/build.yaml
@@ -3,6 +3,9 @@
   image: ${XEN_REGISTRY}/${CONTAINER}
   script:
     - ./automation/scripts/build 2>&1 | tee build.log
+  rules:
+    - if: $XEN_CI_REBUILD_CONTAINERS && $XEN_CI_RUN_AFTER_CONTAINER_BUILD
+    - if: $XEN_CI_REBUILD_CONTAINERS == null
   artifacts:
     paths:
       - binaries/
@@ -255,6 +258,8 @@
 .test-jobs-artifact-common:
   stage: build
   needs: []
+  rules:
+    - if: $XEN_CI_REBUILD_CONTAINERS == null
 
 # Arm test artifacts
 
@@ -516,17 +521,24 @@ alpine-3.18-clang-debug:
   variables:
     CONTAINER: alpine:3.18
 
-archlinux-gcc:
-  extends: .gcc-x86-64-build
+.container-archlinux-current:
   variables:
     CONTAINER: archlinux:current
+    XEN_CI_RUN_AFTER_CONTAINER_BUILD: true
+  needs:
+    - job: container-archlinux-current
+      optional: true
   allow_failure: true
 
+archlinux-gcc:
+  extends:
+    - .gcc-x86-64-build
+    - .container-archlinux-current
+
 archlinux-gcc-debug:
-  extends: .gcc-x86-64-build-debug
-  variables:
-    CONTAINER: archlinux:current
-  allow_failure: true
+  extends:
+    - .gcc-x86-64-build-debug
+    - .container-archlinux-current
 
 centos-7-gcc:
   extends: .gcc-x86-64-build
@@ -657,29 +669,34 @@ opensuse-leap-15.6-gcc-debug:
   variables:
     CONTAINER: opensuse:leap-15.6-x86_64
 
-opensuse-tumbleweed-clang:
-  extends: .clang-x86-64-build
+.container-opensuse-tumbleweed-x86_64:
   variables:
     CONTAINER: opensuse:tumbleweed-x86_64
+    XEN_CI_RUN_AFTER_CONTAINER_BUILD: true
+  needs:
+    - job: container-opensuse-tumbleweed-x86_64
+      optional: true
   allow_failure: true
 
+opensuse-tumbleweed-clang:
+  extends:
+    - .clang-x86-64-build
+    - .container-opensuse-tumbleweed-x86_64
+
 opensuse-tumbleweed-clang-debug:
-  extends: .clang-x86-64-build-debug
-  variables:
-    CONTAINER: opensuse:tumbleweed-x86_64
-  allow_failure: true
+  extends:
+    - .clang-x86-64-build-debug
+    - .container-opensuse-tumbleweed-x86_64
 
 opensuse-tumbleweed-gcc:
-  extends: .gcc-x86-64-build
-  variables:
-    CONTAINER: opensuse:tumbleweed-x86_64
-  allow_failure: true
+  extends:
+    - .gcc-x86-64-build
+    - .container-opensuse-tumbleweed-x86_64
 
 opensuse-tumbleweed-gcc-debug:
-  extends: .gcc-x86-64-build-debug
-  variables:
-    CONTAINER: opensuse:tumbleweed-x86_64
-  allow_failure: true
+  extends:
+    - .gcc-x86-64-build-debug
+    - .container-opensuse-tumbleweed-x86_64
 
 # PowerPC builds (x86 cross)
 debian-11-ppc64le-gcc:
diff --git a/automation/gitlab-ci/containers.yaml b/automation/gitlab-ci/containers.yaml
new file mode 100644
index 0000000000..25e8bdc34b
--- /dev/null
+++ b/automation/gitlab-ci/containers.yaml
@@ -0,0 +1,29 @@
+.container-build-tmpl:
+  stage: containers
+  image: docker:stable
+  tags:
+    - container-builder
+  rules:
+    - if: $XEN_CI_REBUILD_CONTAINERS
+  services:
+    - docker:dind
+  before_script:
+    - apk add make
+    - docker info
+    - docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
+  script:
+    - make -C automation/build PUSH=1 REGISTRY=${XEN_REGISTRY} ${CONTAINER/:/\/}
+  after_script:
+    - docker logout
+
+container-archlinux-current:
+  extends:
+    - .container-build-tmpl
+  variables:
+    CONTAINER: "archlinux:current"
+
+container-opensuse-tumbleweed-x86_64:
+  extends:
+    - .container-build-tmpl
+  variables:
+    CONTAINER: "opensuse:tumbleweed-x86_64"
diff --git a/automation/gitlab-ci/test.yaml b/automation/gitlab-ci/test.yaml
index 1822e3ea5f..e4d4f1f3c9 100644
--- a/automation/gitlab-ci/test.yaml
+++ b/automation/gitlab-ci/test.yaml
@@ -1,6 +1,16 @@
+.test-rules:
+  # Only add rules which prevent jobs from been added to the pipeline. They
+  # should all have "when: never".
+  pre_rules:
+    - if: $XEN_CI_REBUILD_CONTAINERS
+      when: never
+
 .test-jobs-common:
   stage: test
   image: ${XEN_REGISTRY}/${CONTAINER}
+  rules:
+    - !reference [.test-rules, pre_rules]
+    - when: always
 
 .arm64-test-needs: &arm64-test-needs
   - alpine-3.18-arm64-rootfs-export
@@ -99,6 +109,7 @@
       - '*.dtb'
     when: always
   rules:
+    - !reference [.test-rules, pre_rules]
     - if: $XILINX_JOBS == "true" && $CI_COMMIT_REF_PROTECTED == "true"
   tags:
     - xilinx
@@ -117,6 +128,7 @@
       - '*.log'
     when: always
   rules:
+    - !reference [.test-rules, pre_rules]
     - if: $XILINX_JOBS == "true" && $CI_COMMIT_REF_PROTECTED == "true"
   tags:
     - xilinx
@@ -136,6 +148,7 @@
       - '*.log'
     when: always
   rules:
+    - !reference [.test-rules, pre_rules]
     - if: $QUBES_JOBS == "true" && $CI_COMMIT_REF_PROTECTED == "true"
   tags:
     - qubes-hw2
-- 


Anthony Perard | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech
Re: [XEN PATCH 3/3] CI: New stage "containers" to rebuild some containers
Posted by Stefano Stabellini 5 days, 14 hours ago
On Fri, 15 Nov 2024, Anthony PERARD wrote:
> Rebuild rolling release containers when XEN_CI_REBUILD_CONTAINERS is
> set. This is to be use with a scheduled pipeline.
> 
> When $XEN_CI_REBUILD_CONTAINERS is set, only build jobs related to the
> containers been rebuild will be executed.
> 
> Build jobs that are using one of the containers been rebuild should
> wait for the container to be rebuild. If it's a normal pipeline, those
> dependency are simply ignored.

This is a fantastic contribution, thanks Anthony!

I think we can simplify this patch by removing all stages except for
"containers" on the scheduled pipeline with XEN_CI_REBUILD_CONTAINERS
set to true.

I think it is a good idea to have a special schedule pipeline for this,
and we should exploit the fact that it is special and only use it to
rebuild the containers. If we want to, we can have a second scheduled
pipeline to do a full normal run afterwards.

This way, there is no need to carry the changes to build.yaml or
test.yaml that are a bit hard to read/understand for someone unfamiliar
with gitlab. When XEN_CI_REBUILD_CONTAINERS == true we only do the
containers stage.


> Signed-off-by: Anthony PERARD <anthony.perard@vates.tech>
> ---
>  .gitlab-ci.yml                       |  2 +
>  automation/gitlab-ci/build.yaml      | 57 ++++++++++++++++++----------
>  automation/gitlab-ci/containers.yaml | 29 ++++++++++++++
>  automation/gitlab-ci/test.yaml       | 13 +++++++
>  4 files changed, 81 insertions(+), 20 deletions(-)
>  create mode 100644 automation/gitlab-ci/containers.yaml
> 
> diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
> index 941e5822e8..dab9171086 100644
> --- a/.gitlab-ci.yml
> +++ b/.gitlab-ci.yml
> @@ -8,11 +8,13 @@ workflow:
>      - when: always
>  
>  stages:
> +  - containers
>    - analyze
>    - build
>    - test
>  
>  include:
> +  - 'automation/gitlab-ci/containers.yaml'
>    - 'automation/gitlab-ci/analyze.yaml'
>    - 'automation/gitlab-ci/build.yaml'
>    - 'automation/gitlab-ci/test.yaml'
> diff --git a/automation/gitlab-ci/build.yaml b/automation/gitlab-ci/build.yaml
> index 1ca6764225..e01eec1423 100644
> --- a/automation/gitlab-ci/build.yaml
> +++ b/automation/gitlab-ci/build.yaml
> @@ -3,6 +3,9 @@
>    image: ${XEN_REGISTRY}/${CONTAINER}
>    script:
>      - ./automation/scripts/build 2>&1 | tee build.log
> +  rules:
> +    - if: $XEN_CI_REBUILD_CONTAINERS && $XEN_CI_RUN_AFTER_CONTAINER_BUILD
> +    - if: $XEN_CI_REBUILD_CONTAINERS == null
>    artifacts:
>      paths:
>        - binaries/
> @@ -255,6 +258,8 @@
>  .test-jobs-artifact-common:
>    stage: build
>    needs: []
> +  rules:
> +    - if: $XEN_CI_REBUILD_CONTAINERS == null
>  
>  # Arm test artifacts
>  
> @@ -516,17 +521,24 @@ alpine-3.18-clang-debug:
>    variables:
>      CONTAINER: alpine:3.18
>  
> -archlinux-gcc:
> -  extends: .gcc-x86-64-build
> +.container-archlinux-current:
>    variables:
>      CONTAINER: archlinux:current
> +    XEN_CI_RUN_AFTER_CONTAINER_BUILD: true
> +  needs:
> +    - job: container-archlinux-current
> +      optional: true
>    allow_failure: true
>  
> +archlinux-gcc:
> +  extends:
> +    - .gcc-x86-64-build
> +    - .container-archlinux-current
> +
>  archlinux-gcc-debug:
> -  extends: .gcc-x86-64-build-debug
> -  variables:
> -    CONTAINER: archlinux:current
> -  allow_failure: true
> +  extends:
> +    - .gcc-x86-64-build-debug
> +    - .container-archlinux-current
>  
>  centos-7-gcc:
>    extends: .gcc-x86-64-build
> @@ -657,29 +669,34 @@ opensuse-leap-15.6-gcc-debug:
>    variables:
>      CONTAINER: opensuse:leap-15.6-x86_64
>  
> -opensuse-tumbleweed-clang:
> -  extends: .clang-x86-64-build
> +.container-opensuse-tumbleweed-x86_64:
>    variables:
>      CONTAINER: opensuse:tumbleweed-x86_64
> +    XEN_CI_RUN_AFTER_CONTAINER_BUILD: true
> +  needs:
> +    - job: container-opensuse-tumbleweed-x86_64
> +      optional: true
>    allow_failure: true
>  
> +opensuse-tumbleweed-clang:
> +  extends:
> +    - .clang-x86-64-build
> +    - .container-opensuse-tumbleweed-x86_64
> +
>  opensuse-tumbleweed-clang-debug:
> -  extends: .clang-x86-64-build-debug
> -  variables:
> -    CONTAINER: opensuse:tumbleweed-x86_64
> -  allow_failure: true
> +  extends:
> +    - .clang-x86-64-build-debug
> +    - .container-opensuse-tumbleweed-x86_64
>  
>  opensuse-tumbleweed-gcc:
> -  extends: .gcc-x86-64-build
> -  variables:
> -    CONTAINER: opensuse:tumbleweed-x86_64
> -  allow_failure: true
> +  extends:
> +    - .gcc-x86-64-build
> +    - .container-opensuse-tumbleweed-x86_64
>  
>  opensuse-tumbleweed-gcc-debug:
> -  extends: .gcc-x86-64-build-debug
> -  variables:
> -    CONTAINER: opensuse:tumbleweed-x86_64
> -  allow_failure: true
> +  extends:
> +    - .gcc-x86-64-build-debug
> +    - .container-opensuse-tumbleweed-x86_64
>  
>  # PowerPC builds (x86 cross)
>  debian-11-ppc64le-gcc:
> diff --git a/automation/gitlab-ci/containers.yaml b/automation/gitlab-ci/containers.yaml
> new file mode 100644
> index 0000000000..25e8bdc34b
> --- /dev/null
> +++ b/automation/gitlab-ci/containers.yaml
> @@ -0,0 +1,29 @@
> +.container-build-tmpl:
> +  stage: containers
> +  image: docker:stable
> +  tags:
> +    - container-builder
> +  rules:
> +    - if: $XEN_CI_REBUILD_CONTAINERS
> +  services:
> +    - docker:dind
> +  before_script:
> +    - apk add make
> +    - docker info
> +    - docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
> +  script:
> +    - make -C automation/build PUSH=1 REGISTRY=${XEN_REGISTRY} ${CONTAINER/:/\/}
> +  after_script:
> +    - docker logout
> +
> +container-archlinux-current:
> +  extends:
> +    - .container-build-tmpl
> +  variables:
> +    CONTAINER: "archlinux:current"
> +
> +container-opensuse-tumbleweed-x86_64:
> +  extends:
> +    - .container-build-tmpl
> +  variables:
> +    CONTAINER: "opensuse:tumbleweed-x86_64"
> diff --git a/automation/gitlab-ci/test.yaml b/automation/gitlab-ci/test.yaml
> index 1822e3ea5f..e4d4f1f3c9 100644
> --- a/automation/gitlab-ci/test.yaml
> +++ b/automation/gitlab-ci/test.yaml
> @@ -1,6 +1,16 @@
> +.test-rules:
> +  # Only add rules which prevent jobs from been added to the pipeline. They
> +  # should all have "when: never".
> +  pre_rules:
> +    - if: $XEN_CI_REBUILD_CONTAINERS
> +      when: never
> +
>  .test-jobs-common:
>    stage: test
>    image: ${XEN_REGISTRY}/${CONTAINER}
> +  rules:
> +    - !reference [.test-rules, pre_rules]
> +    - when: always
>  
>  .arm64-test-needs: &arm64-test-needs
>    - alpine-3.18-arm64-rootfs-export
> @@ -99,6 +109,7 @@
>        - '*.dtb'
>      when: always
>    rules:
> +    - !reference [.test-rules, pre_rules]
>      - if: $XILINX_JOBS == "true" && $CI_COMMIT_REF_PROTECTED == "true"
>    tags:
>      - xilinx
> @@ -117,6 +128,7 @@
>        - '*.log'
>      when: always
>    rules:
> +    - !reference [.test-rules, pre_rules]
>      - if: $XILINX_JOBS == "true" && $CI_COMMIT_REF_PROTECTED == "true"
>    tags:
>      - xilinx
> @@ -136,6 +148,7 @@
>        - '*.log'
>      when: always
>    rules:
> +    - !reference [.test-rules, pre_rules]
>      - if: $QUBES_JOBS == "true" && $CI_COMMIT_REF_PROTECTED == "true"
>    tags:
>      - qubes-hw2
> -- 
> 
> 
> Anthony Perard | Vates XCP-ng Developer
> 
> XCP-ng & Xen Orchestra - Vates solutions
> 
> web: https://vates.tech
>
Re: [XEN PATCH 3/3] CI: New stage "containers" to rebuild some containers
Posted by Anthony PERARD 3 days ago
On Fri, Nov 15, 2024 at 04:34:21PM -0800, Stefano Stabellini wrote:
> On Fri, 15 Nov 2024, Anthony PERARD wrote:
> > Rebuild rolling release containers when XEN_CI_REBUILD_CONTAINERS is
> > set. This is to be use with a scheduled pipeline.
> > 
> > When $XEN_CI_REBUILD_CONTAINERS is set, only build jobs related to the
> > containers been rebuild will be executed.
> > 
> > Build jobs that are using one of the containers been rebuild should
> > wait for the container to be rebuild. If it's a normal pipeline, those
> > dependency are simply ignored.
> 
> This is a fantastic contribution, thanks Anthony!
> 
> I think we can simplify this patch by removing all stages except for
> "containers" on the scheduled pipeline with XEN_CI_REBUILD_CONTAINERS
> set to true.
> 
> I think it is a good idea to have a special schedule pipeline for this,
> and we should exploit the fact that it is special and only use it to
> rebuild the containers. If we want to, we can have a second scheduled
> pipeline to do a full normal run afterwards.
> 
> This way, there is no need to carry the changes to build.yaml or
> test.yaml that are a bit hard to read/understand for someone unfamiliar
> with gitlab. When XEN_CI_REBUILD_CONTAINERS == true we only do the
> containers stage.

So, you mean having this following change instead of make changes to
build.yaml and test.yaml, right?

    diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
    --- a/.gitlab-ci.yml
    +++ b/.gitlab-ci.yml
    @@ -14,7 +14,15 @@ stages:
       - test
     
     include:
    -  - 'automation/gitlab-ci/containers.yaml'
    -  - 'automation/gitlab-ci/analyze.yaml'
    -  - 'automation/gitlab-ci/build.yaml'
    -  - 'automation/gitlab-ci/test.yaml'
    +  - local: 'automation/gitlab-ci/containers.yaml'
    +    rules:
    +      - if: $XEN_CI_REBUILD_CONTAINERS
    +  - local: 'automation/gitlab-ci/analyze.yaml'
    +    rules:
    +      - if: $XEN_CI_REBUILD_CONTAINERS == null
    +  - local: 'automation/gitlab-ci/build.yaml'
    +    rules:
    +      - if: $XEN_CI_REBUILD_CONTAINERS == null
    +  - local: 'automation/gitlab-ci/test.yaml'
    +    rules:
    +      - if: $XEN_CI_REBUILD_CONTAINERS == null


Or I guess we can also compare to the string "true" and write the
expression as
    if: $XEN_CI_REBUILD_CONTAINERS == "true"
and
    if: $XEN_CI_REBUILD_CONTAINERS != "true"

Cheers,

-- 

Anthony Perard | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech
Re: [XEN PATCH 3/3] CI: New stage "containers" to rebuild some containers
Posted by Stefano Stabellini 2 days, 14 hours ago
On Mon, 18 Nov 2024, Anthony PERARD wrote:
> On Fri, Nov 15, 2024 at 04:34:21PM -0800, Stefano Stabellini wrote:
> > On Fri, 15 Nov 2024, Anthony PERARD wrote:
> > > Rebuild rolling release containers when XEN_CI_REBUILD_CONTAINERS is
> > > set. This is to be use with a scheduled pipeline.
> > > 
> > > When $XEN_CI_REBUILD_CONTAINERS is set, only build jobs related to the
> > > containers been rebuild will be executed.
> > > 
> > > Build jobs that are using one of the containers been rebuild should
> > > wait for the container to be rebuild. If it's a normal pipeline, those
> > > dependency are simply ignored.
> > 
> > This is a fantastic contribution, thanks Anthony!
> > 
> > I think we can simplify this patch by removing all stages except for
> > "containers" on the scheduled pipeline with XEN_CI_REBUILD_CONTAINERS
> > set to true.
> > 
> > I think it is a good idea to have a special schedule pipeline for this,
> > and we should exploit the fact that it is special and only use it to
> > rebuild the containers. If we want to, we can have a second scheduled
> > pipeline to do a full normal run afterwards.
> > 
> > This way, there is no need to carry the changes to build.yaml or
> > test.yaml that are a bit hard to read/understand for someone unfamiliar
> > with gitlab. When XEN_CI_REBUILD_CONTAINERS == true we only do the
> > containers stage.
> 
> So, you mean having this following change instead of make changes to
> build.yaml and test.yaml, right?
> 
>     diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
>     --- a/.gitlab-ci.yml
>     +++ b/.gitlab-ci.yml
>     @@ -14,7 +14,15 @@ stages:
>        - test
>      
>      include:
>     -  - 'automation/gitlab-ci/containers.yaml'
>     -  - 'automation/gitlab-ci/analyze.yaml'
>     -  - 'automation/gitlab-ci/build.yaml'
>     -  - 'automation/gitlab-ci/test.yaml'
>     +  - local: 'automation/gitlab-ci/containers.yaml'
>     +    rules:
>     +      - if: $XEN_CI_REBUILD_CONTAINERS
>     +  - local: 'automation/gitlab-ci/analyze.yaml'
>     +    rules:
>     +      - if: $XEN_CI_REBUILD_CONTAINERS == null
>     +  - local: 'automation/gitlab-ci/build.yaml'
>     +    rules:
>     +      - if: $XEN_CI_REBUILD_CONTAINERS == null
>     +  - local: 'automation/gitlab-ci/test.yaml'
>     +    rules:
>     +      - if: $XEN_CI_REBUILD_CONTAINERS == null
> 
> 
> Or I guess we can also compare to the string "true" and write the
> expression as
>     if: $XEN_CI_REBUILD_CONTAINERS == "true"
> and
>     if: $XEN_CI_REBUILD_CONTAINERS != "true"

Yes exactly, either one of the above is fine!

It is much simpler and clearer than having to add (admittedly
non-obvious) checks to build.yaml and test.yaml.

Thanks!