# Continuous Integration of Applications to CloudHub 2.0 using Github Actions

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1717466743847/844eb53e-98c4-4481-9889-73ee3abf51f3.jpeg align="center")

### Prerequisites:

* Github
    
* Anypoint Platform (Exchange Contributor, Runtime Access)
    

### Mule API Project Structure:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1717449253474/2de5c610-95b3-4237-81d9-f5f4004f427c.png align="center")

### Before you Deploy Mule Application to Cloudhub 2.0

Update Pom xml file with Distribution Management

```xml
<distributionManagement>
  <repository>
    <id>exchange-connected-app-v3</id>
    <name>Exchange Private Repository</name>
    <url>https://maven.anypoint.mulesoft.com/api/v3/organizations/${project.groupId}/maven</url>
    <layout>default</layout>
  </repository>
</distributionManagement>
```

Update Pom Xml with repositories

```xml
<repositories>
		<repository>
			<id>exchange-connected-app-v3</id>
			<name>Anypoint Exchange</name>
			<url>https://maven.anypoint.mulesoft.com/api/v3/maven</url>
			<layout>default</layout>
		</repository>
		<repository>
			<id>mulesoft-releases</id>
			<name>MuleSoft Releases Repository</name>
			<url>https://repository.mulesoft.org/releases/</url>
			<layout>default</layout>
		</repository>
		<repository>
			<id>anypoint-exchange-v3</id>
			<name>Anypoint Exchange V3</name>
			<url>https://maven.anypoint.mulesoft.com/api/v3/maven</url>
			<layout>default</layout>
		</repository>
</repositories>
```

For groupId please refer [How to know my Organization ID (Org ID) on the Anypoint Platform](https://help.salesforce.com/s/articleView?id=001115130&type=1)

For the deployment of Mule application to Cloudhub 2.0 , application has to be published to exchange and then the deployment.

To publish the application to Anypoint Exchange create folder .maven and make file settings.xml.

```xml
<?xml version="1.0"?>
<settings>

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

  <servers>
	<server>
		<username>~~~Client~~~</username>
		<password>${CONNECTED_APP_CLIENT_ID}~?~${CONNECTED_APP_CLIENT_SECRET}</password>
		<id>exchange-connected-app-v3</id>
	  </server>
  </servers>

  <profiles>
	<profile>	
		<properties>
		  <org.id>${ORGANIZATION_ID}</org.id>
		</properties>
		<repositories>
		  <repository>
			<id>exchange-connected-app-v3</id>
			<name>Corporate Repository</name>
			<url>https://maven.anypoint.mulesoft.com/api/v3/organizations/${org.id}/maven</url>
		  </repository>
		  <repository>
			<id>exchange-connected-app-v2</id>
			<name>Corporate Repository</name>
			<url>https://maven.anypoint.mulesoft.com/api/v2/organizations/${org.id}/maven</url>
		  </repository>
		</repositories>
		<id>exchange-repos</id>
	  </profile>
  </profiles>

	<activeProfiles>
    <activeProfile>exchange-repos</activeProfile>
  </activeProfiles>
  
</settings>
```

This repository will serve as an example. The code for your Mule application should be stored here.

When your code is uploaded to GitHub, create a new folder named `.github`. Inside this folder, create another folder named `workflows`. This is where the YAML file containing the pipeline's actual code should be created.

In the YAML script below, the Git reference points to the `develop` branch, and the pipeline starts running only in the `develop` branch. Similarly, you can create jobs for multiple environments for each branch.

```yaml
# This is a basic workflow to help you get started with Actions

name: CI

# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events for all branches

 push:
  branches: ["develop","main"]
 pull_request:
  branches: ["develop","main"]


jobs:
 build:
  if: ${{ contains(github.ref, 'dev') ||contains(github.ref, 'release') }}
  runs-on: ubuntu-latest
  steps:
    - run: echo 'MULE CONNECTED APP USER--${{vars.MULE_CONNECT_APP_USER}}'
    - run: echo 'MULE CONNECTED APP PASSWORD--${{vars.MULE_CONNECT_APP_PWD}}'
    - run: echo 'Eventname-- ${{ github.event_name  }}'
    - run: echo 'event-- ${{ github.event  }}'
    - run: echo 'Ref-- ${{ github.ref  }}'
    - run: echo 'RefName-- ${{ github.refname  }}'
    - run: echo 'github head ref-- ${{   github.head_ref }}'
    - 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
      env:
        USERNAME: ${{ secrets.CONNECTED_APP_CLIENT_ID }}
        PASSWORD: ${{ secrets.CONNECTED_APP_CLIENT_SECRET }}
        KEY: ${{ secrets.decryption_key }}    
      #run: mvn --settings .maven/settings.xml clean install -e -X --file pom.xml
      run: mvn -B  package --file pom.xml --settings .maven/settings.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_to_dev:
    environment:
      name: Dev
    if: ${{ contains(github.ref, 'dev') }}
    needs: build
    runs-on: ubuntu-latest
    steps:  
    - run: echo 'PROVIDER***--${{vars.DEPLOY_PROVIDER}}'
    - run: echo 'REPLICA COUNT***--${{vars.REPLICA_COUNT}}'

    - 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 to dev
      env:
        CONNECTED_APP_CLIENT_ID: ${{ secrets.CONNECTED_APP_CLIENT_ID }}
        CONNECTED_APP_CLIENT_SECRET: ${{ secrets.CONNECTED_APP_CLIENT_SECRET }}
        KEY: ${{ secrets.decryption_key }}
      run: |
        mvn deploy --settings .maven/settings.xml  -DskipMunitTests -Dappname_env='dev' -Denvironment=Sandbox -DMULE_ENV=dev -DDEPLOY_TARGET=Cloudhub-US-East-2 -DMULE_PROVIDER=MC -DDEPLOY_MULE_VERSION=4.6.2  -DDEPLOY_VCORE=1 -DDEPLOY_FORWARD_SSL_SESSION=true -DDEPLOY_LAST_MILE_SECURITY=true -DCONNECTED_APP_CLIENT_ID="$CONNECTED_APP_CLIENT_ID" -DCONNECTED_APP_CLIENT_SECRET="$CONNECTED_APP_CLIENT_SECRET"
```

### Update Connected App Secrets:

For connected app credentials refer [Connected App functionality](https://help.salesforce.com/s/articleView?id=001115971&type=1)

update connected app secrets in repository settings as below

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1717453999492/6669cd24-7f3f-4b47-953f-a54267e53b1c.png align="center")

If you are following any branching strategy, raise a pull request to the `develop` branch. As per the above script, the Git reference is pointed to the `develop` branch, so the pipeline will get triggered accordingly.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1717454131443/1163be98-9ac0-415f-aa06-8a587b57de28.png align="center")
