從購買阿里雲服務器到SpringCloud項目的自動化部署及發佈

暫時列個架子,後續慢慢補充。。。

項目結構

 

1.註冊登陸阿里雲賬號(步驟略)

購買ECS、購買域名

實名認證-創建域名模板-認證備案

 

2.服務器基礎環境搭建(準備三臺ECS、步驟略)

安裝docker、安裝docker-compose、鏡像加速地址設置、修改yum源配置、阿里雲組策略開放端口、內網ip設置

 

3.安裝基本環境(內容太多,後續單獨放一篇文章內)

ELK、nacos集羣、mysql主從、redis、FastDFS集羣、jenkins+nexus、mongo+mongo-express、sentinel、seata、nginx等等

nacos集羣

version: '3' 
services:
  # nacos-server服務註冊與發現,配置中心服務    
  docker-nacos-server:
    image: nacos/nacos-server:1.0.1
    container_name: nacos-server-1
    ports:
      - "8848:8848"
      - "9555:9555"
    networks: 
      - nacos_net
    restart: on-failure
    privileged: true
    environment:
      PREFER_HOST_MODE: ip #如果支持主機名可以使用hostname,否則使用ip,默認也是ip
      SPRING_DATASOURCE_PLATFORM: mysql #數據源平臺 僅支持mysql或不保存empty
      NACOS_SERVER_IP: 10.211.55.17 #多網卡情況下,指定ip或網卡
      NACOS_SERVERS: 10.211.55.17:8848 10.211.55.18:8848 10.211.55.19:8848 #集羣中其它節點[ip1:port ip2:port ip3:port]
      MYSQL_MASTER_SERVICE_HOST: 10.211.55.17 #mysql配置,Master爲主節點,Slave爲從節點
      MYSQL_MASTER_SERVICE_PORT: 3306
      MYSQL_MASTER_SERVICE_DB_NAME: nacos
      MYSQL_MASTER_SERVICE_USER: root
      MYSQL_MASTER_SERVICE_PASSWORD: mysql1234
      MYSQL_SLAVE_SERVICE_HOST: 10.211.55.17
      MYSQL_SLAVE_SERVICE_PORT: 3306
      MYSQL_SLAVE_SERVICE_DB_NAME: nacos
      MYSQL_SLAVE_SERVICE_USER: root
      MYSQL_SLAVE_SERVICE_PASSWORD: mysql1234
      #JVM調優參數
      #JVM_XMS:  #-Xms default :2g
      #JVM_XMX:  #-Xmx default :2g
      #JVM_XMN:  #-Xmn default :1g
      #JVM_MS:   #-XX:MetaspaceSize default :128m
      #JVM_MMS:  #-XX:MaxMetaspaceSize default :320m
      #NACOS_DEBUG: n #是否開啓遠程debug,y/n,默認n
      #TOMCAT_ACCESSLOG_ENABLED: true #是否開始tomcat訪問日誌的記錄,默認false
    volumes:
      - ./cluster-logs/nacos1:/home/nacos/logs #日誌輸出目錄
      - ../init.d/custom.properties:/home/nacos/init.d/custom.properties #../init.d/custom.properties內包含很多自定義配置,可按需配置

networks:
  nacos_net:
    driver: bridge
version: '3' 
services:
  # nacos-server服務註冊與發現,配置中心服務    
  docker-nacos-server:
    image: nacos/nacos-server:1.0.1
    container_name: nacos-server-3
    ports:
      - "8848:8848"
      - "9555:9555"
    networks: 
      - nacos_net
    restart: on-failure
    privileged: true
    environment:
      PREFER_HOST_MODE: ip #如果支持主機名可以使用hostname,否則使用ip,默認也是ip
      SPRING_DATASOURCE_PLATFORM: mysql #數據源平臺 僅支持mysql或不保存empty
      NACOS_SERVER_IP: 10.211.55.18 #多網卡情況下,指定ip或網卡
      NACOS_SERVERS: 10.211.55.17:8848 10.211.55.18:8848 10.211.55.19:8848 #集羣中其它節點[ip1:port ip2:port ip3:port]
      MYSQL_MASTER_SERVICE_HOST: 10.211.55.17 #mysql配置,Master爲主節點,Slave爲從節點
      MYSQL_MASTER_SERVICE_PORT: 3306
      MYSQL_MASTER_SERVICE_DB_NAME: nacos
      MYSQL_MASTER_SERVICE_USER: root
      MYSQL_MASTER_SERVICE_PASSWORD: mysql1234
      MYSQL_SLAVE_SERVICE_HOST: 10.211.55.17
      MYSQL_SLAVE_SERVICE_PORT: 3306
      #JVM調優參數
      #JVM_XMS:  #-Xms default :2g
      #JVM_XMX:  #-Xmx default :2g
      #JVM_XMN:  #-Xmn default :1g
      #JVM_MS:   #-XX:MetaspaceSize default :128m
      #JVM_MMS:  #-XX:MaxMetaspaceSize default :320m
      #NACOS_DEBUG: n #是否開啓遠程debug,y/n,默認n
      #TOMCAT_ACCESSLOG_ENABLED: true #是否開始tomcat訪問日誌的記錄,默認false
    volumes:
      - ./cluster-logs/nacos3:/home/nacos/logs #日誌輸出目錄
      - ../init.d/custom.properties:/home/nacos/init.d/custom.properties #../init.d/custom.properties內包含很多自定義配置,可按需配置

networks:
  nacos_net:
    driver: bridge
version: '3' 
services:
  # nacos-server服務註冊與發現,配置中心服務    
  docker-nacos-server:
    image: nacos/nacos-server:1.0.1
    container_name: nacos-server-3
    ports:
      - "8848:8848"
      - "9555:9555"
    networks: 
      - nacos_net
    restart: on-failure
    privileged: true
    environment:
      PREFER_HOST_MODE: ip #如果支持主機名可以使用hostname,否則使用ip,默認也是ip
      SPRING_DATASOURCE_PLATFORM: mysql #數據源平臺 僅支持mysql或不保存empty
      NACOS_SERVER_IP: 10.211.55.19 #多網卡情況下,指定ip或網卡
      NACOS_SERVERS: 10.211.55.17:8848 10.211.55.18:8848 10.211.55.19:8848 #集羣中其它節點[ip1:port ip2:port ip3:port]
      MYSQL_MASTER_SERVICE_HOST: 10.211.55.17 #mysql配置,Master爲主節點,Slave爲從節點
      MYSQL_MASTER_SERVICE_PORT: 3306
      MYSQL_MASTER_SERVICE_DB_NAME: nacos
      MYSQL_MASTER_SERVICE_USER: root
      MYSQL_MASTER_SERVICE_PASSWORD: mysql1234
      MYSQL_SLAVE_SERVICE_HOST: 10.211.55.17
      MYSQL_SLAVE_SERVICE_PORT: 3306
      #JVM調優參數
      #JVM_XMS:  #-Xms default :2g
      #JVM_XMX:  #-Xmx default :2g
      #JVM_XMN:  #-Xmn default :1g
      #JVM_MS:   #-XX:MetaspaceSize default :128m
      #JVM_MMS:  #-XX:MaxMetaspaceSize default :320m
      #NACOS_DEBUG: n #是否開啓遠程debug,y/n,默認n
      #TOMCAT_ACCESSLOG_ENABLED: true #是否開始tomcat訪問日誌的記錄,默認false
    volumes:
      - ./cluster-logs/nacos3:/home/nacos/logs #日誌輸出目錄
      - ../init.d/custom.properties:/home/nacos/init.d/custom.properties #../init.d/custom.properties內包含很多自定義配置,可按需配置

networks:
  nacos_net:
    driver: bridge
version: '3'
services:
#jenkins setting
  jenkins:
    container_name: dev_jenkins
    image: jenkins/jenkins:lts
    #host port:container port
    ports:
      - "8081:8080"
      - "51000:50000"
    #volumes path|host path:container path
    volumes:
      - /usr/local/jenkins:/var/jenkins_home
    environment:
      TZ: 'Asia/Shanghai'
    restart: always
#nexus setting
  nexus:
    container_name: dev_nexus
    image: sonatype/nexus3
    #host port:container port
    ports:
      - "8080:8080"
      - "50000:50000"
    #volumes path|host path:container path
    volumes:
      - /usr/local/nexus:/nexus-data
    environment:
      TZ: 'Asia/Shanghai'
    restart: always

暫略。。。

 

4.安裝前端環境(或docker安裝,同時編譯打包前端項目到鏡像推送私倉)

node npm vue yarn

wget https://nodejs.org/dist/v10.15.0/node-v10.15.0.tar.gz

tar zxvf node-v10.15.0.tar.gz

node 軟連接

【安裝node npm參考 https://blog.csdn.net/cpongo3/article/details/89157498

npm安裝yarn

yarn設置淘寶鏡像

npm install -g yarn --registry=https://registry.npm.taobao.org

yarn config set registry https://registry.npm.taobao.org -g

 

yarn必要時設置環境變量

export PATH=/usr/local/nodejs/bin/:$PATH(臨時生效,關閉shell失效)

或 vi /etc/profile (對所有用戶永久生效)

加上 export PATH=/usr/local/nodejs/bin/:$PATH

source /etc/profile 立即生效

git clone項目之後需要npm install 

 

啓動vue項目

進入項目根目錄(目錄會有package.json文件,記錄node插件依賴、項目等信息),進行安裝yarn(會在目錄創建node_models目錄,存放npm插件),並運行工程

yarn install

yarn run serve

 

5.開通阿里雲鏡像服務,創建開發、測試、生產鏡像命名空間,yum安裝git,安裝maven,docker build鏡像push私倉,jenkins自動化發佈

鏡像build(進入項目pom目錄,-f參數指定項目下的Dockerfile)
docker image build --no-cache -t registry.cn-zhangjiakou.aliyuncs.com/gx-v1-dev/gx-auth:1.2.0 -f ./gx-auth/src/main/docker/Dockerfile .

指定鏡像打tag
sudo docker tag dd022772a116 registry.cn-zhangjiakou.aliyuncs.com/gx-v1-dev/gx-auth:1.2.0

登陸阿里雲鏡像倉庫【需要輸入密碼】
sudo docker login --username=[個人用戶名] registry.cn-zhangjiakou.aliyuncs.com

鏡像push到阿里雲鏡像倉庫指定命名空間
sudo docker tag [ImageId] registry.cn-zhangjiakou.aliyuncs.com/[個人鏡像地址]:[鏡像版本號]
例如
sudo docker push registry.cn-zhangjiakou.aliyuncs.com/gx-v1-dev/gx-auth:1.2.0

通過構建jenkins的pipeline腳本,實現自動化鏡像打包及部署(需要配置憑證)

pipeline {
    agent any

    environment {
    	//project名稱
    	project_name="gx-cloud"

		//應用名稱,jar包不帶後綴
		app_name="gx-auth-1.0-SNAPSHOT"
		
		// 項目打包後rar包目錄,一般在Srv下或者Shell下,需要根據自己的項目靈活改變,跟項目裏面dockerfile文件下的目錄一樣
		app_war_path = "gx-auth/target/{app_name}.jar"
	
		app_version="1.0"

		//Docker鏡像名稱
		docker_name="gx-auth"
		
		//鏡像版本,不用動
		image_tag="${app_version}.${BUILD_NUMBER}"
		
		//鏡像倉庫命名空間,開發dev,測試test
		docker_space="gx-v1-dev"

		//DockerFile文件路徑
		docker_file_path="gx-auth/src/main/docker/Dockerfile"

		//Git倉庫地址
		git_url = "xxxx"
  
		//鏡像倉庫地址,不用動
		repo_url="【鏡像倉庫地址】/${docker_space}/${docker_name}"
		
    }
	
	parameters {
		string(name: 'branch', defaultValue: '【需要發版的分支名稱】', description: '發佈分支')
    }
      
    stages {
        stage('Git Clone') {
            steps {
                script {
                    echo "checkout from ${branch}"
                    echo "${image_tag}"
                    checkout([$class: 'GitSCM', branches: [[name: "${branch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '【jenkins的憑證id】', url: "$git_url"]]])
					echo "checkout sucess"
                }
            }
        }

        stage('Maven Build') {
            steps {
		        script {
					sh'''
				    export MAVEN_HOME=/usr/local/apache-maven-3.6.2
					/usr/local/apache-maven-3.6.2/bin/mvn clean package install -f ${project_name}/pom.xml -Dmaven.test.skip=true  
					'''
				}
			}
		}
        stage('Docker Build') {
            steps {
		        script {
					docker_result =	sh returnStdout: true ,script: "docker images -q  ${docker_name}";
					echo "********docker_result${docker_result}"
					if (docker_result!='') {
						sh " docker rmi --force \$(docker images -q  ${docker_name})"
					}

					sh "docker image build  --no-cache  -t ${docker_name}:latest -f  ${docker_file_path} . "

					withCredentials([usernamePassword(credentialsId: '【jenkins的憑證id】', passwordVariable: 'DOCKER_PASSWORD', usernameVariable: 'DOCKER_USER')]) {
						sh "docker login -u ${DOCKER_USER} -p ${DOCKER_PASSWORD} 【鏡像倉庫地址】";
					}

					sh "docker tag ${docker_name}:latest 【鏡像倉庫地址】/${docker_space}/${docker_name}:${app_version}.${BUILD_NUMBER}"
					sh "docker push 【鏡像倉庫地址】/${docker_space}/${docker_name}:${app_version}.${BUILD_NUMBER}"


					sh "docker tag ${docker_name}:latest 【鏡像倉庫地址】/${docker_space}/${docker_name}:latest"
					sh "docker push 【鏡像倉庫地址】/${docker_space}/${docker_name}:latest"

					docker_result =	sh returnStdout: true ,script: "docker images -q  ${docker_name}";
					echo "********docker_result${docker_result}"
					if (docker_result!='') {
						sh " docker rmi --force \$(docker images -q  ${docker_name})"
					}
				
				}
			}
		}
		stage('Deploy To K8s') {
            steps {
		        script {
					result = sh returnStdout: true ,script:  "kubectl get deployment --selector=app=${docker_name} --kubeconfig='/root/.kube/dev_config' --namespace=default"
					if(result==''){
					sh'''
					echo "deploy application"
					sed -e "s#{TAG}#${image_tag}#g;s#{APOLLO_META}#${apollo_meta}#g;s#{REPO_URL}#${repo_url}#g;s#{APP_ID}#${app_id}#g;s#{APP_NAME}#${app_name}#g;s#{IMAGE_NAME}#${docker_name}#g" /root/deployment/k8s-deployment.yml > /root/deployment.yml
				    kubectl apply -f /root/deployment.yml --kubeconfig="/root/.kube/dev_config"
					'''
					}else{
					sh "echo 'update application'"
					sh "kubectl patch deployment  ${docker_name} -p '{\"spec\":{\"template\":{\"spec\":{\"containers\":[{\"image\":\"${repo_url}:${image_tag}\",\"name\":\"${docker_name}\"}]}}}}' --kubeconfig='/root/.kube/dev_config' --namespace=default"
					}
				}
			}
		}
		
   	}
    post {
        success {
            sh "echo 'success'"

        }

        failure {
            echo "failure"
        }

        unstable {
            echo "unstable"
        }
    }
}

最後一步需要k8s設置相關及配置中心地址等信息,取消,改爲腳本在應用服務器啓動應用容器(可通過jenkins配置應用服務器,並上傳ssh公鑰實現免密登陸)

6.增加nginx進行轉發,域名解析設置

www.sssgg.fun  首頁 80端口 匹配 門戶網站(door.sssgg.fun)

www.home.sssgg.fun 用戶項目

www.config.sssgg.fun 監控和配置項目

www.admin.sssgg.fun 後臺管理項目

 

開發環境(測試環境dev改爲sit)

www.dev.sssgg.fun  首頁 80端口 匹配 門戶網站

www.dev.home.sssgg.fun 用戶項目

www.dev.config.sssgg.fun 監控和配置項目

www.dev.admin.sssgg.fun 後臺管理項目

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章