Quick reference: CI/CD for a Mule app using a Connected App
Tags: mulesoft, cicd, devops, automation
Published: 2023-08-01 16:07:24

This is intended as a short guide. For detailed instructions + video, please see [this series](https://www.prostdev.com/post/how-to-set-up-a-ci-cd-pipeline-to-deploy-your-mulesoft-apps-to-cloudhub-using-github-actions). You can also see [this repo](https://github.com/alexandramartinez/mulesoft-mfa-cicd).

## Connected App

In [Anypoint Platform](https://anypoint.mulesoft.com/), go to **Access Management** > **Connected Apps** > **Create app**. Select `App acts on it's own behalf`. Add the scopes:

- Design Center Developer
- View Environment
- View Organization
- Profile
- Cloudhub Organization Admin
- Create Applications
- Delete Applications
- Download Applications
- Read Applications
- Read Servers

Copy `ID` and `Secret`.

## GitHub Actions secrets

In your GitHub repo, go to **Settings** > **Secrets and variables** > **Actions** > **New repository secret** and add the following secrets corresponding to your previous ID and Secret.

- `CONNECTED_APP_CLIENT_ID`
- `CONNECTED_APP_CLIENT_SECRET`

## build.yml

In your Mule app's code or repo, create a `.github` folder with a `workflows` folder. Inside this, create a `build.yml` and paste the following:

```yaml
name: Build and Deploy

on:
  push:
    branches: [ main ]

jobs:
    build:
        runs-on: ubuntu-latest
        steps:
        - name: Checkout this repo
          uses: actions/checkout@v3
        - name: Cache dependencies
          uses: actions/cache@v3
          with:
            path: ~/.m2/repository
            key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
            restore-keys: |
              ${{ runner.os }}-maven-
        - name: Set up JDK 1.8
          uses: actions/setup-java@v3
          with:
            distribution: 'zulu'
            java-version: 8
        - name: Build with Maven
          run: mvn -B package --file pom.xml -DskipMunitTests
        - name: Stamp artifact file name with commit hash
          run: |
            artifactName1=$(ls target/*.jar | head -1)
            commitHash=$(git rev-parse --short "$GITHUB_SHA")
            artifactName2=$(ls target/*.jar | head -1 | sed "s/.jar/-$commitHash.jar/g")
            mv $artifactName1 $artifactName2
        - name: Upload artifact 
          uses: actions/upload-artifact@v3
          with:
              name: artifacts
              path: target/*.jar

    deploy:
        needs: build
        runs-on: ubuntu-latest
        steps:    
        - name: Checkout this repo
          uses: actions/checkout@v3
        - name: Cache dependencies
          uses: actions/cache@v3
          with:
            path: ~/.m2/repository
            key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
            restore-keys: |
              ${{ runner.os }}-maven-
        - uses: actions/download-artifact@v3
          with:
            name: artifacts
        - name: Deploy
          run: |
            artifactName=$(ls *.jar | head -1)
            mvn deploy -DskipMunitTests -DmuleDeploy \
             -Dmule.artifact=$artifactName \
             -Dclient.id="${{ secrets.CONNECTED_APP_CLIENT_ID }}" \
             -Dclient.secret="${{ secrets.CONNECTED_APP_CLIENT_SECRET }}"
```

## pom.xml

Make sure the config matches your application. For example, `muleVersion`, `applicationName`, `environment`, `region`, and so on.

```xml
<plugin>
  <groupId>org.mule.tools.maven</groupId>
  <artifactId>mule-maven-plugin</artifactId>
  <version>${mule.maven.plugin.version}</version>
  <extensions>true</extensions>
  <!-- Deployment config start -->
  <configuration>
    <cloudHubDeployment>
      <uri>https://anypoint.mulesoft.com</uri>
      <muleVersion>4.4.0</muleVersion>
      <applicationName>mulesoft-mfa-cicd</applicationName>
      <environment>Sandbox</environment>
      <workerType>MICRO</workerType>
      <region>us-east-2</region>
      <workers>1</workers>
      <objectStoreV2>true</objectStoreV2>
      <connectedAppClientId>${client.id}</connectedAppClientId>
      <connectedAppClientSecret>${client.secret}</connectedAppClientSecret>
      <connectedAppGrantType>client_credentials</connectedAppGrantType>
      <properties>
        <env>${env}</env>
      </properties>
    </cloudHubDeployment>
  </configuration>
  <!-- Deployment config end -->
</plugin>
```

That's it! Commit, push, and watch it run :)