IBM App Connect Professional CI/CD
Tags: devops, appconnect, cicd, cloud
Published: 2020-06-28 14:52:45

## IBM App Connect Professional is an iPaas. What is an iPaas?
Quoting from Mulesoft (a competitor of IBM App Connect Professional) *"In simplest terms, iPaaS is a platform for building and deploying integrations within the cloud and between the cloud and the enterprise. With iPaaS, users can develop integration flows that connect applications residing in the cloud or on-premises and then deploy them without installing or managing any hardware or middleware."

IBM App Connect Professional can be installed in multiple ways. IBM provides a Docker Image also. That lets us deploy the App Connect to the Kubernetes platform.


The goal of this article is to document the steps to build a CI/CD pipeline for IBM App Connect Professional. I am using the below tools to realize this. Also, the IBM App Connect Professional version I am using is 7.5.3. 

1. Github for source code.
2. Codeship for CICD
3. Datadog for monitoring
4. Locust for Load testing.
5. Oracle Kubernetes Engine for hosting the Docker containers.

#### Here is the Deployment Architecture
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/0zqfnt8m32brcb7fxogx.png)

IBM provides the App Connect Professional software (7.5.3.0-WS-ACP-_64-docker.tar.gz), which has the requisite software and Dockerfile for customizing. 

 
#### System requirements
You can run the App Connect Professional Docker container in the following configurations:

1. Two CPUs with 4 GB RAM and a 100GB disk
2. Four CPUs with 8 or 16 GB RAM and a 100GB disk
3. Eight CPUs with 16, 24, or 32 GB RAM and a 100GB disk
For production purposes, it’s recommended that you use four or more CPUs.

Below is the customized Dockerfile
```yaml
FROM ubuntu:16.04

ARG ibm_file

ENV IRONHIDE_SOURCE /var/tmp/ironhide-setup

RUN echo "bing" && echo $ibm_file &&  apt-get update && apt-get install -y  openssh-server supervisor cron syslog-ng-core logrotate libapr1 libaprutil1 liblog4cxx10v5 libxml2 psmisc xsltproc ntp vim net-tools iputils-ping curl 

RUN curl -LO  $ibm_file --output ironhide-setup.tar.gz && tar -xzvf ironhide-setup.tar.gz

RUN ls -l &&  cd ironhide-setup &&  ls -l && cat supervisord.conf && cp supervisord.conf /etc/supervisor/conf.d/supervisord.conf  &&  sed -i -E 's/^(\s*)system\(\);/\1unix-stream("\/dev\/log");/' /etc/syslog-ng/syslog-ng.conf 

RUN sed -i 's/^su root syslog/su root adm/' /etc/logrotate.conf

RUN mkdir -p /var/log/supervisor & mkdir -p /opt/ibm/

#Directory to hold the artifacts which need to be loaded during docker launch/start
RUN mkdir -p /var/tmp/LoadArtifacts/projects & mkdir -p /var/tmp/LoadArtifacts/ThirdPartylibs & mkdir -p /var/tmp/LoadArtifacts/SecureConnectorConfig
RUN mkdir -p /var/tmp/LoadArtifacts/UsersAndGroups & mkdir -p /var/tmp/LoadArtifacts/CertificatesAndKeys

RUN cp /ironhide-setup/etc/cron.d/* /etc/cron.d/

#copy the configuration files inside docker container
COPY /projects /var/tmp/LoadArtifacts/projects
#nm 
#RUN cd \ && ls -l && pwd
#RUN cp -R /UsersAndGroups /var/tmp/LoadArtifacts/UsersAndGroups
#COPY /CertificatesAndKeys /var/tmp/LoadArtifacts/CertificatesAndKeys
#COPY /ThirdPartylibs /var/tmp/LoadArtifacts/ThirdPartylibs
#COPY /SecureConnectorConfig /var/tmp/LoadArtifacts/SecureConnectorConfig

RUN cp ironhide-setup/etc/logrotate.d/* /etc/logrotate.d/

RUN chmod 644 /etc/cron.d/*

RUN chmod -R 777 /var/tmp/ironhide-setup

ENV JAVA_HOME /usr/java/default

ENV PATH $JAVA_HOME/bin:$PATH

ENV IRONHIDE_ROOT /usr/ironhide

ENV LD_LIBRARY_PATH /usr/ironhide/lib

ENV IH_ROOT /usr/ironhide

ENV IRONHIDE_BACKUP_PATH /var/tmp/ironhide-backup

ENV PATH $IH_ROOT/bin:$PATH

ENV interface1=""

ENV interface2=""

RUN cp  ironhide-setup/scripts/liblog4cxx.so.10 /usr/lib/x86_64-linux-gnu/liblog4cxx.so.10.0.0

RUN echo 'PS1="[AppConnect-Container@\h \w]: "' >> ~/.bashrc

CMD ["/usr/bin/supervisord"]

```

Below is my codeship service file.

```yaml

app:
  build:
    image: phx.ocir.io/axyp8vsk2dul/ibmappconnect
    dockerfile_path: Dockerfile
    encrypted_args_file: config_encrypted
oracle_dockercfg:
  image: codeship/myservice-dockercfg-generator
appkubectl:
  build:
    image: phx.ocir.io/oci_kubectl:0.0.4
    dockerfile_path: DockerfileOciKube
    encrypted_args_file: config_encrypted
    args:
      CommitID: "{{.CommitID }}"


```
And below is my Codeship steps file
```yaml

# codeship-steps.yml
- name: Build and push to Oracle Docker Registry
  service: app
  tag: master
  image_name: phx.ocir.io/axyp8vsk2dul/ibmappconnect
  image_tag: "{{ .CommitID }}"
  registry: phx.ocir.io
  encrypted_dockercfg_path: dockercfg.encrypted
  type: push
- name: Check response to kubectl get nodes
  command: kubectl get nodes
  service: appkubectl
- name: Check OCI Version
  command: oci -v
  service: appkubectl  
- name: Deploy the IBM App Connect Image with flows and configs
  command: kubectl apply -f /config/.kube/ibmappconnect.yaml
  service: appkubectl
- name: Print out the environment varibales
  service: appkubectl
  command: printenv


```
##### I check in the par file to git. 

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/167vdnflqdtgdfui7dxk.png)

##### This will trigger a build in Codeship. 

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/e1ts01tw9dkmoytxgyud.png)

##### Codeship packages the par files on top IBM App Connect Professional base image and deploys to Oracle Kubernetes Engine.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/49s5zb2403ueg237c9f9.png)

##### We can use Datadog to monitor the cluster and running pods (IBM App Connect Professional container).

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/5fnfq0eqn5zw06205esc.png)

##### We can also use IBM App Connect Professional WMC and confirm everything as expected.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/72a5kt9k65rgf925vm0f.png)

##### We can run some load test and ensure the system performance will be acceptable to our end customers. 

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/x5ta93xz10d1xu91vw1g.png)