From 20612f30a3630be0050bbf4abab0632c17aed075 Mon Sep 17 00:00:00 2001
From: Geoffrey Arthaud <geoffrey.arthaud@developpement-durable.gouv.fr>
Date: Tue, 16 Jul 2024 08:43:21 +0200
Subject: [PATCH] Refactored CI

---
 .gitlab-ci.yml | 96 +++++++++++++++++++++++++++-----------------------
 1 file changed, 51 insertions(+), 45 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 519f2d6..ca5add7 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,5 +1,11 @@
+workflow:
+  rules:
+    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+    - if: $CI_COMMIT_TAG
+
 variables:
-  RUST_VERSION: "1.76" # slim or alpine not adapted because of openSSL dependency
+  RUST_VERSION: "1.79" # slim or alpine not adapted because of openSSL dependency
   TARGET_ARCH: default
   CARGO_HOME: .cargo
   TEST_OPTIONS: --url $CI_PROJECT_URL -a
@@ -14,30 +20,47 @@ default:
     policy: pull-push
 
 stages:
+  - prepare
   - build_test
   - release
   - deploy
   - deploy_test
 
 include:
-  - remote: 'https://gitlab.com/r2devops/hub/-/raw/docker_build@2.0.2/jobs/docker_build/docker_build.yml'
-  - remote: 'https://gitlab.com/r2devops/hub/-/raw/gitleaks@1.2.2/jobs/gitleaks/gitleaks.yml'
-
-gitleaks:
-  stage: build_test
+  - component: ${CI_SERVER_FQDN}/share/components/oci-copier/crane@~latest
+    inputs:
+      as: copy-image-rust
+      stage: prepare
+      imageNameToCopy: rust
+      imageTagToCopy: $RUST_VERSION
+      copiedImageDigest: "RUST"
+  - component: $CI_SERVER_FQDN/share/components/oci-builder/podman@~latest
+    inputs:
+      as: release-gpd-image
+      stage: deploy
+      targetImageAppName: ${CI_PROJECT_NAME}
+      targetImageAppTag: $VERSION
+      targetImageRegistry: ${CI_REGISTRY}/${CI_PROJECT_NAMESPACE}
+      targetImageRegistryDigestName: "GPD"
+      forceBuild: true
+      Dockerfile: ${CI_PROJECT_DIR}/Dockerfile
+
+release-gpd-image:
+  needs:
+    - release-linux
   cache: [ ]
+  rules:
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+    - if: $CI_COMMIT_TAG
 
 check-format:
   stage: build_test
-  image: rust:$RUST_VERSION
+  image: ${REGISTRY_IMAGE_RUST}
   script:
     - rustup component add rustfmt
     - rustup component add clippy
     - cargo fmt --all -- --check
     - cargo clippy -- -D warnings
-  rules:
-    - if: $CI_COMMIT_REF_NAME == 'main'
-    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
 
 test-rust-current:
   stage: build_test
@@ -46,16 +69,15 @@ test-rust-current:
     - cargo test --verbose
     - cargo run -- $TEST_OPTIONS
   allow_failure: true
-  rules:
-    - if: $CI_COMMIT_REF_NAME == 'main'
-    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
 
 test-rust-nightly:
   extends: test-rust-current
   image: rustlang/rust:nightly
+  allow_failure: true
 
 test-clean-rust-current:
   extends: test-rust-current
+  allow_failure: true
   variables:
     TEST_OPTIONS: $CLEAN_OPTIONS
 
@@ -68,18 +90,25 @@ test-clean-rust-current:
     - rustup target add $TARGET_ARCH
     - cargo build $CARGO_OPTS --target $TARGET_ARCH --release
     - if [ -z "$NO_POSTPROCESS" ]; then strip $TARGET; $LDD_CMD $TARGET; $TARGET $TEST_OPTIONS; fi
-    - 'if [ -z "$DEBUG" ]; then curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file $TARGET "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/$TARGET_ARCH/${CI_COMMIT_TAG:-latest}/$APP_NAME"; fi'
+    - export VERSION=${CI_COMMIT_TAG:-latest}
+    - echo "VERSION=${VERSION}" > release.env
+    - 'if [ -z "$DEBUG" ]; then curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file $TARGET "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/$TARGET_ARCH/${VERSION}/$APP_NAME"; fi'
   artifacts:
     paths:
       - $TARGET
+    reports:
+      dotenv: release.env
   allow_failure: true
   rules:
-    - if: $CI_COMMIT_REF_NAME == 'main'
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
     - if: $CI_COMMIT_TAG
+  needs:
+    - copy-image-rust
+    - test-rust-current
 
 release-linux:
   extends: .rust-release
-  image: rust:$RUST_VERSION
+  image: ${REGISTRY_IMAGE_RUST}
   variables:
     TARGET_ARCH: x86_64-unknown-linux-musl
     LDD_CMD: ldd
@@ -107,7 +136,7 @@ release-macos-x86:
 
 release-windows:
   extends: .rust-release
-  image: rust:$RUST_VERSION
+  image: ${REGISTRY_IMAGE_RUST}
   variables:
     TARGET_ARCH: x86_64-pc-windows-gnu
     APP_NAME: gitlab-project-doctor.exe
@@ -116,18 +145,6 @@ release-windows:
     - apt-get update
     - apt-get install -y lld gcc-mingw-w64-x86-64
 
-docker_build:
-  stage: deploy
-  variables:
-    COMMIT_CREATE_LATEST: "false"
-    IMAGE_TAG: "v1.19.2-debug"
-  retry: 2
-  needs:
-    - release-linux
-  cache: [ ]
-  rules:
-    - if: $CI_COMMIT_REF_NAME == 'main'
-
 test-release-docker:
   stage: deploy_test
   image: $CI_REGISTRY/pub/numeco/gitlab-project-doctor:$CI_COMMIT_SHA
@@ -135,9 +152,10 @@ test-release-docker:
     - gitlab-project-doctor --url $CI_PROJECT_URL -a
   cache: [ ]
   needs:
-    - docker_build
+    - release-gpd-image
   rules:
-    - if: $CI_COMMIT_REF_NAME == 'main'
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+    - if: $CI_COMMIT_TAG
 
 test-release-linux:
   stage: deploy_test
@@ -149,17 +167,5 @@ test-release-linux:
     - chmod +x gitlab-project-doctor
     - ./gitlab-project-doctor --url $CI_PROJECT_URL -a
   rules:
-    - if: $CI_COMMIT_REF_NAME == 'main'
-
-docker_build-prod:
-  stage: deploy
-  extends: docker_build
-  variables:
-    COMMIT_CREATE_LATEST: "true"
-    IMAGE_TAG: "v1.19.2-debug"
-  retry: 2
-  needs:
-    - release-linux
-  cache: [ ]
-  rules:
-    - if: $CI_COMMIT_TAG
\ No newline at end of file
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+    - if: $CI_COMMIT_TAG
-- 
GitLab