#!/bin/bash exec > >(tee -a script.log) 2>&1 # Install the required packages # # -------------------------------------------------------------- apk upgrade && apk add curl wget zip unzip curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x ./kubectl && mv ./kubectl /usr/local/bin/kubectl . ./setenv.sh # ---------------------------------------------------------------------- export NEW_URL=https://$URL_DOMAIN export CLUSTER=caresage-eks-cluster-$ENV if [[ "$ENV" = "prod" ]] ; then export APP=`echo $URL_DOMAIN | awk -F[.-] '{print $2}'` else export APP=`echo $URL_DOMAIN | awk -F[.-] '{print $3}'` fi export NAMESPACE=$APP-web export REPO=$BITBUCKET_REPO_SLUG export REPLACE=`echo $NEW_URL | awk -F[./] '{print $4"."$5}'` export MAIN_DOMAIN=`echo $NEW_URL | awk -F[./] '{print $4"."$5}'` export URL_DOMAIN=$URL_DOMAIN # --------------------------- echo "export NEW_URL=https://$URL_DOMAIN" >> setenv.sh if [[ "$ENV" = "prod" ]] ; then echo "export APP=`echo $URL_DOMAIN | awk -F[.-] '{print $2}'`" >> setenv.sh else echo "export APP=`echo $URL_DOMAIN | awk -F[.-] '{print $3}'`" >> setenv.sh fi echo "export NAMESPACE=$APP-web" >> setenv.sh echo "export REPO=$BITBUCKET_REPO_SLUG" >> setenv.sh echo "export REPLACE=`echo $NEW_URL | awk -F[./] '{print $4"."$5}'`" >> setenv.sh echo "export MAIN_DOMAIN=`echo $NEW_URL | awk -F[./] '{print $4"."$5}'`" >> setenv.sh echo "export URL_DOMAIN=$URL_DOMAIN" >> setenv.sh echo "export TOKEN=$TOKEN" >> setenv.sh # --------------------------------------------------------------- echo "JOBNAME -- $JOBNAME" echo "ENV -- $ENV" echo "CLUSTER -- $CLUSTER" echo "VERSION -- $BITBUCKET_BUILD_NUMBER" echo "RESTORE_VERSION -- $RESTORE_VERSION" echo "URL_DOMAIN -- $URL_DOMAIN" echo "SUBDOMAIN -- $SUBDOMAIN" echo "VERSION -- $VERSION" echo "RESTORE_VERSION -- $RESTORE_VERSION" echo "DB_NAME -- $DB_NAME" echo "MYSQL_FILE_NAME -- $MYSQL_FILE_NAME" echo "STATIC_FILE_NAME -- $STATIC_FILE_NAME" # Initial VALIDATION check # # ------------------------------------- cat ./setenv.sh && . ./setenv.sh if [[ "$SUBDOMAIN" != "www" ]] && [[ "$ENV" = "qa" || "$ENV" = "stage" || "$ENV" = "prod" ]] ; then echo VALIDATION-FAIL && exit 9 ; else echo VALIDATION-PASS;fi #validation () { chmod 755 ./validation.sh && ./validation.sh; } && validation # ---------------------------------------------------------------------------------- # Check if it is already running # # ------------------------------------- echo "Deploy the wordpress source code from the branch to pvc mount of subdomain..." aws eks update-kubeconfig --name caresage-eks-cluster-$ENV --region us-east-1 echo "common-job-pod will be deleted if already there and thus make sure you run single common job for a given repo" echo "" kubectl get po -A | grep common-job-pod | grep $NAMESPACE && kubectl delete po common-job-pod -n $NAMESPACE || echo ----common-job-pod-t0-be-created # ---------------------------------------------------------------------------------- opt=$1 deploy_version=$2 case $opt in wp-auto-patch) # The auto patch to be executed for dev01 to be specific # ---------------------------------------------------------- if [[ "$SUBDOMAIN" != "dev01" ]] ; then echo VALIDATION-NOPASS-AUTO-PATCH-IS-FOR-DEV01 && exit 9 ; else echo VALIDATION-PASS-AUTO-PATCH-IS-FOR-DEV01;fi aws eks update-kubeconfig --name caresage-eks-cluster-$ENV --region us-east-1 kubectl apply -f build/$ENV/pod.tpl && kubectl apply -f build/$ENV/pvc.yml && echo pod-created && sleep 15 kubectl cp setenv.sh $NAMESPACE/common-job-pod:/tmp/setenv.sh kubectl exec common-job-pod -n $NAMESPACE -- sh -c 'chmod 755 /tmp/setenv.sh' kubectl exec common-job-pod -n $NAMESPACE -- apt update kubectl exec common-job-pod -n $NAMESPACE -- apt install wget zip unzip curl git rclone rsync -y # --------------------------------------------------------------------------------------------------------------------------------------------------------- kubectl exec common-job-pod -n $NAMESPACE -- sh -c '. /tmp/setenv.sh; cd /tmp; git clone --branch="develop" https://x-token-auth:$TOKEN@bitbucket.org/connectamerica/$REPO.git; cd $REPO/; git config user.email "{botid}@bots.bitbucket.org" ; git checkout -b feature/$VERSION-$ENV-$SUBDOMAIN && git push --set-upstream origin feature/$VERSION-$ENV-$SUBDOMAIN; rclone sync --exclude wp-content/uploads/** /usr/share/nginx/subdomain/$SUBDOMAIN/ wp -q ; echo "-----sync-done-----" ; git add --all && git commit -m "auto-patch $VERSION-$ENV-$SUBDOMAIN-$(date +%Y-%m-%dT%H_%M_%S)" ; git push && echo ---git-push-done--- ' #-------------------------------------------------------------------------------------------------------------- kubectl delete po common-job-pod -n $NAMESPACE cat script.log | egrep -v "Errors:|SQL|rewrite|Rewrite|warning|Warning|create mode" | egrep -i "not in gzip format|fail|fatal|exception|terminated|command not found|error|unexpected|cannot access|No such file" && exit 9 || echo VALIDATION_PASS_$opt ;; subdomain_deploy) aws eks update-kubeconfig --name caresage-eks-cluster-$ENV --region us-east-1 kubectl apply -f build/$ENV/pod.tpl && kubectl apply -f build/$ENV/pvc.yml && echo pod-created && sleep 15 kubectl cp wp $NAMESPACE/common-job-pod:/tmp && echo "wp copy to /tmp done" || exit 9 kubectl cp setenv.sh $NAMESPACE/common-job-pod:/tmp/setenv.sh && echo "setenv copy done" || exit 9 kubectl exec common-job-pod -n $NAMESPACE -- sh -c 'chmod 755 /tmp/setenv.sh' # -------------------------------------------------------------------------------------------- kubectl exec common-job-pod -n $NAMESPACE -- apt update kubectl exec common-job-pod -n $NAMESPACE -- apt install rclone rsync -y kubectl exec common-job-pod -n $NAMESPACE -- sh -c '. /tmp/setenv.sh; cd /tmp && rclone sync --exclude wp-content/uploads/** wp/ /usr/share/nginx/subdomain/$SUBDOMAIN -q && echo ---sync-done--- ' kubectl delete po common-job-pod -n $NAMESPACE # ------------------------------------------------------------------------------------------------------------------------- cat script.log | egrep -v "Errors:|SQL|rewrite|Rewrite|warning|Warning|create mode" | egrep -i "not in gzip format|fail|fatal|exception|terminated|command not found|error|unexpected|cannot access|No such file" && exit 9 || echo VALIDATION_PASS_$opt ;; mysql-backup) echo "Running mysql backup with s3..." aws eks update-kubeconfig --name caresage-eks-cluster-$ENV --region us-east-1 kubectl apply -f build/$ENV/pod.tpl && kubectl apply -f build/$ENV/pvc.yml && echo pod-created && sleep 15 kubectl cp setenv.sh $NAMESPACE/common-job-pod:/tmp/setenv.sh kubectl exec common-job-pod -n $NAMESPACE -- sh -c 'chmod 755 /tmp/setenv.sh' kubectl exec common-job-pod -n $NAMESPACE -- apt update kubectl exec common-job-pod -n $NAMESPACE -- apt install zip wget unzip curl mariadb-client -y kubectl exec common-job-pod -n $NAMESPACE -- sh -c '. /tmp/setenv.sh ;mysqldump -h $DB_HOST --single-transaction --quick --lock-tables=false --user=$DB_USER --password=$DB_PASSWORD $SUBDOMAIN --skip-lock-tables | gzip > /tmp/$NAMESPACE-pantheon.sql.gz' kubectl cp $NAMESPACE/common-job-pod:/tmp/$NAMESPACE-pantheon.sql.gz $NAMESPACE-pantheon-$VERSION-$ENV-$SUBDOMAIN-$(date +%Y-%m-%dT%H_%M_%S).sql.gz FILE=`ls $NAMESPACE-pantheon-*.sql.gz` aws s3 cp $FILE s3://commonjobs/$NAMESPACE/$opt/ curl --request POST -F files=@"$FILE" --url "https://api.bitbucket.org/2.0/repositories/connectamerica/$REPO/downloads" \ --header "Authorization: Bearer $TOKEN" kubectl delete po common-job-pod -n $NAMESPACE cat script.log | egrep -v "Errors:|SQL|rewrite|Rewrite|warning|Warning|create mode" | egrep -i "not in gzip format|fail|fatal|exception|terminated|command not found|error|unexpected|cannot access|No such file" && exit 9 || echo VALIDATION_PASS_$opt ;; wp-data-backup) aws eks update-kubeconfig --name caresage-eks-cluster-$ENV --region us-east-1 kubectl apply -f build/$ENV/pod.tpl && kubectl apply -f build/$ENV/pvc.yml && echo pod-created && sleep 15 kubectl cp setenv.sh $NAMESPACE/common-job-pod:/tmp/setenv.sh kubectl exec common-job-pod -n $NAMESPACE -- sh -c 'chmod 755 /tmp/setenv.sh' kubectl exec common-job-pod -n $NAMESPACE -- apt update kubectl exec common-job-pod -n $NAMESPACE -- apt install wget zip unzip curl -y kubectl exec common-job-pod -n $NAMESPACE -- sh -c '. /tmp/setenv.sh;cd /usr/share/nginx/subdomain/$SUBDOMAIN/wp-content/uploads;zip -r /tmp/upload.zip .' kubectl cp $NAMESPACE/common-job-pod:/tmp/upload.zip $NAMESPACE-$VERSION-$ENV-$SUBDOMAIN-$(date +%Y-%m-%dT%H_%M_%S).zip FILE=`ls $NAMESPACE-*.zip` aws s3 cp $FILE s3://commonjobs/$NAMESPACE/$opt/ kubectl delete po common-job-pod -n $NAMESPACE cat script.log | egrep -v "Errors:|SQL|rewrite|Rewrite|warning|Warning|create mode" | egrep -i "not in gzip format|fail|fatal|exception|terminated|command not found|error|unexpected|cannot access|No such file" && exit 9 || echo VALIDATION_PASS_$opt ;; mysql-restore) aws eks update-kubeconfig --name caresage-eks-cluster-$ENV --region us-east-1 kubectl apply -f build/$ENV/pod.tpl && kubectl apply -f build/$ENV/pvc.yml && echo pod-created && sleep 15 kubectl cp setenv.sh $NAMESPACE/common-job-pod:/tmp/setenv.sh kubectl exec common-job-pod -n $NAMESPACE -- sh -c 'chmod 755 /tmp/setenv.sh' [ -n "$RESTORE_VERSION" ] && FILE=$RESTORE_VERSION || FILE=$deploy_version kubectl exec common-job-pod -n $NAMESPACE -- apt update kubectl exec common-job-pod -n $NAMESPACE -- apt install zip wget unzip curl mariadb-client -y #Check if file is present in bitbucket download else check on s3 # ------------------------------------------------------------------- curl -s -L -O -H "Authorization: Bearer $TOKEN" https://api.bitbucket.org/2.0/repositories/connectamerica/$REPO/downloads/$FILE && echo file_downloaded || aws s3 cp s3://commonjobs/$NAMESPACE/mysql-backup/$FILE $FILE # -------------------------------------------------------- kubectl cp $FILE $NAMESPACE/common-job-pod:/tmp/$FILE kubectl cp wp $NAMESPACE/common-job-pod:/tmp && echo "wp copy to /tmp done" || exit 9 kubectl cp setenv.sh $NAMESPACE/common-job-pod:/tmp/setenv.sh && echo "setenv copy done" || exit 9 kubectl exec common-job-pod -n $NAMESPACE -- sh -c 'chmod 755 /tmp/setenv.sh' # ---------------------------------------------------------------------------------------- #Create schema if not present # # ------------------------------- kubectl exec common-job-pod -n $NAMESPACE -- sh -c '. /tmp/setenv.sh; mysql -h $DB_HOST --user=$DB_USER --password=$DB_PASSWORD -e "create schema IF NOT EXISTS $SUBDOMAIN"' kubectl exec common-job-pod -n $NAMESPACE -- sh -c '. /tmp/setenv.sh; export FILE=`ls /tmp/*.sql.gz` ; gunzip -c $FILE | mysql -h $DB_HOST --user=$DB_USER --password=$DB_PASSWORD $SUBDOMAIN' kubectl exec common-job-pod -n $NAMESPACE -- sh -c '. /tmp/setenv.sh; mysql -h $DB_HOST --user=$DB_USER --password=$DB_PASSWORD -e "DROP TABLE IF EXISTS $SUBDOMAIN._pantheon_heartbeat"' kubectl exec common-job-pod -n $NAMESPACE -- sh -c 'wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar ; chmod u+x wp-cli.phar;mv wp-cli.phar /usr/local/bin/wp; php /usr/local/bin/wp --info' # ---------------------------------------------------------------------------------------------------------------------------------------------------- kubectl exec common-job-pod -n $NAMESPACE -- sh -c '. /tmp/setenv.sh; OLD_URL=`wp option get siteurl --allow-root --path=/tmp/wp`; echo "export OLD_URL=$OLD_URL" >> /tmp/setenv.sh; echo "export FIND=$(echo $OLD_URL|cut -d. -f2,3)" >> /tmp/setenv.sh; echo "export OLD_MAIN_DOMAIN=$(echo $OLD_URL|cut -d. -f2,3)" >> /tmp/setenv.sh; echo "export OLD_URL_DOMAIN=$(echo $OLD_URL| cut -d/ -f3)" >> /tmp/setenv.sh; echo "export OLD_SUBDOMAIN=$(echo $OLD_URL| cut -d/ -f3|cut -d. -f1)" >> /tmp/setenv.sh' # ----------------------------------------------------------------------------------------- kubectl cp $NAMESPACE/common-job-pod:/tmp/setenv.sh setenv.sh && . ./setenv.sh # ----------------------------------------------------------------------------------------- if [[ "$OLD_SUBDOMAIN" = "www" ]] && [[ "$SUBDOMAIN" = "www" ]]; then kubectl exec common-job-pod -n $NAMESPACE -- sh -c 'cat /tmp/setenv.sh ; . /tmp/setenv.sh; wp search-replace --allow-root --path=/tmp/wp "$OLD_URL_DOMAIN" "$URL_DOMAIN" --all-tables' [[ "$APP" = "connectamerica" ]] && kubectl exec common-job-pod -n $NAMESPACE -- sh -c 'cat /tmp/setenv.sh ; . /tmp/setenv.sh; wp search-replace --allow-root --path=/tmp/wp ".$OLD_MAIN_DOMAIN" ".$MAIN_DOMAIN" --all-tables' elif [[ "$OLD_SUBDOMAIN" = "www" ]] && [[ "$SUBDOMAIN" != "www" ]]; then kubectl exec common-job-pod -n $NAMESPACE -- sh -c 'cat /tmp/setenv.sh ; . /tmp/setenv.sh; wp search-replace --allow-root --path=/tmp/wp "$OLD_URL_DOMAIN" "$URL_DOMAIN" --all-tables' [[ "$APP" = "connectamerica" ]] && kubectl exec common-job-pod -n $NAMESPACE -- sh -c 'cat /tmp/setenv.sh ; . /tmp/setenv.sh; wp search-replace --allow-root --path=/tmp/wp ".$OLD_MAIN_DOMAIN" ".$URL_DOMAIN" --all-tables' elif [[ "$OLD_SUBDOMAIN" != "www" ]] && [[ "$SUBDOMAIN" = "www" ]]; then kubectl exec common-job-pod -n $NAMESPACE -- sh -c 'cat /tmp/setenv.sh ; . /tmp/setenv.sh; wp search-replace --allow-root --path=/tmp/wp ".$OLD_URL_DOMAIN" ".$MAIN_DOMAIN" --all-tables' kubectl exec common-job-pod -n $NAMESPACE -- sh -c 'cat /tmp/setenv.sh ; . /tmp/setenv.sh; wp search-replace --allow-root --path=/tmp/wp "$OLD_URL_DOMAIN" "$URL_DOMAIN" --all-tables' elif [[ "$OLD_SUBDOMAIN" != "www" ]] && [[ "$SUBDOMAIN" != "www" ]]; then kubectl exec common-job-pod -n $NAMESPACE -- sh -c 'cat /tmp/setenv.sh ; . /tmp/setenv.sh; wp search-replace --allow-root --path=/tmp/wp "$OLD_URL_DOMAIN" "$URL_DOMAIN" --all-tables' else echo "======== fix the issues =============" fi # ---------------------------------------------------------------------------------------------------------------------------------------- kubectl exec common-job-pod -n $NAMESPACE -- sh -c '. /tmp/setenv.sh; wp search-replace --allow-root --path=/tmp/wp "http://$NEW_URL" "https://$NEW_URL" --all-tables' kubectl delete po common-job-pod -n $NAMESPACE cat script.log | egrep -v "Errors:|SQL|rewrite|Rewrite|warning|Warning|create mode" | egrep -i "not in gzip format|fail|fatal|exception|terminated|command not found|error|unexpected|cannot access|No such file" && exit 9 || echo VALIDATION_PASS_$opt ;; wp-data-restore) aws eks update-kubeconfig --name caresage-eks-cluster-$ENV --region us-east-1 kubectl apply -f build/$ENV/pod.tpl && kubectl apply -f build/$ENV/pvc.yml && echo pod-created && sleep 15 kubectl get po common-job-pod -n $NAMESPACE | grep -i pending && exit 9 || echo ----common-pod-NOT-in-pending-state -- kubectl cp setenv.sh $NAMESPACE/common-job-pod:/tmp/setenv.sh kubectl exec common-job-pod -n $NAMESPACE -- sh -c 'chmod 755 /tmp/setenv.sh' [ -n "$RESTORE_VERSION" ] && FILE=$RESTORE_VERSION || FILE=$deploy_version kubectl exec common-job-pod -n $NAMESPACE -- apt update kubectl exec common-job-pod -n $NAMESPACE -- apt install wget zip unzip curl rsync rclone -y aws s3 cp s3://commonjobs/$NAMESPACE/wp-data-backup/$FILE $FILE kubectl cp $FILE $NAMESPACE/common-job-pod:/tmp/$FILE kubectl exec common-job-pod -n $NAMESPACE -- sh -c '. /tmp/setenv.sh; mkdir -p /usr/share/nginx/subdomain/$SUBDOMAIN/wp-content/uploads' # ---------------------------------------------------------------------------------------------------------------------------------------------------- kubectl exec common-job-pod -n $NAMESPACE -- sh -c '. /tmp/setenv.sh; mkdir /tmp/uploads ;export FILE=`ls /tmp/*.zip`;unzip -o $FILE -d /tmp/uploads' kubectl exec common-job-pod -n $NAMESPACE -- sh -c '. /tmp/setenv.sh; rclone sync /tmp/uploads/ /usr/share/nginx/subdomain/$SUBDOMAIN/wp-content/uploads -q && echo ---sync-done--- ' # ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- # --------------------------------------------------------------------------------------------------------------------------------------------------- kubectl exec common-job-pod -n $NAMESPACE -- sh -c '. /tmp/setenv.sh; mkdir /usr/share/nginx/subdomain/$SUBDOMAIN/wp-content/uploads/cache && echo ---CacheCreated---' # ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- kubectl delete po common-job-pod -n $NAMESPACE cat script.log | egrep -v "Errors:|SQL|rewrite|Rewrite|warning|Warning|create mode" | egrep -i "not in gzip format|fail|fatal|exception|terminated|command not found|error|unexpected|cannot access|No such file" && exit 9 || echo VALIDATION_PASS_$opt ;; *) echo "common job shell script utility taking variables from env" echo "Usage: $0 {mysql-backup|wp-data-backup|mysql-restore|wp-data-restore}" echo "mysql-backup : Run MySQL backup utility and upload" echo "mysql-restore : Run MySQL backup utility and upload it to bitbucket." echo "wp-data-backup : Run web server backup utility and uplaod." echo "wp-data-restore : Run web server backup utility and uplaod to bitbucket." ;; esac