From c09cbe771d35ab24c813ce85380c29586c2aeafa Mon Sep 17 00:00:00 2001
From: 据说甜蜜呢 <lijun@geekbuy.com.cn>
Date: Tue, 8 Jan 2019 17:20:02 +0800
Subject: [PATCH] 添加脚本文件

---
 devops/PipeLines/Creation/001 CI.sh                               | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 devops/PipeLines/Creation/002 CreateConfig.sh                     | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 devops/PipeLines/Creation/003 ReleaseMajor.sh                     | 41 +++++++++++++++++++++++++++++++++++++++++
 devops/PipeLines/Creation/Gateways/Kong/004 CreateGatewayRoute.sh | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 260 insertions(+)
 create mode 100644 devops/PipeLines/Creation/001 CI.sh
 create mode 100644 devops/PipeLines/Creation/002 CreateConfig.sh
 create mode 100644 devops/PipeLines/Creation/003 ReleaseMajor.sh
 create mode 100644 devops/PipeLines/Creation/Gateways/Kong/004 CreateGatewayRoute.sh

diff --git a/devops/PipeLines/Creation/001 CI.sh b/devops/PipeLines/Creation/001 CI.sh
new file mode 100644
index 0000000..1b7795a
--- /dev/null
+++ b/devops/PipeLines/Creation/001 CI.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+
+set -e
+
+# Import external functions
+chmod +x ./devops/PipeLines/functions.sh
+./devops/PipeLines/functions.sh
+
+GetAppName appName
+echo "Continuous integration for ${appName} starting..."
+
+declare solutionName=($(grep -oP '(?<=SolutionName>)[^<]+' "devops/app.props"))
+dotnet build ${solutionName}	 
+
+echo "Please check the version of each microservice carefully !!!"
+declare major=($(grep -oP '(?<=VersionMajor>)[^<]+' "build/version.props"))
+declare minor=($(grep -oP '(?<=VersionMinor>)[^<]+' "build/version.props"))
+declare patch=($(grep -oP '(?<=VersionPatch>)[^<]+' "build/version.props"))
+declare version=${major}.${minor}.${patch}
+
+declare registryUserName=($(grep -oP '(?<=ImageUserName>)[^<]+' "build/deploy.props"))
+
+declare publishOutputDir=./publish
+
+rm -fr ${publishOutputDir}
+mkdir -p ${publishOutputDir}
+
+function CI()
+{
+	declare publishable=$1
+	declare imagename=$2
+
+	echo ""
+	declare imagefullname=${RegistryHost}/${registryUserName}/${imagename}:${version}
+	declare publishFile=$3
+
+	echo "begin delivery of master branch for ${imagename}..."
+	mkdir -p ${publishOutputDir}/${imagename}
+	dotnet publish ${publishFile} -o ../../publish/${imagename} -c release --no-restore  
+	docker build -t ${imagefullname} ${publishOutputDir}/${imagename}
+	docker push ${imagefullname}
+	rm -fr ${publishOutputDir}/${imagename}
+	echo "delivery of master branch for ${imagename}:${version} has been successful."
+}
+
+declare services=$(ls -l src/services | awk 'NR>1')
+declare servicePrefix=""
+declare serviceName=""
+for service in ${services}
+do
+	servicePrefix=($(echo ${service} | awk '{print $9}')) 
+	isPublishable=($(grep -oP "(?<=${servicePrefix}Publishable>)[^<]+" "/tmp/cicd.props"))
+	GetServiceName "${servicePrefix}" serviceName
+	CI "${servicePrefix}" "./src/${servicePrefix}/${serviceName}.csproj"
+done
+
+echo ""
+echo "Continuous integration for ${appName} has been successful."
\ No newline at end of file
diff --git a/devops/PipeLines/Creation/002 CreateConfig.sh b/devops/PipeLines/Creation/002 CreateConfig.sh
new file mode 100644
index 0000000..a73716a
--- /dev/null
+++ b/devops/PipeLines/Creation/002 CreateConfig.sh
@@ -0,0 +1,70 @@
+#!/bin/bash
+set -e
+IFS=$'\n\n'
+
+declare appName=($(grep -oP '(?<=AppName>)[^<]+' "devops/app.props"))
+
+echo "Begin creating ${appName}'s settings to the configmap of k8s..."
+
+function Create()
+{
+	declare createUrl="$3/api/v1/namespaces/$2/configmaps?pretty=true"
+	echo "[environment: $1, namespace: $2]"
+
+	function send()
+	{
+		set +e
+
+		declare deleteUrl="${3}/api/v1/namespaces/${2}/configmaps/$5"
+
+		curl -X DELETE $deleteUrl -k \
+		--connect-timeout $2 --max-time $3 --retry $4 \
+		-H 'Authorization: Bearer '${AccessToken}'' 
+
+		set -e
+
+		declare configInfo=$(cat $1 | jq tostring)
+
+		curl -X POST $createUrl -k \
+		--connect-timeout $2 --max-time $3 --retry $4 \
+		-H 'Content-Type: application/json' \
+		-H 'cache-control: no-cache' \
+		-H 'Authorization: Bearer '${AccessToken}'' \
+		-d '{
+	"kind": "ConfigMap",
+	"apiVersion": "v1",
+	"metadata": {
+	"name": "'$5'",
+	"namespace": "'${namespace}'"
+	},
+	"data": {
+	"'$6'":'"$configInfo"'
+	}
+}'
+	}
+
+	declare maxTime=30 
+	declare maxConnectTime=20
+	declare retryCount=5
+	
+	send "$4/appsettings.json" $maxConnectTime $maxTime $retryCount "$5.appsettings.json" "appsettings.json"
+	send "$4/appsettings.$1.json" $maxConnectTime $maxTime $retryCount "$(echo $5.appsettings.$1.json | tr 'A-Z' 'a-z')" "appsettings.$1.json"
+}
+
+declare major=($(grep -oP '(?<=VersionMajor>)[^<]+' "devops/version.props"))
+declare namespace=($(grep -oP '(?<=Namespace>)[^<]+' "devops/app.props"))
+declare namespaceOfK8s=$(echo "${namespace}-v${major}" | tr 'A-Z' 'a-z')
+declare k8sApiServer=($(grep -oP '(?<=K8sApiServer>)[^<]+' "devops/deploy.props"))
+
+kubectl create namespace ${namespaceOfK8s}
+
+declare services=$(ls -l src/services | awk 'NR>1')
+declare servicePrefix=""
+for service in ${services}
+do
+  servicePrefix=($(echo ${service} | awk '{print $9}')) 
+  Create ${Environment} ${namespaceOfK8s} ${k8sApiServer} "./src/${servicePrefix}.API" "${servicePrefix}" 
+done
+
+echo ""
+echo "End creating app settings to the configmap of k8s..."
\ No newline at end of file
diff --git a/devops/PipeLines/Creation/003 ReleaseMajor.sh b/devops/PipeLines/Creation/003 ReleaseMajor.sh
new file mode 100644
index 0000000..af56fe1
--- /dev/null
+++ b/devops/PipeLines/Creation/003 ReleaseMajor.sh
@@ -0,0 +1,41 @@
+#!/bin/bash
+set -e
+IFS=$'\n\n'
+
+declare appName=($(grep -oP '(?<=AppName>)[^<]+' "devops/app.props"))
+
+echo "Release for ${appName} starting, dynamicly creating k8s environment..."
+
+declare major=($(grep -oP '(?<=Major>)[^<]+' "devops/version.props"))
+declare minor=($(grep -oP '(?<=Minor>)[^<]+' "devops/version.props"))
+declare patch=($(grep -oP '(?<=Patch>)[^<]+' "devops/version.props"))
+declare namespace=($(grep -oP '(?<=Namespace>)[^<]+' "devops/app.props"))
+
+declare version=${major}.${minor}.${patch}
+declare namespaceOfK8s=$(echo "${namespace}-v${major}" | tr 'A-Z' 'a-z')
+declare releaseName="${appName}-v${major}"
+
+echo ""
+echo "Please check the image version of each microservice carefully !!!"
+echo "kubernetes's namespace: ${namespaceOfK8s}"
+declare services=$(ls -l src/services | awk 'NR>1')
+declare servicePrefix=""
+for service in ${services}
+do
+  servicePrefix=($(echo ${service} | awk '{print $9}')) 
+  echo "${servicePrefix}: ${version}"
+done
+
+echo ""
+declare replicas=($(grep -oP '(?<=Replicas>)[^<]+' "devops/app.props"))
+
+helm install /root/AutoDevOpsPipeLinesCharts \
+--name=${releaseName} \
+--set environment.upper=${Environment} \
+--set environment.lower=$(echo ${Environment} | tr 'A-Z' 'a-z') \
+--set namespace=${namespaceOfK8s}  \
+--set image.version=${version} \
+--set replicas=${replicas}
+
+echo ""
+echo "Dynamicly creating k8s environment Successfully !!!"
\ No newline at end of file
diff --git a/devops/PipeLines/Creation/Gateways/Kong/004 CreateGatewayRoute.sh b/devops/PipeLines/Creation/Gateways/Kong/004 CreateGatewayRoute.sh
new file mode 100644
index 0000000..e12a7cf
--- /dev/null
+++ b/devops/PipeLines/Creation/Gateways/Kong/004 CreateGatewayRoute.sh
@@ -0,0 +1,91 @@
+#!/bin/bash
+set -e
+IFS=$'\n\n'
+
+declare appName=($(grep -oP '(?<=AppName>)[^<]+' "devops/app.props"))
+
+echo "Start building the gateway for ${appName} route dynamically..."
+
+declare namespace=($(grep -oP '(?<=Namespace>)[^<]+' "devops/app.props"))
+declare namespaceOfK8s=$(echo "${appName}-v${major}" | tr 'A-Z' 'a-z')
+declare fdnOfK8s="${namespaceOfK8s}.svc.cluster.local"
+declare kongServiceUrl=($(grep -oP '(?<=Namespace>)[^<]+' "devops/app.props"))
+declare major=($(grep -oP '(?<=Major>)[^<]+' "devops/version.props"))
+declare releaseVersion="v${major}"
+
+# resilience handle
+# Maximum time in seconds that you allow the whole operation to take.
+declare maxTime=5 
+# Maximum time in seconds that you allow the connection to the server to take.
+declare maxConnectTime=2
+declare retryCount=5
+
+## add services
+function createService()
+{
+	curl -X POST $1 \
+	--connect-timeout $2 \
+	--max-time $3 \
+	--retry $4 \
+	-H  "accept: application/json" \
+	-H  "Content-Type: application/json" \
+	-d "{ \"name\": \"$5\",  \"url\": \"$6\"}";
+}
+
+## add routes
+function createRoute()
+{
+    declare svcResponse=$(curl -X GET ${kongServiceBaseUrl}/$5 --connect-timeout $2 --max-time $3 --retry $4)
+    declare JQ_EXEC=`which jq`
+    declare svcId=$(echo $svcResponse | ${JQ_EXEC} .id | sed 's/\"//g')
+	declare defMethods="[\"GET\",\"POST\"]"
+
+	set +e
+	if [ -n "$8" ]; then
+	   defMethods=$8
+	fi
+
+	if [ -z "$svcId" ]; then
+	  echo "Warnning, failed to get the service[$5] identifier, route cannot be created.";
+    else
+	  # idempotent
+	  declare routesAdded=$(curl -X GET ${kongServiceBaseUrl}/$5/routes)
+	  declare routeid=$(echo $routesAdded | ${JQ_EXEC} .data[0].id | sed 's/\"//g')
+	  if [ "$routeid" == "null" ]; then
+        curl -X POST $1 \
+	    --connect-timeout $2 \
+	    --max-time $3 \
+	    --retry $4 \
+	    -H  "accept: application/json" \
+	    -H  "Content-Type: application/json" \
+	    -d "{ \"service\": "{\"id\":\"$svcId\"}",\"paths\": "[\"$6\"]",\"methods\": "$defMethods",\"strip_path\":$7,\"hosts\": "[\"$kongRouteDomain\"]"}";
+      fi
+	fi
+	set -e
+}
+
+declare services=$(ls -l src/services | awk 'NR>1')
+declare servicePrefix=""
+declare serviceName=""
+declare serviceNameWithVersion=""
+declare serviceFullName=""
+declare serviceUrl=""
+declare serviceRouteUrl=""
+for service in ${services}
+do
+  servicePrefix=($(echo ${service} | awk '{print $9}')) 
+  serviceName="${servicePrefix}-api"
+  serviceNameWithVersion="${serviceName}-${releaseVersion}"
+  serviceFullName="${serviceName}.${fdnOfK8s}"
+  serviceUrl="http://${serviceFullName}/api/${servicePrefix}"
+
+  echo "Begin creating service[${serviceNameWithVersion}]"
+  createService ${kongServiceUrl} ${maxConnectTime} ${maxTime} ${retryCount} ${serviceNameWithVersion} ${serviceUrl}
+
+  echo "Begin creating route of service[${serviceNameWithVersion}]" 
+  serviceRouteUrl="/api/${releaseVersion}/${servicePrefix}"
+  createRoute ${kongServiceUrl} ${maxConnectTime} ${maxTime} ${retryCount} ${serviceNameWithVersion} ${serviceRouteUrl} true
+done
+
+echo ""
+echo "Dynamicly building gateway route successfully !!!"
\ No newline at end of file
--
libgit2 0.26.0