From c6f83c179d270ee627c50c0978b2208ae9832462 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Costa?= <andre.costa@ess.eu>
Date: Tue, 8 Apr 2025 15:18:58 +0200
Subject: [PATCH 1/2] Style: clang-format update

---
 src/FlatbufferMessage.h                          |  8 ++++----
 src/Kafka/ProducerDeliveryCb.h                   |  2 +-
 src/Metrics/CarbonSink.h                         |  2 +-
 src/Metrics/InternalMetric.h                     |  2 +-
 src/Metrics/Registrar.h                          |  2 +-
 src/NeXusDataset/AdcDatasets.h                   |  6 +++---
 src/NeXusDataset/EpicsAlarmDatasets.h            |  9 +++++----
 src/Status/StatusReporterBase.h                  |  2 +-
 src/WriterModule/ep01/ConnectionStatusDatasets.h |  2 +-
 src/WriterModuleBase.h                           |  4 ++--
 .../ReaderRegistrationTests.cpp                  | 16 ++++++++++++----
 tests/KafkaToNexusTests.cpp                      |  2 +-
 tests/MessageTests.cpp                           | 12 +++++++++---
 tests/Metrics/MetricsReporterTest.cpp            |  2 +-
 tests/Metrics/MockSink.h                         |  2 +-
 tests/NeXusDataset/NeXusDatasetTests.cpp         | 12 +++++++++---
 tests/ProducerTests.cpp                          |  6 ++----
 tests/StatusReporterTests.cpp                    |  4 ++--
 tests/helpers/KafkaMocks.h                       |  2 +-
 19 files changed, 58 insertions(+), 39 deletions(-)

diff --git a/src/FlatbufferMessage.h b/src/FlatbufferMessage.h
index dc3766446..fb56f5694 100644
--- a/src/FlatbufferMessage.h
+++ b/src/FlatbufferMessage.h
@@ -22,25 +22,25 @@ public:
 class BufferTooSmallError : public FlatbufferError {
 public:
   explicit BufferTooSmallError(const std::string &what)
-      : FlatbufferError(what){};
+      : FlatbufferError(what) {};
 };
 
 class UnknownFlatbufferID : public FlatbufferError {
 public:
   explicit UnknownFlatbufferID(const std::string &what)
-      : FlatbufferError(what){};
+      : FlatbufferError(what) {};
 };
 
 class InvalidFlatbufferTimestamp : public FlatbufferError {
 public:
   explicit InvalidFlatbufferTimestamp(const std::string &what)
-      : FlatbufferError(what){};
+      : FlatbufferError(what) {};
 };
 
 class NotValidFlatbuffer : public FlatbufferError {
 public:
   explicit NotValidFlatbuffer(const std::string &what)
-      : FlatbufferError(what){};
+      : FlatbufferError(what) {};
 };
 
 /// \brief A wrapper around a databuffer which holds a flatbuffer.
diff --git a/src/Kafka/ProducerDeliveryCb.h b/src/Kafka/ProducerDeliveryCb.h
index c5bc02e7f..6d279d65b 100644
--- a/src/Kafka/ProducerDeliveryCb.h
+++ b/src/Kafka/ProducerDeliveryCb.h
@@ -19,7 +19,7 @@ namespace Kafka {
 
 class ProducerDeliveryCb : public RdKafka::DeliveryReportCb {
 public:
-  explicit ProducerDeliveryCb(ProducerStats &Stats) : Stats(Stats){};
+  explicit ProducerDeliveryCb(ProducerStats &Stats) : Stats(Stats) {};
 
   void dr_cb(RdKafka::Message &Message) override {
     if (Message.err() != RdKafka::ERR_NO_ERROR) {
diff --git a/src/Metrics/CarbonSink.h b/src/Metrics/CarbonSink.h
index 2f8a782c7..60f352438 100644
--- a/src/Metrics/CarbonSink.h
+++ b/src/Metrics/CarbonSink.h
@@ -19,7 +19,7 @@ namespace Metrics {
 class CarbonSink : public Sink {
 public:
   CarbonSink(std::string Host, uint16_t const Port)
-      : CarbonConnection(std::move(Host), Port){};
+      : CarbonConnection(std::move(Host), Port) {};
   void reportMetric(InternalMetric &MetricToBeReported) override;
   LogTo getType() const override { return LogTo::CARBON; };
   bool isHealthy() const override;
diff --git a/src/Metrics/InternalMetric.h b/src/Metrics/InternalMetric.h
index f3fd85fe1..1e7e659ca 100644
--- a/src/Metrics/InternalMetric.h
+++ b/src/Metrics/InternalMetric.h
@@ -23,7 +23,7 @@ struct InternalMetric {
         Counter(MetricToGetDetailsFrom.getCounterPtr()),
         DescriptionString(MetricToGetDetailsFrom.getDescription()),
         LastValue(MetricToGetDetailsFrom.getCounterPtr()->load()),
-        ValueSeverity(MetricToGetDetailsFrom.getSeverity()){};
+        ValueSeverity(MetricToGetDetailsFrom.getSeverity()) {};
   std::string const Name;
   std::string const FullName; // Including prefix from local registrar
   CounterType *Counter{nullptr};
diff --git a/src/Metrics/Registrar.h b/src/Metrics/Registrar.h
index 2c6f9fb1d..53efb1e7a 100644
--- a/src/Metrics/Registrar.h
+++ b/src/Metrics/Registrar.h
@@ -28,7 +28,7 @@ public:
   explicit Registrar(
       std::string MetricsPrefix,
       std::vector<std::shared_ptr<Reporter>> const &Reporters = {})
-      : Prefix(std::move(MetricsPrefix)), ReporterList(Reporters){};
+      : Prefix(std::move(MetricsPrefix)), ReporterList(Reporters) {};
   ~Registrar() override = default;
 
   void registerMetric(Metric &NewMetric,
diff --git a/src/NeXusDataset/AdcDatasets.h b/src/NeXusDataset/AdcDatasets.h
index dfb01b885..ecb6bd0c9 100644
--- a/src/NeXusDataset/AdcDatasets.h
+++ b/src/NeXusDataset/AdcDatasets.h
@@ -20,7 +20,7 @@ public:
   Amplitude(hdf5::node::Group const &Parent, Mode CMode,
             size_t ChunkSize = 1024)
       : ExtensibleDataset<std::uint32_t>(Parent, "adc_pulse_amplitude", CMode,
-                                         ChunkSize){};
+                                         ChunkSize) {};
 };
 
 /// \brief Represents a NeXus dataset with the name "adc_pulse_peak_area".
@@ -29,7 +29,7 @@ public:
   PeakArea() = default;
   PeakArea(hdf5::node::Group const &Parent, Mode CMode, size_t ChunkSize = 1024)
       : ExtensibleDataset<std::uint32_t>(Parent, "adc_pulse_peak_area", CMode,
-                                         ChunkSize){};
+                                         ChunkSize) {};
 };
 
 /// \brief Represents a NeXus dataset with the name "adc_pulse_background".
@@ -39,7 +39,7 @@ public:
   Background(hdf5::node::Group const &Parent, Mode CMode,
              size_t ChunkSize = 1024)
       : ExtensibleDataset<std::uint32_t>(Parent, "adc_pulse_background", CMode,
-                                         ChunkSize){};
+                                         ChunkSize) {};
 };
 
 /// \brief Represents a NeXus dataset with the name "adc_pulse_threshold_time".
diff --git a/src/NeXusDataset/EpicsAlarmDatasets.h b/src/NeXusDataset/EpicsAlarmDatasets.h
index 2ec97f8e7..d7e811708 100644
--- a/src/NeXusDataset/EpicsAlarmDatasets.h
+++ b/src/NeXusDataset/EpicsAlarmDatasets.h
@@ -20,7 +20,8 @@ public:
   AlarmStatus() = default;
   AlarmStatus(hdf5::node::Group const &Parent, Mode CMode,
               size_t StringSize = 32, size_t ChunkSize = 1024)
-      : FixedSizeString(Parent, "alarm_status", CMode, StringSize, ChunkSize){};
+      : FixedSizeString(Parent, "alarm_status", CMode, StringSize, ChunkSize) {
+        };
 };
 
 /// \brief Represents a dataset with the name "alarm_message".
@@ -29,8 +30,8 @@ public:
   AlarmMsg() = default;
   AlarmMsg(hdf5::node::Group const &Parent, Mode CMode, size_t StringSize = 200,
            size_t ChunkSize = 1024)
-      : FixedSizeString(Parent, "alarm_message", CMode, StringSize,
-                        ChunkSize){};
+      : FixedSizeString(Parent, "alarm_message", CMode, StringSize, ChunkSize) {
+        };
 };
 
 /// \brief Represents a dataset with the name "alarm_severity".
@@ -40,7 +41,7 @@ public:
   AlarmSeverity(hdf5::node::Group const &Parent, Mode CMode,
                 size_t ChunkSize = 1024)
       : ExtensibleDataset<std::int16_t>(Parent, "alarm_severity", CMode,
-                                        ChunkSize){};
+                                        ChunkSize) {};
 };
 
 /// \brief Represents a timestamp dataset.
diff --git a/src/Status/StatusReporterBase.h b/src/Status/StatusReporterBase.h
index 9e94d48e0..66a066771 100644
--- a/src/Status/StatusReporterBase.h
+++ b/src/Status/StatusReporterBase.h
@@ -77,7 +77,7 @@ protected:
   void reportStatus();
 
 private:
-  virtual void postReportStatusActions(){};
+  virtual void postReportStatusActions() {};
   mutable std::shared_mutex StatusMutex;
   std::shared_ptr<Kafka::Producer> Producer;
   std::unique_ptr<Kafka::IProducerTopic> StatusProducerTopic;
diff --git a/src/WriterModule/ep01/ConnectionStatusDatasets.h b/src/WriterModule/ep01/ConnectionStatusDatasets.h
index 252aab325..8b0fb01a8 100644
--- a/src/WriterModule/ep01/ConnectionStatusDatasets.h
+++ b/src/WriterModule/ep01/ConnectionStatusDatasets.h
@@ -39,6 +39,6 @@ public:
   ConnectionStatus(hdf5::node::Group const &Parent, Mode CMode,
                    size_t ChunkSize = 1024)
       : ExtensibleDataset<std::int16_t>(Parent, "connection_status", CMode,
-                                        ChunkSize){};
+                                        ChunkSize) {};
 };
 } // namespace NeXusDataset
diff --git a/src/WriterModuleBase.h b/src/WriterModuleBase.h
index 65d8ac703..2721d397d 100644
--- a/src/WriterModuleBase.h
+++ b/src/WriterModuleBase.h
@@ -74,7 +74,7 @@ public:
   /// example: converting a string to an enum, it should
   /// be done in this function. This function is called by the application right
   /// after the constructor and parse_config().
-  virtual void config_post_processing(){};
+  virtual void config_post_processing() {};
 
   /// \brief Override this function to register meta data values/fields.
   ///
@@ -88,7 +88,7 @@ public:
   /// class that is used to keep track of known meta-data fields.
   virtual void
   register_meta_data([[maybe_unused]] hdf5::node::Group const &HDFGroup,
-                     [[maybe_unused]] MetaData::TrackerPtr const &Tracker){};
+                     [[maybe_unused]] MetaData::TrackerPtr const &Tracker) {};
 
   /// \brief Initialise the writer instance for writing.
   ///
diff --git a/tests/AccessMessageMetadata/ReaderRegistrationTests.cpp b/tests/AccessMessageMetadata/ReaderRegistrationTests.cpp
index 763b43727..27129ed93 100644
--- a/tests/AccessMessageMetadata/ReaderRegistrationTests.cpp
+++ b/tests/AccessMessageMetadata/ReaderRegistrationTests.cpp
@@ -43,14 +43,18 @@ TEST_F(ReaderRegistrationTest, SimpleRegistration) {
       FlatbufferReaderRegistry::getReaders();
   std::string TestKey("temp");
   EXPECT_EQ(Readers.size(), 0u);
-  { FlatbufferReaderRegistry::Registrar<DummyReader> RegisterIt(TestKey); }
+  {
+    FlatbufferReaderRegistry::Registrar<DummyReader> RegisterIt(TestKey);
+  }
   EXPECT_EQ(Readers.size(), 1u);
   EXPECT_NE(Readers.find(TestKey), Readers.end());
 }
 
 TEST_F(ReaderRegistrationTest, SameKeyRegistration) {
   std::string TestKey("temp");
-  { FlatbufferReaderRegistry::Registrar<DummyReader> RegisterIt(TestKey); }
+  {
+    FlatbufferReaderRegistry::Registrar<DummyReader> RegisterIt(TestKey);
+  }
   EXPECT_THROW(
       FlatbufferReaderRegistry::Registrar<DummyReader> RegisterIt(TestKey),
       std::runtime_error);
@@ -72,13 +76,17 @@ TEST_F(ReaderRegistrationTest, KeyTooLong) {
 
 TEST_F(ReaderRegistrationTest, StrKeyFound) {
   std::string TestKey("t3mp");
-  { FlatbufferReaderRegistry::Registrar<DummyReader> RegisterIt(TestKey); }
+  {
+    FlatbufferReaderRegistry::Registrar<DummyReader> RegisterIt(TestKey);
+  }
   EXPECT_NE(FlatbufferReaderRegistry::find(TestKey).get(), nullptr);
 }
 
 TEST_F(ReaderRegistrationTest, StrKeyNotFound) {
   std::string TestKey("t3mp");
-  { FlatbufferReaderRegistry::Registrar<DummyReader> RegisterIt(TestKey); }
+  {
+    FlatbufferReaderRegistry::Registrar<DummyReader> RegisterIt(TestKey);
+  }
   std::string FailKey("trump");
   EXPECT_THROW(FlatbufferReaderRegistry::find(FailKey), std::exception);
 }
diff --git a/tests/KafkaToNexusTests.cpp b/tests/KafkaToNexusTests.cpp
index 917ed1469..cb1b185a9 100644
--- a/tests/KafkaToNexusTests.cpp
+++ b/tests/KafkaToNexusTests.cpp
@@ -23,7 +23,7 @@ public:
                        std::unique_ptr<Status::StatusReporterBase> Reporter)
       : FileWriter::Master(
             Config, std::move(Listener), std::move(Reporter),
-            std::make_unique<Metrics::Registrar>("some_prefix")){};
+            std::make_unique<Metrics::Registrar>("some_prefix")) {};
   MAKE_MOCK0(stopNow, void(), override);
   MAKE_MOCK0(writingIsFinished, bool(), override);
 };
diff --git a/tests/MessageTests.cpp b/tests/MessageTests.cpp
index e6ec9833b..cc2928d76 100644
--- a/tests/MessageTests.cpp
+++ b/tests/MessageTests.cpp
@@ -59,7 +59,9 @@ public:
 };
 
 TEST_F(MessageClassTest, Success) {
-  { FlatbufferReaderRegistry::Registrar<MsgDummyReader1> RegisterIt(TestKey); }
+  {
+    FlatbufferReaderRegistry::Registrar<MsgDummyReader1> RegisterIt(TestKey);
+  }
   std::memcpy(TestData.get() + 4, TestKey.c_str(), 4);
   auto CurrentMessage = FlatbufferMessage(TestData.get(), 8);
   EXPECT_TRUE(CurrentMessage.isValid());
@@ -78,14 +80,18 @@ TEST_F(MessageClassTest, WrongFlatbufferID) {
 }
 
 TEST_F(MessageClassTest, SizeTooSmall) {
-  { FlatbufferReaderRegistry::Registrar<MsgDummyReader1> RegisterIt(TestKey); }
+  {
+    FlatbufferReaderRegistry::Registrar<MsgDummyReader1> RegisterIt(TestKey);
+  }
   std::memcpy(TestData.get() + 4, TestKey.c_str(), 4);
   ASSERT_THROW(FlatbufferMessage(TestData.get(), 7),
                FileWriter::BufferTooSmallError);
 }
 
 TEST_F(MessageClassTest, InvalidFlatbuffer) {
-  { FlatbufferReaderRegistry::Registrar<InvalidReader> RegisterIt(TestKey); }
+  {
+    FlatbufferReaderRegistry::Registrar<InvalidReader> RegisterIt(TestKey);
+  }
   std::memcpy(TestData.get() + 4, TestKey.c_str(), 4);
   ASSERT_THROW(FlatbufferMessage(TestData.get(), 8),
                FileWriter::NotValidFlatbuffer);
diff --git a/tests/Metrics/MetricsReporterTest.cpp b/tests/Metrics/MetricsReporterTest.cpp
index edb9513c7..dcc272f11 100644
--- a/tests/Metrics/MetricsReporterTest.cpp
+++ b/tests/Metrics/MetricsReporterTest.cpp
@@ -13,7 +13,7 @@ namespace Metrics {
 class MockUnhealthySink : public Sink {
 public:
   explicit MockUnhealthySink(LogTo LogToSink = LogTo::LOG_MSG)
-      : SinkType(LogToSink){};
+      : SinkType(LogToSink) {};
   MAKE_MOCK1(reportMetric, void(InternalMetric &), override);
   LogTo getType() const override { return SinkType; };
   bool isHealthy() const override { return false; };
diff --git a/tests/Metrics/MockSink.h b/tests/Metrics/MockSink.h
index 3adc0077a..2617d3795 100644
--- a/tests/Metrics/MockSink.h
+++ b/tests/Metrics/MockSink.h
@@ -15,7 +15,7 @@ namespace Metrics {
 
 class MockSink : public Sink {
 public:
-  explicit MockSink(LogTo LogToSink = LogTo::LOG_MSG) : SinkType(LogToSink){};
+  explicit MockSink(LogTo LogToSink = LogTo::LOG_MSG) : SinkType(LogToSink) {};
   MAKE_MOCK1(reportMetric, void(InternalMetric &), override);
   LogTo getType() const override { return SinkType; };
   bool isHealthy() const override { return true; };
diff --git a/tests/NeXusDataset/NeXusDatasetTests.cpp b/tests/NeXusDataset/NeXusDatasetTests.cpp
index bf5850c62..7f6d3f350 100644
--- a/tests/NeXusDataset/NeXusDatasetTests.cpp
+++ b/tests/NeXusDataset/NeXusDatasetTests.cpp
@@ -29,7 +29,9 @@ template <class Dataset, typename DatasetType>
 void defaultDatasetCreation(hdf5::node::Group &RootGroup,
                             std::string DatasetName) {
   size_t ChunkSize = 256;
-  { Dataset UnderTest(RootGroup, NeXusDataset::Mode::Create, ChunkSize); }
+  {
+    Dataset UnderTest(RootGroup, NeXusDataset::Mode::Create, ChunkSize);
+  }
   ASSERT_TRUE(RootGroup.has_dataset(DatasetName))
       << "Missing dataset: " << DatasetName;
   hdf5::node::Dataset TestDataset = RootGroup.get_dataset(DatasetName);
@@ -46,7 +48,9 @@ template <class Dataset, typename DatasetType>
 void defaultTimeDatasetCreation(hdf5::node::Group &RootGroup,
                                 std::string DatasetName) {
   size_t ChunkSize = 256;
-  { Dataset UnderTest(RootGroup, NeXusDataset::Mode::Create, ChunkSize); }
+  {
+    Dataset UnderTest(RootGroup, NeXusDataset::Mode::Create, ChunkSize);
+  }
   ASSERT_TRUE(RootGroup.has_dataset(DatasetName))
       << "Missing dataset: " << DatasetName;
   hdf5::node::Dataset TestDataset = RootGroup.get_dataset(DatasetName);
@@ -92,7 +96,9 @@ template <class Dataset>
 void failOnReCreateDataset(hdf5::node::Group &RootGroup,
                            std::string DatasetName) {
   size_t ChunkSize = 256;
-  { Dataset UnderTest(RootGroup, NeXusDataset::Mode::Create, ChunkSize); }
+  {
+    Dataset UnderTest(RootGroup, NeXusDataset::Mode::Create, ChunkSize);
+  }
   EXPECT_THROW(
       Dataset UnderTest(RootGroup, NeXusDataset::Mode::Create, ChunkSize),
       std::runtime_error)
diff --git a/tests/ProducerTests.cpp b/tests/ProducerTests.cpp
index 9962af48a..7ead3bdc2 100644
--- a/tests/ProducerTests.cpp
+++ b/tests/ProducerTests.cpp
@@ -24,7 +24,7 @@ protected:
 class ProducerStandIn : public Kafka::Producer {
 public:
   explicit ProducerStandIn(Kafka::BrokerSettings &Settings)
-      : Producer(Settings){};
+      : Producer(Settings) {};
   using Producer::ProducerID;
   using Producer::ProducerPtr;
 };
@@ -43,9 +43,7 @@ public:
                                   int64_t /*offset*/) override {
     return RdKafka::ERR_NO_ERROR;
   };
-  struct rd_kafka_topic_s *c_ptr() override {
-    return {};
-  };
+  struct rd_kafka_topic_s *c_ptr() override { return {}; };
 };
 
 TEST_F(ProducerTests, creatingForwarderIncrementsForwarderCounter) {
diff --git a/tests/StatusReporterTests.cpp b/tests/StatusReporterTests.cpp
index 9ca481834..9bf85501e 100644
--- a/tests/StatusReporterTests.cpp
+++ b/tests/StatusReporterTests.cpp
@@ -16,7 +16,7 @@
 class ProducerStandIn : public Kafka::Producer {
 public:
   explicit ProducerStandIn(Kafka::BrokerSettings &Settings)
-      : Producer(Settings){};
+      : Producer(Settings) {};
   using Producer::ProducerID;
   using Producer::ProducerPtr;
 };
@@ -25,7 +25,7 @@ class ProducerTopicStandIn : public Kafka::ProducerTopic {
 public:
   ProducerTopicStandIn(std::shared_ptr<Kafka::Producer> ProducerPtr,
                        std::string TopicName)
-      : ProducerTopic(std::move(ProducerPtr), std::move(TopicName)){};
+      : ProducerTopic(std::move(ProducerPtr), std::move(TopicName)) {};
   int produce(
       [[maybe_unused]] std::unique_ptr<Kafka::ProducerMessage> Msg) override {
     return 0;
diff --git a/tests/helpers/KafkaMocks.h b/tests/helpers/KafkaMocks.h
index fbb0c5c81..1bf6c5432 100644
--- a/tests/helpers/KafkaMocks.h
+++ b/tests/helpers/KafkaMocks.h
@@ -17,7 +17,7 @@ class MockConsumer
     : public trompeloeil::mock_interface<Kafka::ConsumerInterface> {
 public:
   explicit MockConsumer(
-      [[maybe_unused]] const Kafka::BrokerSettings &Settings){};
+      [[maybe_unused]] const Kafka::BrokerSettings &Settings) {};
   using PollReturnType = std::pair<Kafka::PollStatus, FileWriter::Msg>;
   IMPLEMENT_MOCK0(poll);
   IMPLEMENT_MOCK3(addPartitionAtOffset);
-- 
GitLab


From 5c09825ba93b468313cfdb3bb37dd7c412830805 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Costa?= <andre.costa@ess.eu>
Date: Tue, 8 Apr 2025 15:20:49 +0200
Subject: [PATCH 2/2] ECDC-4661: Update CI, Artifactory publish

---
 .gitlab-ci.yml | 221 ++++++++++++++++++++++++-------------------------
 1 file changed, 110 insertions(+), 111 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 91d5e032d..8ecb8754e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -6,28 +6,33 @@ default:
 
 workflow:
   rules:
-    - if: '$CI_PIPELINE_SOURCE == "push"'
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+    - if: $CI_COMMIT_TAG
+
+variables:
+  ALMALINUX9_IMAGE: "registry.esss.lu.se/ecdc/ess-dmsc/docker-almalinux9-conan:1.2.0"
+  CENTOS7_IMAGE: "registry.esss.lu.se/ecdc/ess-dmsc/build-nodes/centos7:1.0"
+  BUILD_DIR: "build"
 
 stages:
-  - check
+  - test
   - build
   - archive
   - domain
   - integration
-  - release
-
-.check:
-  stage: check
-  image: registry.esss.lu.se/ecdc/ess-dmsc/docker-ubuntu2204-build-node:latest
+  - publish
 
 clang-format:
-  extends: .check
+  stage: test
+  image: $ALMALINUX9_IMAGE
   script:
     - ci/check-formatting.sh
+  allow_failure: true
 
 black:
-  extends: .check
+  stage: test
+  image: $ALMALINUX9_IMAGE
   script:
     - python3 -m venv .venv
     - .venv/bin/python -m pip install -r integration-tests/requirements.txt
@@ -37,7 +42,8 @@ black:
     - .venv/bin/python -m black --check domain-tests
 
 cppcheck:
-  extends: .check
+  stage: test
+  image: $ALMALINUX9_IMAGE
   script:
     - cppcheck --version
     - >
@@ -49,136 +55,123 @@ cppcheck:
         --enable=all \
         --inconclusive \
         src/ 2> cppcheck.xml
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
 
-.build:
-  stage: build
+.conan-config: &conan-config
   before_script:
-    - mkdir build
-    - cd build
-    - >
-      conan remote add \
-        --insert 0 \
-        ecdc-conan-virtual \
-        $ESS_ARTIFACTORY_ECDC_CONAN_VIRTUAL_REMOTE_URL
-    - $SCL conan install --build missing ..
-    - $SCL conan info ../conanfile.txt > CONAN_INFO
-  after_script:
-    - >
-      conan remote add \
-        ecdc-conan-external \
-        $ESS_ARTIFACTORY_ECDC_CONAN_EXTERNAL_REMOTE_URL
-    - >
-      conan user \
-        --password $ESS_ARTIFACTORY_ECDC_CONAN_TOKEN \
-        --remote ecdc-conan-external \
-        $ESS_ARTIFACTORY_ECDC_CONAN_USER
-    # Store built packages to save build time on subsequent builds
-    - conan upload '*' --all --confirm --remote ecdc-conan-external
+    - |
+      if [ -f /etc/os-release ]; then
+        . /etc/os-release
+        if [[ "$ID" == "centos" ]]; then
+            CONAN_PROFILE=linux_x86_64_gcc11_legacy
+            echo 'source /opt/rh/devtoolset-11/enable' >> ~/.bashrc
+            source ~/.bashrc
+        fi
+      fi
+    - conan config install $ESS_CONAN_CONFIG_URL
 
-build-debug:
-  extends: .build
-  image: registry.esss.lu.se/ecdc/ess-dmsc/docker-centos7-build-node:latest
-  variables:
-    SCL: scl enable devtoolset-11 rh-python38 --
+centos7-debug:
+  stage: build
+  image: $CENTOS7_IMAGE
+  <<: *conan-config
   script:
-    - $SCL cmake -GNinja -DCMAKE_BUILD_TYPE=Debug -DCONAN=MANUAL -DRUN_DOXYGEN=ON -DCOV=ON ..
-    - $SCL ninja all UnitTests docs
-    - $SCL ninja coverage
+    - mkdir -p $BUILD_DIR && cd $BUILD_DIR
+    - conan install .. --build=missing
+    - conan info ../conanfile.txt > CONAN_INFO
+    - cmake -GNinja -DCMAKE_BUILD_TYPE=Debug -DCONAN=MANUAL -DRUN_DOXYGEN=ON -DCOV=ON ..
+    - ninja all UnitTests docs
+    - ninja coverage
     - cat coverage.txt
   coverage: '/^TOTAL.*\s+(\d+\%)$/'
   artifacts:
     paths:
-      - build/coverage.xml
+      - $BUILD_DIR/coverage.xml
     reports:
       coverage_report:
         coverage_format: cobertura
-        path: build/coverage.xml
+        path: $BUILD_DIR/coverage.xml
 
-build-release:
-  extends: .build
-  image: registry.esss.lu.se/ecdc/ess-dmsc/docker-centos7-build-node:latest
-  variables:
-    SCL: scl enable devtoolset-11 rh-python38 --
+
+centos7-release:
+  stage: build
+  image: $CENTOS7_IMAGE
+  <<: *conan-config
   script:
-    - $SCL ../ci/configure-release.sh .. .
-    - $SCL ninja all UnitTests docs
+    - mkdir -p $BUILD_DIR && cd $BUILD_DIR
+    - conan install .. --build=missing
+    - conan info ../conanfile.txt > CONAN_INFO
+    - ../ci/configure-release.sh .. .
+    - ninja all UnitTests docs
     - ./bin/kafka-to-nexus --version
     - ./bin/UnitTests --gtest_output=xml:test-output.xml
   artifacts:
     paths:
-      - build/test-output.xml
-      - build/CONAN_INFO
-      - build/bin
-      - build/lib
-      - build/licenses
+      - $BUILD_DIR/test-output.xml
+      - $BUILD_DIR/CONAN_INFO
+      - $BUILD_DIR/bin
+      - $BUILD_DIR/lib
+      - $BUILD_DIR/licenses
     reports:
-      junit: build/test-output.xml
+      junit: $BUILD_DIR/test-output.xml
+
+almalinux9-debug:
+  stage: build
+  image: $ALMALINUX9_IMAGE
+  <<: *conan-config
+  script:
+    - mkdir -p $BUILD_DIR && cd $BUILD_DIR
+    - conan install .. --build=missing --profile=linux_x86_64_gcc11
+    - conan info ../conanfile.txt > CONAN_INFO
+    - cmake -GNinja -DCMAKE_BUILD_TYPE=Debug -DCONAN=MANUAL -DRUN_DOXYGEN=ON ..
+    - ninja all UnitTests docs
+    - ./bin/kafka-to-nexus --version
+    - ./bin/UnitTests
+
+archive:
+  stage: archive
+  image: alpine:latest
+  dependencies:
+    - centos7-release
+  script:
+    - cd $BUILD_DIR
+    - mkdir -p archive/kafka-to-nexus/bin
+    - cp ./bin/file-maker ./bin/kafka-to-nexus ./bin/template-maker archive/kafka-to-nexus/bin/
+    - cp -a ./lib archive/kafka-to-nexus
+    - cp -a ./licenses archive/kafka-to-nexus
+    - cp ./CONAN_INFO archive/kafka-to-nexus
+    - tar czf kafka-to-nexus-centos7.tar.gz -C archive kafka-to-nexus
+  artifacts:
+    paths:
+      - $BUILD_DIR/kafka-to-nexus-centos7.tar.gz
 
 domain_tests:
   stage: domain
-  image: registry.esss.lu.se/ecdc/ess-dmsc/docker-centos7-build-node:latest
+  image: $CENTOS7_IMAGE
   dependencies:
-    - build-release
+    - centos7-release
   variables:
     SCL: scl enable devtoolset-11 rh-python38 --
   before_script:
-    - ls
     - cd domain-tests
   script:
     - $SCL python -m venv venv
     - source venv/bin/activate
     - python -m pip install -r requirements.txt
-    - pytest --file-maker-binary=../build/bin/file-maker --junitxml=DomainTestsOutput.xml
+    - pytest --file-maker-binary=../$BUILD_DIR/bin/file-maker --junitxml=DomainTestsOutput.xml
   artifacts:
     when: always
     paths:
       - domain-tests/DomainTestsOutput.xml
     reports:
-      junit: Domain-tests/DomainTestsOutput.xml
-
-build-alt-distro:
-  extends: .build
-  image: registry.esss.lu.se/ecdc/ess-dmsc/docker-$DISTRO-build-node:latest
-  script:
-    - $SCL cmake -GNinja -DCMAKE_BUILD_TYPE=Debug -DCONAN=MANUAL -DRUN_DOXYGEN=ON ..
-    - $SCL ninja all UnitTests docs
-    - ./bin/kafka-to-nexus --version
-    - ./bin/UnitTests
-
-  parallel:
-    matrix:
-      - DISTRO:
-          - debian11
-          - ubuntu2204
-      - DISTRO: almalinux8
-        SCL: scl enable gcc-toolset-12 --
-
-archive:
-  stage: archive
-  image: registry.esss.lu.se/ecdc/ess-dmsc/docker-centos7-build-node:latest
-  script:
-    - cd build
-    - mkdir -p archive/kafka-to-nexus/bin
-    - cp ./bin/kafka-to-nexus archive/kafka-to-nexus/bin/
-    - cp -r ./lib archive/kafka-to-nexus/
-    - cp -r ./licenses archive/kafka-to-nexus/
-    - cp ./CONAN_INFO archive/kafka-to-nexus/
-    - cd archive
-    - tar czf kafka-to-nexus.tar.gz kafka-to-nexus
-  dependencies:
-    - build-release
-  artifacts:
-    paths:
-      - build/archive/kafka-to-nexus.tar.gz
+      junit: domain-tests/DomainTestsOutput.xml
 
 integration-tests:
   stage: integration
   image: docker:latest
+  dependencies:
+    - archive
   before_script:
     - cd integration-tests
-    - ./setup.sh ../build/archive/kafka-to-nexus.tar.gz
+    - ./setup.sh ../$BUILD_DIR/kafka-to-nexus-centos7.tar.gz
   script:
     - ./run-integration-tests.sh
   after_script:
@@ -192,8 +185,6 @@ integration-tests:
     FILEWRITER_FILEWRITER_CONTAINER_NAME: filewriter-$CI_JOB_ID
     HTTP_PROXY: $ESS_HTTP_PROXY
     HTTPS_PROXY: $ESS_HTTP_PROXY
-  dependencies:
-    - archive
   artifacts:
     when: always
     paths:
@@ -203,16 +194,24 @@ integration-tests:
     reports:
       junit: integration-tests/IntegrationTestsOutput.xml
 
-keep-artifacts:
-  stage: release
-  image: registry.esss.lu.se/ecdc/ess-dmsc/docker-centos7-build-node:latest
-  script:
-    - ls build/archive/kafka-to-nexus.tar.gz
+publish:
+  stage: publish
+  image: alpine/curl:latest
   dependencies:
     - archive
-  artifacts:
-    paths:
-      - build/archive/kafka-to-nexus.tar.gz
-    expire_in: never
+  before_script:
+    - cp $BUILD_DIR/kafka-to-nexus-centos7.tar.gz .
+    - curl -fL https://install-cli.jfrog.io | sh
+    - jf config add $ESS_ARTIFACTORY_ID --url=$ESS_ARTIFACTORY_URL --user=$ESS_ARTIFACTORY_ECDC_USER --password=$ESS_ARTIFACTORY_ECDC_GENERIC_TOKEN
+    - jf config show
+  script:
+    - jf rt u --build-name="kafka-to-nexus-centos7" --build-number=${CI_PIPELINE_IID} kafka-to-nexus-centos7.tar.gz ecdc-generic-release/${ARTIFACTORY_UPLOAD_PATH}
   rules:
+    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+      variables:
+        ARTIFACTORY_UPLOAD_PATH: "${CI_PROJECT_NAME}/${CI_DEFAULT_BRANCH}/${CI_PIPELINE_IID}/"
     - if: $CI_COMMIT_TAG
+      variables:
+        ARTIFACTORY_UPLOAD_PATH: "${CI_PROJECT_NAME}/tags/${CI_COMMIT_TAG}/"
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+      when: never
-- 
GitLab