Continuous Integration and Delivery Pipeline for Python - XenonStack
# Running Python Application CMD[“python”, “wsgi.py”] The Below mentioned command will build your application container image. Building Python Docker Image The Below mentioned command will build your application container image. $ docker build – t < name of your python application > : < version of application > . Publishing Container Image To publish Python container image, we can use different private/public cloud repository like Docker Hub, AWS ECR, Google Container Registry, Private Docker Registry. Adding Container Registry to Docker Daemon If you are using docker registry other than docker hub to store images, then we need to add that container registry to our local docker daemon and kubernetes Docker daemons. You must have following things to follow the next steps. $ docker version Client: Version: 17.03 .1 – ce API version: 1.27 Go version: go1 .7 .5 Git commit: c6d412e Built: Mon Mar 27 17: 14: 09 2017 OS / Arch: linux / amd64(Ubuntu 16.04) Now we need to Create a “daemon.json” in below-mentioned location $ sudo nano / etc / docker / daemon.json And add the following content to it. { “insecure-registries”: [“”] } Now Run the following commands to reload systemctl and restart docker daemon. $ sudo systemctl daemon – reload $ sudo service docker restart To verify that your container registry is added to local docker daemon, use the below-mentioned steps. $ docker info In output of above, you get your container registry like this Insecure Registries: 127.0.0.0/8 Pushing container Images to Registry I’m using AWS ECR for publishing container images. You must have an AWS account with Amazon ECR permissions. Create AWS ECR repository using a below-mentioned link. http://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html After creation, you will get registry URL, username, and password from own AWS cloud. Here is a shell script that will add your AWS credentials for Amazon ECR in your local system so that you can push images to AWS ECR. #!/bin/bash pip install –upgrade –user awscli mkdir -p ~/.aws && chmod 755 ~/.aws cat << EOF > ~/.aws/credentials [default] aws_access_key_id = XXXXXX aws_secret_access_key = XXXXXX EOF cat << EOF > ~/.aws/config [default] output = json region = XXXXX EOF chmod 600 ~/.aws/credentials ecr-login=$(aws ecr get-login –region XXXXX) $ecr-login Now we need to retag python application image and push them to docker hub container registry. To Retag application container image $ docker tag < name of your application > : < version of your application > < aws ecr repository link > /: To Push application container Images $ docker push < aws ecr repository link > /: Configure Persistent Volume (optional) Persistent Volume is only required if your application has to save some data other than a database like documents, images, video etc. then we need to use the persistent volume that kubernetes support like was AWS EBC, CephFS, GlusterFS, Azure Disk, NFS etc. Today I will be using cephfs(rbd) for persistent data to kubernetes containers. We need to create two files named persistent-volume.yml and persistent-volume-claim.yml Persistent Volume Below I have added content for persistent-volume.yml — – apiVersion: v1 kind: PersistentVolume metadata: name: app – disk1 namespace: < namespace of Kubernetes > spec: capacity: storage: 50 Gi accessModes: -ReadWriteMany cephfs: monitors: -“172.16.0.34:6789” user: admin secretRef: name: ceph – secret readOnly: false Persistent Volume Claim Add the below-mentioned code to persistent-volume-claim.yml. — – apiVersion: v1 kind: PersistentVolumeClaim metadata: name: appclaim1 namespace: < namespace of Kubernetes > spec: accessModes: -ReadWriteMany resources: requests: storage: 10 Gi Adding Claims to Kubernetes Using below mentioned commands to add persistent volume and claim to kubernetes cluster. $ kubectl create – f persistent – volume.yml $ kubectl create – f persistent – volume – claim.yml Creating Deployment Files for Kubernetes Deploying application on kubernetes with ease using deployment and service files either in JSON or YAML format. Deployment File Following Content is for “.deployment.yml” file of Python container application. apiVersion: extensions / v1beta1 kind: Deployment metadata: name: < name of application > namespace: < namespace of Kubernetes > spec: replicas: 1 template: metadata: labels: k8s – app: < name of application > spec: containers: -name: < name of application > image: < image name > : < version tag > imagePullPolicy: “IfNotPresent” ports: -containerPort: 5035 volumeMounts: -mountPath: /app-data name: < name of application > volumes: -name: < name of application > persistentVolumeClaim: claimName: appclaim1 Service File Following Content is for “.service.yml” file of Python container application. apiVersion: v1 kind: Service metadata: labels: k8s – app: < name of application > name: < name of application > namespace: < namespace of Kubernetes > spec: type: NodePort ports: -port: 5035 selector: k8s – app: < name of application > ” image-1=”” count=”2″ html=”false” css_class=””]

Overview of Continuous Delivery

In this post, We’ll share the process how you can Develop and Deploy Python Application using Docker and Kubernetes and adopt DevOps in existing Python Applications.

Continuous delivery is a branch of continuous integration. It concentrates on automating the software delivery process so that teams can quickly and confidently deploy their code to production at any point.

Read More About Continuous delivery

 

Prerequisites are mentioned below

To follow this guide you need

Kubernetes is an open source platform that automates container operations, and Minikube is best for testing kubernetes in a local environment.

You May Also Love to Read Kubernetes Overview, Monitoring and Security

Kubectl is command line interface to manage kubernetes cluster either remotely or locally. To configure kubectl in your machine follow this link.

Shared Persistent Storage is permanent storage that we attach to the kubernetes container. We will be using cephfs as a persistent data store for kubernetes container applications.

Application Source Code is the source code that we want to run inside a kubernetes container.

Dockerfile contains all the actions that are performed to build python application.

The Registry is an online image store for container images.

Below mentioned options are few most popular registries.

1. Private Docker Hub

2. AWS ECR

3. Docker Store

4. Google Container Registry

Dockerfile

The Below mentioned code is sample docker file for Python applications. In which we are using python 2.7 development environment.


FROM python: 2.7
MAINTAINER XenonStack

# Creating Application Source Code Directory
RUN mkdir - p / usr / src / app

# Setting Home Directory
for containers
WORKDIR / usr / src / app

# Installing python dependencies
COPY requirements.txt / usr / src / app /
 RUN pip install--no - cache - dir - r requirements.txt

# Copying src code to Container
COPY. / usr / src / app

# Application Environment variables
ENV APP_ENV development

# Exposing Ports
EXPOSE 5035

# Setting Persistent data
VOLUME["/app-data"]

# Running Python Application
CMD["python", "wsgi.py"]

The Below mentioned command will build your application container image.

Building Python Docker Image

The Below mentioned command will build your application container image.


$ docker build - t < name of your python application > : < version of application > .

Publishing Container Image

To publish Python container image, we can use different private/public cloud repository like Docker Hub, AWS ECR, Google Container Registry, Private Docker Registry.

  • Adding Container Registry to Docker Daemon

If you are using docker registry other than docker hub to store images, then we need to add that container registry to our local docker daemon and kubernetes Docker daemons.

You must have following things to follow the next steps.


$ docker version
Client:
 Version: 17.03 .1 - ce
API version: 1.27
Go version: go1 .7 .5
Git commit: c6d412e
Built: Mon Mar 27 17: 14: 09 2017
OS / Arch: linux / amd64(Ubuntu 16.04)

Now we need to Create a “daemon.json” in below-mentioned location


$ sudo nano / etc / docker / daemon.json

And add the following content to it.


{
&quot;insecure-registries&quot;: [&quot;<name of="" private="" registry="" your="">&quot;]
}

Now Run the following commands to reload systemctl and restart docker daemon.


$ sudo systemctl daemon - reload
$ sudo service docker restart

To verify that your container registry is added to local docker daemon, use the below-mentioned steps.


$ docker info

In output of above, you get your container registry like this


Insecure Registries:
<your container="" name="" registry="">
127.0.0.0/8
  • Pushing container Images to Registry

I’m using AWS ECR for publishing container images.

You must have an AWS account with Amazon ECR permissions. Create AWS ECR repository using a below-mentioned link.

http://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html

After creation, you will get registry URL, username, and password from own AWS cloud.

Here is a shell script that will add your AWS credentials for Amazon ECR in your local system so that you can push images to AWS ECR.


#!/bin/bash
pip install --upgrade --user awscli

mkdir -p ~/.aws && chmod 755 ~/.aws

cat << EOF > ~/.aws/credentials
[default]
aws_access_key_id = XXXXXX
aws_secret_access_key = XXXXXX
EOF

cat << EOF > ~/.aws/config
[default]
output = json
region = XXXXX
EOF

chmod 600 ~/.aws/credentials

ecr-login=$(aws ecr get-login --region XXXXX)
$ecr-login

Now we need to retag python application image and push them to docker hub container registry.

To Retag application container image


$ docker tag &lt; name of your application &gt; : &lt; version of your application &gt; &lt; aws ecr repository link &gt; /<name application="" of="" your="">:<version application="" of="" your="">

To Push application container Images


$ docker push &lt; aws ecr repository link &gt; /<name application="" of="" your="">:<version application="" of="" your="">

Configure Persistent Volume (optional)

Persistent Volume is only required if your application has to save some data other than a database like documents, images, video etc. then we need to use the persistent volume that kubernetes support like was AWS EBC, CephFS, GlusterFS, Azure Disk, NFS etc.

Today I will be using cephfs(rbd) for persistent data to kubernetes containers.

We need to create two files named persistent-volume.yml and persistent-volume-claim.yml

  • Persistent Volume

Below I have added content for persistent-volume.yml


-- -
apiVersion: v1
kind: PersistentVolume
metadata:
 name: app - disk1
namespace: < namespace of Kubernetes >
 spec:
 capacity:
 storage: 50 Gi
accessModes:
 -ReadWriteMany
cephfs:
 monitors:
 -"172.16.0.34:6789"
user: admin
secretRef:
 name: ceph - secret
readOnly: false
  • Persistent Volume Claim

Add the below-mentioned code to persistent-volume-claim.yml.


-- -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: appclaim1
namespace: < namespace of Kubernetes >
 spec:
 accessModes:
 -ReadWriteMany
resources:
 requests:
 storage: 10 Gi
 
  • Adding Claims to Kubernetes

Using below mentioned commands to add persistent volume and claim to kubernetes cluster.


$ kubectl create - f persistent - volume.yml
$ kubectl create - f persistent - volume - claim.yml

Creating Deployment Files for Kubernetes

Deploying application on kubernetes with ease using deployment and service files either in JSON or YAML format.

  • Deployment File

Following Content is for “<name of application>.deployment.yml” file of Python container application.


apiVersion: extensions / v1beta1
kind: Deployment
metadata:
 name: < name of application >
 namespace: < namespace of Kubernetes >
 spec:
 replicas: 1
template:
 metadata:
 labels:
 k8s - app: < name of application >
 spec:
 containers:
 -name: < name of application >
 image: < image name > : < version tag >
 imagePullPolicy: "IfNotPresent"
ports:
 -containerPort: 5035
volumeMounts:
 -mountPath: /app-data
name: < name of application >
 volumes:
 -name: < name of application >
 persistentVolumeClaim:
 claimName: appclaim1
 
  • Service File

Following Content is for “<name of application>.service.yml” file of Python container application.


apiVersion: v1
kind: Service
metadata:
 labels:
 k8s - app: < name of application >
 name: < name of application >
 namespace: < namespace of Kubernetes >
 spec:
 type: NodePort
ports:
 -port: 5035
selector:
 k8s - app: < name of application >
 

Running Python Application on Kubernetes

Python Container Application can be deployed either by kubernetes Dashboard or Kubectl (Command line).

I`m using the command line that you can use in production kubernetes cluster.


$ kubectl create - f < name of application > .deployment.yml
$ kubectl create - f < name of application > .service.yml

Now we have successfully deployed Python Application on Kubernetes.

Verification

We can verify application deployment either by using Kubectl or Kubernetes Dashboard.

Below mentioned command would show you running pods of your application with status running/terminated/stop/created.


$ kubectl get po--namespace = < namespace of kubernetes > | grep < application name >

Result of above command

Information of Kubernetes Pods

Testing

Get the External Node Port using the below mentioned command. External Node Port is in the range from 30000 to 65000.


$ kubectl get svc--namespace = < namespace of kubernetes > | grep < application name >

Launch web Browser and open any of the below-mentioned URLs.

  • http://<kubernetes master ip address >: <application service port number>
  • http://<cluster ip address >: <application port number>

Troubleshooting

  • Check Status of Pods.
  • Check Logs of Pods/Containers.
  • Check Service Port Status.
  • Check requirements/dependencies of application.

How Can XenonStack Help You?

Our DevOps Consulting Services provides DevOps Assessment and Audit of your existing Infrastructure, Development Environment and Integration. We provide End-To-End Infrastructure Automation, Continuous Integration, Continuous Deployment with automated Testing and Build Process. Our DevOps Solutions enables Continuous Delivery Pipeline on Microservices and Serverless Computing on Docker, Kubernetes, Hybrid and Public Cloud.

Our DevOps Professional Services includes –

  • Single Click Deployment
  • Continuous Integration and Continuous Deployment
  • Support Microservices and Serverless Computing – Docker and Kubernetes
  • Deploy On-Premises, Public or Hybrid Cloud

To know more about our capabilities, you are advised to look into below steps:

 



[wpforms id="7646"]
<div class="wpforms-container wpforms-container-full optin-monster-forms" id="wpforms-7646"><form id="wpforms-form-7646" class="wpforms-validate wpforms-form" data-formid="7646" method="post" enctype="multipart/form-data" action="/blog/continuous-delivery-pipeline-python/"><noscript class="wpforms-error-noscript">Please enable JavaScript in your browser to complete this form.</noscript><div class="wpforms-page-indicator progress" data-indicator="progress" data-indicator-color="#72b239" data-scroll="1"><span class="wpforms-page-indicator-page-title" ></span><span class="wpforms-page-indicator-page-title-sep" style="display:none;"> - </span><span class="wpforms-page-indicator-steps">Step <span class="wpforms-page-indicator-steps-current">1</span> of 3</span><div class="wpforms-page-indicator-page-progress-wrap"><div class="wpforms-page-indicator-page-progress" style="width:33.333333333333%;background-color:#72b239;"></div></div></div><div class="wpforms-field-container"><div class="wpforms-page wpforms-page-1 "><div id="wpforms-7646-field_10-container" class="wpforms-field wpforms-field-pagebreak" data-field-id="10"></div><div id="wpforms-7646-field_24-container" class="wpforms-field wpforms-field-html form-popup-header-wrapper" data-field-id="24"><div id="wpforms-7646-field_24"><div class="form-popup-header"> <h2>Contact Us<span>!</span></h2> <p>Digitally Transform your Organization with <strong>XenonStack</strong><p> </div></div></div><div id="wpforms-7646-field_21-container" class="wpforms-field wpforms-field-radio custom-radio-btn-wrapper wpforms-list-2-columns wpforms-conditional-trigger" data-field-id="21"><label class="wpforms-field-label wpforms-label-hide" for="wpforms-7646-field_21">Sevices <span class="wpforms-required-label">*</span></label><ul id="wpforms-7646-field_21" class="wpforms-field-required wpforms-image-choices wpforms-image-choices-modern"><li class="choice-1 depth-1 wpforms-image-choices-item"><label class="wpforms-field-label-inline" for="wpforms-7646-field_21_1" tabindex="0"><span class="wpforms-image-choices-image"><img src="https://www.xenonstack.com/wp-content/uploads/2020/06/application-modernisation-popup-option-e1593153816141.png" alt="Application Modernisation " title="Application Modernisation "></span><input type="radio" id="wpforms-7646-field_21_1" class="wpforms-screen-reader-element" name="wpforms[fields][21]" value="Application Modernisation " tabindex="-1" required ><span class="wpforms-image-choices-label">Application Modernisation </span></label></li><li class="choice-2 depth-1 wpforms-image-choices-item"><label class="wpforms-field-label-inline" for="wpforms-7646-field_21_2" tabindex="0"><span class="wpforms-image-choices-image"><img src="https://www.xenonstack.com/wp-content/uploads/2020/06/bigdata-analytics-popup-option-e1593153889151.png" alt="Big Data Analytics" title="Big Data Analytics"></span><input type="radio" id="wpforms-7646-field_21_2" class="wpforms-screen-reader-element" name="wpforms[fields][21]" value="Big Data Analytics" tabindex="-1" required ><span class="wpforms-image-choices-label">Big Data Analytics</span></label></li><li class="choice-3 depth-1 wpforms-image-choices-item"><label class="wpforms-field-label-inline" for="wpforms-7646-field_21_3" tabindex="0"><span class="wpforms-image-choices-image"><img src="https://www.xenonstack.com/wp-content/uploads/2020/06/cloud-migrations-popup-option-e1593153901704.png" alt="Cloud Migrations" title="Cloud Migrations"></span><input type="radio" id="wpforms-7646-field_21_3" class="wpforms-screen-reader-element" name="wpforms[fields][21]" value="Cloud Migrations" tabindex="-1" required ><span class="wpforms-image-choices-label">Cloud Migrations</span></label></li><li class="choice-4 depth-1 wpforms-image-choices-item"><label class="wpforms-field-label-inline" for="wpforms-7646-field_21_4" tabindex="0"><span class="wpforms-image-choices-image"><img src="https://www.xenonstack.com/wp-content/uploads/2020/06/data-visualization-popup-option-e1593153911839.png" alt="Data Visualization" title="Data Visualization"></span><input type="radio" id="wpforms-7646-field_21_4" class="wpforms-screen-reader-element" name="wpforms[fields][21]" value="Data Visualization" tabindex="-1" required ><span class="wpforms-image-choices-label">Data Visualization</span></label></li><li class="choice-5 depth-1 wpforms-image-choices-item"><label class="wpforms-field-label-inline" for="wpforms-7646-field_21_5" tabindex="0"><span class="wpforms-image-choices-image"><img src="https://www.xenonstack.com/wp-content/uploads/2020/06/robotic-process-automation-popup-option-e1593153919805.png" alt="Robotic Process Automation" title="Robotic Process Automation"></span><input type="radio" id="wpforms-7646-field_21_5" class="wpforms-screen-reader-element" name="wpforms[fields][21]" value="Robotic Process Automation" tabindex="-1" required ><span class="wpforms-image-choices-label">Robotic Process Automation</span></label></li></ul></div><div id="wpforms-7646-field_23-container" class="wpforms-field wpforms-field-pagebreak" data-field-id="23"><div class="wpforms-clear wpforms-pagebreak-left"><button class="wpforms-page-button wpforms-page-next" data-action="next" data-page="1" data-formid="7646">Next</button></div></div></div><div class="wpforms-page wpforms-page-2 " style="display:none;"><div id="wpforms-7646-field_25-container" class="wpforms-field wpforms-field-html form-popup-header-wrapper" data-field-id="25"><div id="wpforms-7646-field_25"><div class="form-popup-header"> <h2>How can we get in Touch</h2> <p>Fill the form and we will revert back to you soon.<p> </div></div></div><div id="wpforms-7646-field_20-container" class="wpforms-field wpforms-field-name col-12 col-sm-10 col-md-8 form-group" data-field-id="20"><label class="wpforms-field-label" for="wpforms-7646-field_20">Name <span class="wpforms-required-label">*</span></label><input type="text" id="wpforms-7646-field_20" class="wpforms-field-large wpforms-field-required" name="wpforms[fields][20]" placeholder="Name" required></div><div id="wpforms-7646-field_2-container" class="wpforms-field wpforms-field-email col-12 col-sm-10 col-md-8 form-group" data-field-id="2"><label class="wpforms-field-label" for="wpforms-7646-field_2">Email <span class="wpforms-required-label">*</span></label><input type="email" id="wpforms-7646-field_2" class="wpforms-field-large wpforms-field-required" name="wpforms[fields][2]" placeholder="Email" required></div><div id="wpforms-7646-field_3-container" class="wpforms-field wpforms-field-text col-12 col-sm-10 col-md-8 form-group" data-field-id="3"><label class="wpforms-field-label" for="wpforms-7646-field_3">Organization <span class="wpforms-required-label">*</span></label><input type="text" id="wpforms-7646-field_3" class="wpforms-field-large wpforms-field-required" name="wpforms[fields][3]" placeholder="Organization" required></div><div id="wpforms-7646-field_12-container" class="wpforms-field wpforms-field-pagebreak next-btn-wrapper" data-field-id="12"><div class="wpforms-clear wpforms-pagebreak-left"><button class="wpforms-page-button wpforms-page-next" data-action="next" data-page="2" data-formid="7646">Next</button></div></div></div><div class="wpforms-page wpforms-page-3 last next-btn-wrapper" style="display:none;"><div id="wpforms-7646-field_34-container" class="wpforms-field wpforms-field-html form-popup-header-wrapper" data-field-id="34"><div id="wpforms-7646-field_34"><div class="form-popup-header"> <h2>Share Your Requirements</h2> </div></div></div><div id="wpforms-7646-field_7-container" class="wpforms-field wpforms-field-checkbox col-12 col-sm-12 col-md-12 custom-checkbox form-group wpforms-list-2-columns wpforms-conditional-field wpforms-conditional-show" data-field-id="7" style="display:none;"><label class="wpforms-field-label" for="wpforms-7646-field_7">Application Modernization Services <span class="wpforms-required-label">*</span></label><ul id="wpforms-7646-field_7" class="wpforms-field-required"><li class="choice-1 depth-1"><input type="checkbox" id="wpforms-7646-field_7_1" name="wpforms[fields][7][]" value="Application Re-platform " required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_7_1">Application Re-platform </label></li><li class="choice-2 depth-1"><input type="checkbox" id="wpforms-7646-field_7_2" name="wpforms[fields][7][]" value="Application Migration " required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_7_2">Application Migration </label></li><li class="choice-3 depth-1"><input type="checkbox" id="wpforms-7646-field_7_3" name="wpforms[fields][7][]" value="Cloud Native Transformation" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_7_3">Cloud Native Transformation</label></li><li class="choice-4 depth-1"><input type="checkbox" id="wpforms-7646-field_7_4" name="wpforms[fields][7][]" value="Application Assessment" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_7_4">Application Assessment</label></li><li class="choice-5 depth-1"><input type="checkbox" id="wpforms-7646-field_7_5" name="wpforms[fields][7][]" value="Application Re-engineering" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_7_5">Application Re-engineering</label></li></ul></div><div id="wpforms-7646-field_28-container" class="wpforms-field wpforms-field-checkbox col-12 col-sm-12 col-md-12 custom-checkbox form-group wpforms-list-2-columns wpforms-conditional-field wpforms-conditional-show" data-field-id="28" style="display:none;"><label class="wpforms-field-label" for="wpforms-7646-field_28">Data Visualization Services <span class="wpforms-required-label">*</span></label><ul id="wpforms-7646-field_28" class="wpforms-field-required" data-choice-limit="1"><li class="choice-1 depth-1"><input type="checkbox" id="wpforms-7646-field_28_1" data-rule-check-limit="true" name="wpforms[fields][28][]" value="Data Visualization Cloud Services" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_28_1">Data Visualization Cloud Services</label></li><li class="choice-2 depth-1"><input type="checkbox" id="wpforms-7646-field_28_2" data-rule-check-limit="true" name="wpforms[fields][28][]" value="Dashboard and User Experience Design" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_28_2">Dashboard and User Experience Design</label></li><li class="choice-3 depth-1"><input type="checkbox" id="wpforms-7646-field_28_3" data-rule-check-limit="true" name="wpforms[fields][28][]" value="Data Visualization Integration " required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_28_3">Data Visualization Integration </label></li><li class="choice-4 depth-1"><input type="checkbox" id="wpforms-7646-field_28_4" data-rule-check-limit="true" name="wpforms[fields][28][]" value="Analytics and Reporting Solutions " required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_28_4">Analytics and Reporting Solutions </label></li></ul></div><div id="wpforms-7646-field_35-container" class="wpforms-field wpforms-field-checkbox col-12 col-sm-12 col-md-12 custom-checkbox form-group wpforms-list-2-columns wpforms-conditional-field wpforms-conditional-show" data-field-id="35" style="display:none;"><label class="wpforms-field-label" for="wpforms-7646-field_35">Data Visualization Tools <span class="wpforms-required-label">*</span></label><ul id="wpforms-7646-field_35" class="wpforms-field-required" data-choice-limit="1"><li class="choice-1 depth-1"><input type="checkbox" id="wpforms-7646-field_35_1" data-rule-check-limit="true" name="wpforms[fields][35][]" value="Microsoft Power BI" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_35_1">Microsoft Power BI</label></li><li class="choice-2 depth-1"><input type="checkbox" id="wpforms-7646-field_35_2" data-rule-check-limit="true" name="wpforms[fields][35][]" value="Amazon QuickSight" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_35_2">Amazon QuickSight</label></li><li class="choice-3 depth-1"><input type="checkbox" id="wpforms-7646-field_35_3" data-rule-check-limit="true" name="wpforms[fields][35][]" value="Google Data Studio" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_35_3">Google Data Studio</label></li><li class="choice-4 depth-1"><input type="checkbox" id="wpforms-7646-field_35_4" data-rule-check-limit="true" name="wpforms[fields][35][]" value="Tableau" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_35_4">Tableau</label></li></ul></div><div id="wpforms-7646-field_29-container" class="wpforms-field wpforms-field-checkbox col-12 col-sm-12 col-md-12 custom-checkbox form-group wpforms-list-2-columns wpforms-conditional-field wpforms-conditional-show" data-field-id="29" style="display:none;"><label class="wpforms-field-label" for="wpforms-7646-field_29">Big Data Services <span class="wpforms-required-label">*</span></label><ul id="wpforms-7646-field_29" class="wpforms-field-required"><li class="choice-1 depth-1"><input type="checkbox" id="wpforms-7646-field_29_1" name="wpforms[fields][29][]" value="Modern Data Integration " required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_29_1">Modern Data Integration </label></li><li class="choice-2 depth-1"><input type="checkbox" id="wpforms-7646-field_29_2" name="wpforms[fields][29][]" value="Big Data Governance and Security" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_29_2">Big Data Governance and Security</label></li><li class="choice-3 depth-1"><input type="checkbox" id="wpforms-7646-field_29_3" name="wpforms[fields][29][]" value="Enterprise Data Strategy" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_29_3">Enterprise Data Strategy</label></li><li class="choice-4 depth-1"><input type="checkbox" id="wpforms-7646-field_29_4" name="wpforms[fields][29][]" value="Data Catalog" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_29_4">Data Catalog</label></li><li class="choice-5 depth-1"><input type="checkbox" id="wpforms-7646-field_29_5" name="wpforms[fields][29][]" value="Data Discovery " required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_29_5">Data Discovery </label></li></ul></div><div id="wpforms-7646-field_8-container" class="wpforms-field wpforms-field-checkbox col-12 col-sm-12 col-md-12 custom-checkbox form-group wpforms-list-2-columns wpforms-conditional-field wpforms-conditional-show" data-field-id="8" style="display:none;"><label class="wpforms-field-label" for="wpforms-7646-field_8">Data Ingestion Tools <span class="wpforms-required-label">*</span></label><ul id="wpforms-7646-field_8" class="wpforms-field-required"><li class="choice-1 depth-1"><input type="checkbox" id="wpforms-7646-field_8_1" name="wpforms[fields][8][]" value="Amazon Kinesis" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_8_1">Amazon Kinesis</label></li><li class="choice-2 depth-1"><input type="checkbox" id="wpforms-7646-field_8_2" name="wpforms[fields][8][]" value="Apache Kafka" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_8_2">Apache Kafka</label></li><li class="choice-3 depth-1"><input type="checkbox" id="wpforms-7646-field_8_3" name="wpforms[fields][8][]" value="Google Pub/Sub" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_8_3">Google Pub/Sub</label></li><li class="choice-4 depth-1"><input type="checkbox" id="wpforms-7646-field_8_4" name="wpforms[fields][8][]" value="Apache Pulsar" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_8_4">Apache Pulsar</label></li></ul></div><div id="wpforms-7646-field_30-container" class="wpforms-field wpforms-field-checkbox col-12 col-sm-12 col-md-12 custom-checkbox form-group wpforms-list-2-columns wpforms-conditional-field wpforms-conditional-show" data-field-id="30" style="display:none;"><label class="wpforms-field-label" for="wpforms-7646-field_30">Data Processing Tools <span class="wpforms-required-label">*</span></label><ul id="wpforms-7646-field_30" class="wpforms-field-required"><li class="choice-1 depth-1"><input type="checkbox" id="wpforms-7646-field_30_1" name="wpforms[fields][30][]" value="Apache Spark" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_30_1">Apache Spark</label></li><li class="choice-2 depth-1"><input type="checkbox" id="wpforms-7646-field_30_2" name="wpforms[fields][30][]" value="Apache Flink" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_30_2">Apache Flink</label></li><li class="choice-3 depth-1"><input type="checkbox" id="wpforms-7646-field_30_3" name="wpforms[fields][30][]" value="Apache Beam" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_30_3">Apache Beam</label></li><li class="choice-4 depth-1"><input type="checkbox" id="wpforms-7646-field_30_4" name="wpforms[fields][30][]" value="Amazon EMR" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_30_4">Amazon EMR</label></li><li class="choice-6 depth-1"><input type="checkbox" id="wpforms-7646-field_30_6" name="wpforms[fields][30][]" value="Google Cloud Dataproc" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_30_6">Google Cloud Dataproc</label></li></ul></div><div id="wpforms-7646-field_31-container" class="wpforms-field wpforms-field-checkbox col-12 col-sm-12 col-md-12 custom-checkbox form-group wpforms-list-2-columns wpforms-conditional-field wpforms-conditional-show" data-field-id="31" style="display:none;"><label class="wpforms-field-label" for="wpforms-7646-field_31">Cloud Services <span class="wpforms-required-label">*</span></label><ul id="wpforms-7646-field_31" class="wpforms-field-required"><li class="choice-1 depth-1"><input type="checkbox" id="wpforms-7646-field_31_1" name="wpforms[fields][31][]" value="Cloud Governance and Security" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_31_1">Cloud Governance and Security</label></li><li class="choice-2 depth-1"><input type="checkbox" id="wpforms-7646-field_31_2" name="wpforms[fields][31][]" value="Cloud Native Microservices" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_31_2">Cloud Native Microservices</label></li><li class="choice-3 depth-1"><input type="checkbox" id="wpforms-7646-field_31_3" name="wpforms[fields][31][]" value="Cloud Infrastructure Automation" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_31_3">Cloud Infrastructure Automation</label></li><li class="choice-4 depth-1"><input type="checkbox" id="wpforms-7646-field_31_4" name="wpforms[fields][31][]" value="Managed Cloud Services" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_31_4">Managed Cloud Services</label></li><li class="choice-5 depth-1"><input type="checkbox" id="wpforms-7646-field_31_5" name="wpforms[fields][31][]" value="Cloud Data Migration" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_31_5">Cloud Data Migration</label></li></ul></div><div id="wpforms-7646-field_32-container" class="wpforms-field wpforms-field-checkbox col-12 col-sm-12 col-md-12 custom-checkbox form-group wpforms-list-2-columns wpforms-conditional-field wpforms-conditional-show" data-field-id="32" style="display:none;"><label class="wpforms-field-label" for="wpforms-7646-field_32">IT Infrastructure <span class="wpforms-required-label">*</span></label><ul id="wpforms-7646-field_32" class="wpforms-field-required"><li class="choice-1 depth-1"><input type="checkbox" id="wpforms-7646-field_32_1" name="wpforms[fields][32][]" value="AWS" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_32_1">AWS</label></li><li class="choice-2 depth-1"><input type="checkbox" id="wpforms-7646-field_32_2" name="wpforms[fields][32][]" value="Google" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_32_2">Google</label></li><li class="choice-3 depth-1"><input type="checkbox" id="wpforms-7646-field_32_3" name="wpforms[fields][32][]" value="Azure" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_32_3">Azure</label></li><li class="choice-4 depth-1"><input type="checkbox" id="wpforms-7646-field_32_4" name="wpforms[fields][32][]" value="Private Cloud" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_32_4">Private Cloud</label></li><li class="choice-6 depth-1"><input type="checkbox" id="wpforms-7646-field_32_6" name="wpforms[fields][32][]" value="Data Center" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_32_6">Data Center</label></li></ul></div><div id="wpforms-7646-field_33-container" class="wpforms-field wpforms-field-checkbox col-12 col-sm-12 col-md-12 custom-checkbox form-group wpforms-list-2-columns wpforms-conditional-field wpforms-conditional-show" data-field-id="33" style="display:none;"><label class="wpforms-field-label" for="wpforms-7646-field_33">AI Services <span class="wpforms-required-label">*</span></label><ul id="wpforms-7646-field_33" class="wpforms-field-required"><li class="choice-1 depth-1"><input type="checkbox" id="wpforms-7646-field_33_1" name="wpforms[fields][33][]" value="Computer Vision Services" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_33_1">Computer Vision Services</label></li><li class="choice-2 depth-1"><input type="checkbox" id="wpforms-7646-field_33_2" name="wpforms[fields][33][]" value="Robotic Process Automation" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_33_2">Robotic Process Automation</label></li><li class="choice-3 depth-1"><input type="checkbox" id="wpforms-7646-field_33_3" name="wpforms[fields][33][]" value="Enterprise Operational Analytics" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_33_3">Enterprise Operational Analytics</label></li><li class="choice-4 depth-1"><input type="checkbox" id="wpforms-7646-field_33_4" name="wpforms[fields][33][]" value="AI Based Development" required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_33_4">AI Based Development</label></li><li class="choice-5 depth-1"><input type="checkbox" id="wpforms-7646-field_33_5" name="wpforms[fields][33][]" value="AI Strategy Consulting " required ><label class="wpforms-field-label-inline" for="wpforms-7646-field_33_5">AI Strategy Consulting </label></li></ul></div><div id="wpforms-7646-field_36-container" class="wpforms-field wpforms-field-checkbox col-12 col-sm-12 col-md-12 custom-checkbox form-group wpforms-list-2-columns wpforms-conditional-field wpforms-conditional-show" data-field-id="36" style="display:none;"><label class="wpforms-field-label" for="wpforms-7646-field_36">Robotic Process Automation Platform</label><ul id="wpforms-7646-field_36"><li class="choice-2 depth-1"><input type="checkbox" id="wpforms-7646-field_36_2" name="wpforms[fields][36][]" value="Blue Prism " ><label class="wpforms-field-label-inline" for="wpforms-7646-field_36_2">Blue Prism </label></li><li class="choice-4 depth-1"><input type="checkbox" id="wpforms-7646-field_36_4" name="wpforms[fields][36][]" value="UiPath" ><label class="wpforms-field-label-inline" for="wpforms-7646-field_36_4">UiPath</label></li><li class="choice-5 depth-1"><input type="checkbox" id="wpforms-7646-field_36_5" name="wpforms[fields][36][]" value="Automation Anywhere" ><label class="wpforms-field-label-inline" for="wpforms-7646-field_36_5">Automation Anywhere</label></li></ul></div><div id="wpforms-7646-field_11-container" class="wpforms-field wpforms-field-pagebreak" data-field-id="11"><div class="wpforms-clear wpforms-pagebreak-left"></div></div></div></div><div class="wpforms-field wpforms-field-hp"><label for="wpforms-7646-field-hp" class="wpforms-field-label">Website</label><input type="text" name="wpforms[hp]" id="wpforms-7646-field-hp" class="wpforms-field-medium"></div><input type="hidden" name="wpforms[recaptcha]" value=""><div class="wpforms-submit-container" style="display:none;"><input type="hidden" name="wpforms[id]" value="7646"><input type="hidden" name="wpforms[author]" value="2"><input type="hidden" name="wpforms[post_id]" value="348"><button type="submit" name="wpforms[submit]" class="wpforms-submit om-trigger-conversion mon-btn" id="wpforms-submit-7646" value="wpforms-submit" aria-live="assertive" data-alt-text="Submitting..." data-submit-text="Submit">Submit</button></div></form></div> <!-- .wpforms-container -->
[wpforms id="1328"]
<div class="wpforms-container wpforms-container-full subscription-form optin-monster-forms" id="wpforms-1328"><form id="wpforms-form-1328" class="wpforms-validate wpforms-form" data-formid="1328" method="post" enctype="multipart/form-data" action="/blog/continuous-delivery-pipeline-python/"><noscript class="wpforms-error-noscript">Please enable JavaScript in your browser to complete this form.</noscript><div class="wpforms-field-container"><div id="wpforms-1328-field_1-container" class="wpforms-field wpforms-field-email col-12 col-sm-12 col-md-12 form-group" data-field-id="1"><label class="wpforms-field-label wpforms-label-hide" for="wpforms-1328-field_1">Email <span class="wpforms-required-label">*</span></label><input type="email" id="wpforms-1328-field_1" class="wpforms-field-large wpforms-field-required" name="wpforms[fields][1]" placeholder="Email address" required></div><div id="wpforms-1328-field_8-container" class="wpforms-field wpforms-field-hidden" data-field-id="8"><input type="hidden" id="wpforms-1328-field_8" name="wpforms[fields][8]" value="Subscribe"></div></div><div class="wpforms-field wpforms-field-hp"><label for="wpforms-1328-field-hp" class="wpforms-field-label">Comment</label><input type="text" name="wpforms[hp]" id="wpforms-1328-field-hp" class="wpforms-field-medium"></div><input type="hidden" name="wpforms[recaptcha]" value=""><div class="wpforms-submit-container" ><input type="hidden" name="wpforms[id]" value="1328"><input type="hidden" name="wpforms[author]" value="2"><input type="hidden" name="wpforms[post_id]" value="348"><button type="submit" name="wpforms[submit]" class="wpforms-submit om-trigger-conversion btn" id="wpforms-submit-1328" value="wpforms-submit" aria-live="assertive" data-alt-text="Sending..." data-submit-text="Subscribe">Subscribe</button></div></form></div> <!-- .wpforms-container -->