Skip to content

Commit

Permalink
Cicd changes (#36)
Browse files Browse the repository at this point in the history
* CI/CD pipeline integration
Co-authored-by: froala-travis-bot <[email protected]>
  • Loading branch information
froala-travis-bot authored Nov 30, 2022
1 parent 7d2ada7 commit 9e5fc80
Show file tree
Hide file tree
Showing 6 changed files with 274 additions and 0 deletions.
34 changes: 34 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
git:
depth: false
quiet: false
language: generic
dist: bionic
sudo: required
branches:
only:
- /dev*/
- /AO-dev*/
- /QA*/
- /QE*/
- /RC*/
- /Release-Master*/
env:
- SHORT_COMMIT= `git rev-parse --short=7 ${TRAVIS_COMMIT}`

before_install:
- echo $TRAVIS_BRANCH
- echo $PWD
- echo $TRAVIS_COMMIT
- echo $BUILD_REPO_NAME
jobs:
include:
if: commit_message =~ /(deploy-yes)/
script:
- chmod u+x push-image-to-nexus.sh && bash push-image-to-nexus.sh
- chmod u+x deploy_sdk.sh && bash deploy_sdk.sh
notifications:
email:
recipients:
- [email protected]
on_success: always
on_failure: always
23 changes: 23 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
FROM node:14 as build

LABEL maintainer="[email protected]"

ARG PackageName
ARG PackageVersion
ARG NexusUser
ARG NexusPassword


WORKDIR /app
COPY . .

RUN apt update -y \
&& apt install -y jq unzip wget
RUN wget --no-check-certificate --user ${NexusUser} --password ${NexusPassword} https://nexus.tools.froala-infra.com/repository/Froala-npm/${PackageName}/-/${PackageName}-${PackageVersion}.tgz
RUN npm install -g bower
RUN npm install
RUN bower install
FROM nginx:alpine
copy --from=build /app /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
155 changes: 155 additions & 0 deletions deploy_sdk.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
#!/bin/bash
if [ ${TRAVIS_PULL_REQUEST} != "false" ]; then echo "Not deploying on a pull request !!!" && exit 0; fi
PACKAGE_VERSION=`jq '.version' version.json | tr -d '"'`
export IMAGE_NAME=`echo "froala-${BUILD_REPO_NAME}_${TRAVIS_BRANCH}:${PACKAGE_VERSION}" | tr '[:upper:]' '[:lower:]'`
export BASE_DOMAIN="froala-infra.com"
export SDK_ENVIRONMENT=""
export DEPLOYMENT_SERVER=""
SERVICE_NAME=""
CONTAINER_NAME=""
CT_INDEX=0
AO_IDENTIFIER=`echo ${TRAVIS_BRANCH}`
echo "${AO_IDENTIFIER}"
OLDEST_CONTAINER=""
echo "${SSH_KEY}" | base64 --decode > /tmp/sshkey.pem
chmod 400 /tmp/sshkey.pem
export MAX_DEPLOYMENTS_NR=0
function get_max_deployments_per_env(){
local ENVIRONMENT=$1
echo "getting max deployments for environment ${ENVIRONMENT}"
MAX_DEPLOYMENTS_NR=`jq --arg sdkenvironment ${ENVIRONMENT} '.[$sdkenvironment]' version.json | tr -d '"'`
echo "detected max deployments: ${MAX_DEPLOYMENTS_NR}"
}
function generate_container_name(){
local LW_REPO_NAME=$1
local LW_SHORT_TRAVIS_BRANCH=$2
local SDK_ENVIRONMENT=$3
local DEPLOYMENT_SERVER=$4
echo "searching for ${LW_REPO_NAME} depl..."
sleep 1
RUNNING_DEPL=`ssh -o "StrictHostKeyChecking no" -i /tmp/sshkey.pem ${SSH_USER}@${DEPLOYMENT_SERVER} " sudo docker ps | grep -i ${LW_REPO_NAME}"`
echo "running depl var: ${RUNNING_DEPL}"
echo "looking for ${LW_REPO_NAME} deployments"
echo "getting indexes for oldest and latest deployed container"
DEPL='ssh -o "StrictHostKeyChecking no" -i /tmp/sshkey.pem '
DEPL="${DEPL} ${SSH_USER}@${DEPLOYMENT_SERVER} "
REL=' " sudo docker ps | grep -i '
DEPL="${DEPL} ${REL} "
DEPL="${DEPL} ${LW_REPO_NAME}-${AO_IDENTIFIER} "
REL='"'
DEPL="${DEPL} ${REL} "
echo "show docker containers ssh cmd: $DEPL"
echo ${DEPL} | bash > file.txt
echo "running conatiners: "
cat file.txt
CT_LOWER_INDEX=`cat file.txt | awk -F'-' '{print $NF }' | sort -nk1 | head -1`
CT_HIGHER_INDEX=`cat file.txt | awk -F'-' '{print $NF }' | sort -nk1 | tail -1`
echo "lowest index : ${CT_LOWER_INDEX} ; and highest index : ${CT_HIGHER_INDEX}"
if [ -z "${RUNNING_DEPL}" ]; then
echo "first deployment"
CT_INDEX=1
CONTAINER_NAME="${LW_REPO_NAME}-${AO_IDENTIFIER}-${CT_INDEX}"
SERVICE_NAME="${LW_REPO_NAME}-${LW_SHORT_TRAVIS_BRANCH}"
else
echo "multiple deployments"
CT_INDEX=${CT_HIGHER_INDEX} && CT_INDEX=$((CT_INDEX+1))
OLDEST_CONTAINER="${LW_REPO_NAME}-${AO_IDENTIFIER}-${CT_LOWER_INDEX}"
CONTAINER_NAME="${LW_REPO_NAME}-${AO_IDENTIFIER}-${CT_INDEX}"
SERVICE_NAME="${LW_REPO_NAME}-${LW_SHORT_TRAVIS_BRANCH}-${CT_INDEX}"
echo "new index: ${CT_INDEX} & oldest horse out there: ${OLDEST_CONTAINER}"
fi
}
echo " Container port: ${CONTAINER_SERVICE_PORTNO}"
export BRANCH_NAME=`echo "${TRAVIS_BRANCH}" | tr '[:upper:]' '[:lower:]'`
case "${BRANCH_NAME}" in
dev*) SDK_ENVIRONMENT="dev" && DEPLOYMENT_SERVER=${FROALA_SRV_DEV} ;;
ao-dev*) SDK_ENVIRONMENT="dev" && DEPLOYMENT_SERVER=${FROALA_SRV_DEV} ;;
ao*) SDK_ENVIRONMENT="dev" && DEPLOYMENT_SERVER=${FROALA_SRV_DEV} ;;
qa*) SDK_ENVIRONMENT="qa" && DEPLOYMENT_SERVER=${FROALA_SRV_QA} ;;
qe*) SDK_ENVIRONMENT="qe" && DEPLOYMENT_SERVER=${FROALA_SRV_QE} ;;
rc*) SDK_ENVIRONMENT="stg" && DEPLOYMENT_SERVER=${FROALA_SRV_STAGING} ;;
release-master*) SDK_ENVIRONMENT="stg" && DEPLOYMENT_SERVER=${FROALA_SRV_STAGING} ;;
ft*) echo "Building only on feature branch ${TRAVIS_BRANCH}... will not deploy..." && exit 0;;
bf*) echo "Building only on bugfix branch ${TRAVIS_BRANCH}... will not deploy..." && exit 0;;
test*) echo "Building only on bugfix branch ${TRAVIS_BRANCH}... will not deploy..." && exit 0;;
*) echo "Not a deployment branch" && exit -1;;
esac
get_max_deployments_per_env $SDK_ENVIRONMENT
echo "deploying on environment :${SDK_ENVIRONMENT}, on server ${DEPLOYMENT_SERVER}, max deployments: ${MAX_DEPLOYMENTS_NR}"
export BASE_DOMAIN="froala-infra.com"
SHORT_REPO_NAME="${BUILD_REPO_NAME:0:17}"
BRANCH_LENGHT=`echo ${TRAVIS_BRANCH} |awk '{print length}'`
if [ ${BRANCH_LENGHT} -lt 18 ]; then
SHORT_TRAVIS_BRANCH=${TRAVIS_BRANCH}
else
SHORT_TRAVIS_BRANCH="${TRAVIS_BRANCH:0:8}${TRAVIS_BRANCH: -8}"
fi
echo " short branch name : ${SHORT_TRAVIS_BRANCH}"
SHORT_TRAVIS_BRANCH=`echo ${SHORT_TRAVIS_BRANCH} | sed -r 's/-//g'`
SHORT_TRAVIS_BRANCH=`echo ${SHORT_TRAVIS_BRANCH} | sed -r 's/\.//g'`
SHORT_TRAVIS_BRANCH=`echo ${SHORT_TRAVIS_BRANCH} | sed -r 's/_//g'`
echo " short branch name : ${SHORT_TRAVIS_BRANCH}"
DEPLOYMENT_URL="${SHORT_REPO_NAME}-${SHORT_TRAVIS_BRANCH}.${SDK_ENVIRONMENT}.${BASE_DOMAIN}"
echo " deployment URL: https://${DEPLOYMENT_URL}"
cp docker-compose.yml.template docker-compose.yml
LW_REPO_NAME=`echo "${BUILD_REPO_NAME}" | tr '[:upper:]' '[:lower:]'`
LW_REPO_NAME=`echo ${LW_REPO_NAME} | sed -r 's/_//g'`
LW_REPO_NAME=`echo ${LW_REPO_NAME} | sed -r 's/-//g'`
LW_REPO_NAME=`echo ${LW_REPO_NAME} | sed -r 's/\.//g'`
LW_SHORT_TRAVIS_BRANCH=`echo "${SHORT_TRAVIS_BRANCH}" | tr '[:upper:]' '[:lower:]'`
generate_container_name ${LW_REPO_NAME} ${LW_SHORT_TRAVIS_BRANCH} ${DEPLOYMENT_SERVER} ${DEPLOYMENT_SERVER}
echo "service name : ${SERVICE_NAME} & container name : ${CONTAINER_NAME}"
sed -i "s/ImageName/${NEXUS_CR_TOOLS_URL}\/${IMAGE_NAME}/g" docker-compose.yml
sed -i "s/UrlName/${DEPLOYMENT_URL}/g" docker-compose.yml
sed -i "s/ServiceName/${SERVICE_NAME}/g" docker-compose.yml
sed -i "s/PortNum/${CONTAINER_SERVICE_PORTNO}/g" docker-compose.yml
sed -i "s/ContainerName/${CONTAINER_NAME}/g" docker-compose.yml
cat docker-compose.yml
LW_REPO_NAME_LENGTH=`echo ${LW_REPO_NAME} |awk '{print length}'`
SHORT_SERVICE_NAME="${SERVICE_NAME:0:$LW_REPO_NAME_LENGTH}"
echo "short service name: ${SHORT_SERVICE_NAME}"
function deploy_service(){
ssh -o "StrictHostKeyChecking no" -i /tmp/sshkey.pem ${SSH_USER}@${DEPLOYMENT_SERVER} "if [ -d /services/${SERVICE_NAME} ]; then rm -rf /services/${SERVICE_NAME}; fi && mkdir /services/${SERVICE_NAME}"
scp -o "StrictHostKeyChecking no" -i /tmp/sshkey.pem docker-compose.yml ${SSH_USER}@${DEPLOYMENT_SERVER}:/services/${SERVICE_NAME}/docker-compose.yml
ssh -o "StrictHostKeyChecking no" -i /tmp/sshkey.pem ${SSH_USER}@${DEPLOYMENT_SERVER} " cd /services/${SERVICE_NAME}/ && sudo docker-compose pull"
ssh -o "StrictHostKeyChecking no" -i /tmp/sshkey.pem ${SSH_USER}@${DEPLOYMENT_SERVER} " cd /services/${SERVICE_NAME}/ && sudo docker-compose up -d"
sleep 10 && ssh -o "StrictHostKeyChecking no" -i /tmp/sshkey.pem ${SSH_USER}@${DEPLOYMENT_SERVER} " sudo docker ps -a | grep -i ${SERVICE_NAME}"
echo "Docker-compose is in : /services/${SERVICE_NAME} "
sleep 30
RET_CODE=`curl -k -s -o /tmp/notimportant.txt -w "%{http_code}" https://${DEPLOYMENT_URL}`
echo "validation code: $RET_CODE for https://${DEPLOYMENT_URL}"
if [ $RET_CODE -ne 200 ]; then
echo "Deployment validation failed!!! Please check pipeline logs."
exit -1
else
echo " Service available at URL: https://${DEPLOYMENT_URL}/demo/index.html"

fi
}
DEPLOYMENT_IS_RUNNING=`echo "${LW_REPO_NAME}-${AO_IDENTIFIER}-${CT_LOWER_INDEX}" | tr '[:upper:]' '[:lower:]'`
REDEPLOYMENT=`ssh -o "StrictHostKeyChecking no" -i /tmp/sshkey.pem ${SSH_USER}@${DEPLOYMENT_SERVER} " sudo docker ps -a | grep -i "${DEPLOYMENT_IS_RUNNING}" | wc -l" `
echo "${DEPLOYMENT_IS_RUNNING}"
echo "checking if this PRD exists & do redeploy: ${REDEPLOYMENT}"
if [ ${REDEPLOYMENT} -eq 1 ]; then
echo "Redeploying service: ${SERVICE_NAME} ..."
deploy_service
fi
EXISTING_DEPLOYMENTS=`ssh -o "StrictHostKeyChecking no" -i /tmp/sshkey.pem ${SSH_USER}@${DEPLOYMENT_SERVER} " sudo docker ps | grep -i "${LW_REPO_NAME}-${AO_IDENTIFIER}" | wc -l" `
if [ ${EXISTING_DEPLOYMENTS} -gt ${MAX_DEPLOYMENTS_NR} ]; then
echo "Maximum deployments reached on ${SDK_ENVIRONMENT} environment for ${BUILD_REPO_NAME} ; existing deployments: ${EXISTING_DEPLOYMENTS} ; max depl: ${MAX_DEPLOYMENTS_NR} "
echo "Stopping container ${OLDEST_CONTAINER} ..."
RCMD='ssh -o "StrictHostKeyChecking no" -i /tmp/sshkey.pem '
RCMD="${RCMD} ${SSH_USER}@${DEPLOYMENT_SERVER} "
REM='" sudo docker stop '
RCMD="${RCMD} $REM ${OLDEST_CONTAINER}"'"'
echo $RCMD | bash
sleep 12
RCMD='ssh -o "StrictHostKeyChecking no" -i /tmp/sshkey.pem '
RCMD="${RCMD} ${SSH_USER}@${DEPLOYMENT_SERVER} "
REM='" sudo docker rm '
RCMD="${RCMD} $REM ${OLDEST_CONTAINER}"'"'
echo $RCMD | bash
else
echo "Deploying service ..."
deploy_service
fi
17 changes: 17 additions & 0 deletions docker-compose.yml.template
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
version: '3.7'
services:
ServiceName:
restart: unless-stopped
image: ImageName
container_name: ContainerName
pull_policy: always
networks:
- caddy
labels:
caddy_0: UrlName
caddy_0.reverse_proxy: "{{upstreams PortNum}}"
caddy_0.tls.ca: https://acme-staging-v02.api.letsencrypt.org/directory

networks:
caddy:
external: true
35 changes: 35 additions & 0 deletions push-image-to-nexus.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#!/bin/bash
export BRANCH_NAME=`echo "${TRAVIS_BRANCH}" | tr '[:upper:]' '[:lower:]'`
case "${BRANCH_NAME}" in
dev*) echo "Branch ${TRAVIS_BRANCH} is eligible for CI/CD" ;;
ao-dev*)echo "Branch ${TRAVIS_BRANCH} is eligible for CI/CD" ;;
qa*) echo "Branch ${TRAVIS_BRANCH} is eligible for CI/CD" ;;
qe*) echo "Branch ${TRAVIS_BRANCH} is eligible for CI/CD" ;;
rc*) echo "Branch ${TRAVIS_BRANCH} is eligible for CI/CD" ;;
release-master*) echo "Branch ${TRAVIS_BRANCH} is eligible for CI/CD" ;;
ft*) echo "Branch ${TRAVIS_BRANCH} is eligible for CI" ;;
bf*) echo "Branch ${TRAVIS_BRANCH} is eligible for CI" ;;
*) echo "Not a valid branch name for CI/CD" && exit -1;;
esac

echo $TRAVIS_BRANCH
echo ${DEPLOYMENT_SERVER}
export SHORT_COMMIT=`git rev-parse --short=7 ${TRAVIS_COMMIT}`
echo "short commit $SHORT_COMMIT"
sudo apt-get update
sudo apt-get install -y jq
IMAGE_NAME=`echo "${BUILD_REPO_NAME}_${TRAVIS_BRANCH}" | tr '[:upper:]' '[:lower:]'`
PACKAGE_NAME=`jq '.name' version.json | tr -d '"'`
PACKAGE_VERSION=`jq '.version' version.json | tr -d '"'`
echo "Package name : ${PACKAGE_NAME}"
jq --arg froalaeditor "./${PACKAGE_NAME}-${PACKAGE_VERSION}.tgz" '.dependencies["froala-wysiwyg-editor"] |= $froalaeditor' bower.json > new.file && cat new.file > bower.json && rm -f new.file
echo "verify package"
cat bower.json
docker build -t ${IMAGE_NAME}:${SHORT_COMMIT} --build-arg PackageName=${PACKAGE_NAME} --build-arg PackageVersion=${PACKAGE_VERSION} --build-arg NexusUser=${NEXUS_USER} --build-arg NexusPassword=${NEXUS_USER_PWD} .
sleep 3
docker image ls
echo "uploading to nexus ${PACKAGE_NAME}, if not a new PR"
if [ ${TRAVIS_PULL_REQUEST} != "false" ]; then echo "Not publishing a pull request !!!" && exit 0; fi
docker login -u ${NEXUS_USER} -p ${NEXUS_USER_PWD} ${NEXUS_CR_TOOLS_URL}
docker tag ${IMAGE_NAME}:${SHORT_COMMIT} ${NEXUS_CR_TOOLS_URL}/froala-${IMAGE_NAME}:${PACKAGE_VERSION}
docker push ${NEXUS_CR_TOOLS_URL}/froala-${IMAGE_NAME}:${PACKAGE_VERSION}
10 changes: 10 additions & 0 deletions version.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"comment": " Please update this file for any new branch with core libary name - package name and version uploaded to nexus",
"name": "froala-editor-QA241122",
"version": "4.0.16",
"comment-2": "Please specify the maximum allowed deployments per environment",
"dev": "1",
"qa": "2",
"qe": "2",
"stg": "1"
}

0 comments on commit 9e5fc80

Please sign in to comment.