Створення автоматичного пайплайну CI/CD з Mule 4 та CloudHub 2.0

Інтеграційні застосунки на Mule 4 постійно змінюються. Кожна зміна закінчується деплоєм. І саме на цьому етапі найчастіше виникають виклики.

Поки деплой виконується вручну, процес залежить від конкретного середовища розробника. Відрізняється версія JDK, локальні налаштування Maven, профілі або навіть порядок виконання команд. 

У великих командах це створює ряд труднощів, які вирішує CI/CD.

Визначення Mule 4 та CloudHub 2.0

Спершу про головне — що взагалі таке Mule 4 та CloudHub 2.0?

Mule 4 — це інтеграційна платформа (runtime) від MuleSoft для створення API та обміну даними між системами. У ній реалізується логіка інтеграцій: прийом запитів, трансформація даних через DataWeave, взаємодія з базами, чергами та зовнішніми сервісами.

CloudHub 2.0 — це хмарне середовище розгортання застосунків Mule 4 у межах Anypoint Platform. Воно відповідає за запуск, масштабування, ізоляцію та моніторинг інтеграційних сервісів.

Як розгортати проєкт вручну?

Перед тим як запускати автоматичне розгортання, важливо зрозуміти, як проєкт збирається і розгортається вручну. Це допомагає відловлювати помилки ще на ранньому етапі та правильно налаштувати CI/CD пайплайн.

Крок 1. Створення проєкту

У Anypoint Studio створюємо проєкт на основі RAML-файлу. RAML описує структуру API, визначає маршрути запитів, трансформації даних через DataWeave та взаємодію з базами, чергами чи зовнішніми сервісами.

Крок 2. Ручне розгортання через Maven

Розгортання вручну складається з двох етапів:

  1. Build — компіляція проєкту та підготовка JAR-файлу.
  2. Deploy — відправка застосунку на платформу для запуску.

Деплой може відбуватися двома способами:

  • На Exchange — для публікації застосунку та доступу до нього інших команд.
  • У Runtime Manager / CloudHub — щоб застосунок одразу запрацював у хмарному середовищі.

Крок 3. Налаштування pom.xml

Файл pom.xml керує збіркою та розгортанням і містить ключові налаштування проєкту:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example.mule</groupId>
    <artifactId>order-api-sapi</artifactId>
    <version>1.0.0</version>
    <packaging>mule-application</packaging>
    <name>order-api-sapi</name>

    <properties>
        <mule.maven.plugin.version>4.3.0</mule.maven.plugin.version>
        <app.runtime>4.9.0</app.runtime>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.mule.tools.maven</groupId>
                <artifactId>mule-maven-plugin</artifactId>
                <version>${mule.maven.plugin.version}</version>
                <extensions>true</extensions>
                <configuration>
                    <cloudhub2Deployment>
                        <environment>${env}</environment>
                        <applicationName>${app.name}</applicationName>
                        <replicas>${replicas}</replicas>
                        <vCores>${vCores}</vCores>
                    </cloudhub2Deployment>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.mule.connectors</groupId>
            <artifactId>mule-http-connector</artifactId>
            <version>1.10.3</version>
        </dependency>
        <dependency>
            <groupId>org.mule.modules</groupId>
            <artifactId>mule-apikit-module</artifactId>
            <version>1.11.3</version>
        </dependency>
    </dependencies>

    <distributionManagement>
        <repository>
            <id>anypoint-exchange-v3</id>
            <url>https://maven.anypoint.mulesoft.com/api/v3/organizations/${groupId}/maven</url>
        </repository>
    </distributionManagement>

    <repositories>
        <repository>
            <id>anypoint-exchange-v3</id>
            <url>https://maven.anypoint.mulesoft.com/api/v3/maven</url>
        </repository>
    </repositories>

</project>

Всі ідентифікатори (Server ID, Repository ID, Distribution repository ID) повинні збігатися між Maven та Anypoint Platform, інакше розгортання не пройде.

Підготовка середовища до автоматичного розгортання

Тепер нарешті можна перейти до головної частини цього гайду — автоматичного розгортання. 

Спочатку потрібно переконатися, що ваше робоче середовище готове. Для роботи з Mule 4 на CloudHub 2.0 потрібні кілька ключових елементів:

  1. акаунт в Anypoint CloudHub — для розгортання та керування застосунками;
  2. Mule Runtime 4.9.0 — сумісна версія для проєкту;
  3. Mule Maven Plugin 4.3.0 — плагін для збірки і публікації;
  4. Anypoint Studio 7.21.0 — середовище розробки проєктів Mule;
  5. OpenJDK 11 — для компіляції та запуску Maven.

Ці компоненти забезпечують сумісність між кодом, збіркою Maven і хмарним середовищем. Якщо якісь елементи несумісні, збірка або розгортання можуть завершитися помилкою.

Також важливо підготувати Git-репозиторій, адже саме він буде тригером для автоматичного запуску пайплайну. Кожен пуш у репозиторій запускає збірку та розгортання проєкту.

Налаштування CI/CD: settings.xml та build.yaml

Щоб збірка і розгортання проходили автоматично, Maven і GitHub Actions потрібно підключити до Anypoint Platform. Для цього використовують settings.xml та build.yaml.

settings.xml

Файл settings.xml створюють у папці .maven проєкту. Він визначає:

  • Profiles — параметри середовища (Sandbox, Dev, Prod) та ресурси застосунку;
  • Servers — облікові дані Connected App (Client ID і Client Secret).

Приклад налаштувань:

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 
                              https://maven.apache.org/xsd/settings-1.2.0.xsd">

  <pluginGroups>
    <pluginGroup>org.mule.tools</pluginGroup>
  </pluginGroups>

  <profiles>
    <profile>
      <id>Sandbox</id>
      <properties>
        <target>Cloudhub-US-East-2</target>
        <replicas>1</replicas>
        <region>us-east-1</region>
        <env>Sandbox</env>
        <app.name>sand-order-api-sapi</app.name>
        <vCores>0.1</vCores>
        <worker.type>MICRO</worker.type>
        <anypoint.client.id>XXXXXX</anypoint.client.id>
        <anypoint.client.secret>XXXXXX</anypoint.client.secret>
      </properties>
    </profile>
  </profiles>

  <servers>
    <server>
      <id>anypoint-exchange-v3</id>
      <username>ConnectedAppClient</username>
      <password>CLIENT_SECRET</password>
    </server>
  </servers>

</settings>

Важливо: ідентифікатори (Server ID, Repository ID, Distribution repository ID) повинні точно збігатися з тими, що використовуються у pom.xml і GitHub Actions.

build.yaml

Файл build.yaml розташовується у .github/workflows і визначає пайплайн автоматичного розгортання. Він тригериться при пуші у гілку main.

Приклад конфігурації:

name: Publish to Exchange & Deploy to CloudHub

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Cache Maven dependencies
        uses: actions/cache@v4
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: ${{ runner.os }}-maven-

      - name: Set up JDK
        uses: actions/setup-java@v4
        with:
          distribution: "zulu"
          java-version: 11

      - name: Publish to Exchange
        run: |
          mvn deploy --settings .maven/settings.xml -DskipMunitTests \
          -Dclient.id="${{ secrets.CONNECTED_APP_CLIENT_ID }}" \
          -Dclient.secret="${{ secrets.CONNECTED_APP_CLIENT_SECRET }}"

      - name: Deploy to CloudHub 2.0
        run: |
          mvn deploy --settings .maven/settings.xml -PSandbox -DskipMunitTests -DmuleDeploy \
          -Dclient.id="${{ secrets.CONNECTED_APP_CLIENT_ID }}" \
          -Dclient.secret="${{ secrets.CONNECTED_APP_CLIENT_SECRET }}"

Виконання збірки та перевірка деплою

Після налаштування settings.xml та build.yaml можна перевірити, як працює автоматичне розгортання. Основна ідея — будь-які зміни у коді автоматично запускають CI/CD пайплайн.

1. Перевірка унікальності версій (GAV)

Перед першим запуском збірки важливо переконатися, що Group ID, Artifact ID і Version (GAV) у pom.xml унікальні.

Приклад у pom.xml:

<groupId>com.example</groupId>
<artifactId>order-api-sapi</artifactId>
<version>1.0.0</version>

Якщо спробувати запустити збірку з уже існуючою комбінацією GAV, Maven не зможе опублікувати JAR у Exchange і видасть помилку. Рішення — змінити версію на нову, наприклад:

<version>1.0.1</version>

2. Запуск пайплайну

Коли всі налаштування завершені, можна одразу перевірити, як працює автоматичне розгортання.

Починаємо з локальних змін у коді: додате нові флоу, оновіть API або скоригуйте конфігурації. Ці зміни одразу стають тригером для пайплайну.

Далі зробіть коміт зміни і додайте їх у головну гілку репозиторію. Як тільки код потрапляє у main, GitHub Actions автоматично запускає пайплайн. Під капотом відбудеться кілька ключових етапів:

  • Збірка проєкту Maven — Maven компілює код і формує JAR-файл, готовий до розгортання.
  • Публікація у Anypoint Exchange — JAR потрапляє у репозиторій Exchange, де його можуть використовувати інші команди або проєкти.
  • Розгортання на CloudHub 2.0 — JAR автоматично розгортається у середовищі, вказаному у профілі (Sandbox, Dev або Prod), і застосунок стає доступним у хмарі.

Таким чином весь процес відбувається без ручного запуску Maven і введення паролів, а ви бачите результат просто через Git.

3. Перевірка результату

Після того як пайплайн завершив роботу, важливо переконатися, що все пройшло успішно і зміни застосовані правильно.

  1. Логи GitHub Actions — перше місце, куди варто заглянути. Тут можна побачити, чи пройшла збірка, публікація в Exchange і деплой у CloudHub без помилок. Якщо якийсь крок не виконався, лог покаже причину.
  2. Anypoint Platform — відкрийте Runtime Manager і перевірте, чи застосунок оновлено до останньої версії JAR. Це підтверджує, що ваші зміни дійсно потрапили у хмарне середовище.
  3. Таймстемпи та артефакти — перевірте у Exchange, чи новий JAR завантажено, і зверніть увагу на дату та час оновлення. Вони повинні збігатися з вашим пушем, щоб бути впевненим, що автоматичне розгортання спрацювало правильно.

Післяслово

Тепер ви можете фокусуватися на розвитку логіки інтеграції і вдосконаленні API, замість рутинного деплою. Головне — правильно підготувати середовище, налаштувати Maven, GitHub Actions та профілі, і пайплайн буде працювати без збоїв. 

Якщо хочете заглибитися у практику CI/CD на максимум, зверніть увагу на CI/CD практикум від ITEDU. Це чудова можливість закріпити знання на практиці шляхом опанування найкращих інструментів. І все це лише за 6 занять.

Залишити відповідь

Дякуємо, що поділились