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