idea创建springcloud项目
https://blog.csdn.net/nov4th/article/details/105913070
本地部署微服务
pom.xml导入插件
<build>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</build>
安装docker
yum install -y yum-utils device-mapper-persistent-data lvm2
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce-18.06.1.ce
mkdir /etc/docker
vim /etc/docker/daemon.json
{
"storage-driver": "overlay2",
"registry-mirrors": ["https://q2gr04ke.mirror.aliyuncs.com"]
}
docker镜像
docker pull openjdk:8-jdk-alpine
Dockerfile
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 10086
ENTRYPOINT ["java","-jar","/app.jar"]
构建镜像
docker build --build-arg JAR_FILE=tensquare_eureka_server-1.0-SNAPSHOT.jar -t eureka:v1 .
Harbor安装
https://github.com/goharbor/harbor/releases
安装docker-compose
yum install docker-compose -y
安装harbor
tar xf harbor-offline-installer-v1.9.2.tgz -C /opt/
cd /opt/harbor
vim harbor.yml
hostname: 192.168.66.102
...
port: 85
...
data_volume: /data/harbor
location: /data/harbor/logs
mkdir -p /data/harbor/logs
./prepare
./install.sh
启动harbor
docker-compose up -d
docker-compose stop 停止
docker-compose restart 重新启动
访问harbor
http://192.168.66.102:85/
admin
Harbor12345
harbor创建项目
harbor创建用户
Xdz@123456
给私有项目分配用户
以新用户登录Harbor
把镜像上传到Harbor
docker tag openjdk:8-jdk-alpine 192.168.66.102:85/tensquare/openjdk:8-jdk-alpine
vim /etc/docker/daemon.json
{
"storage-driver": "overlay2",
"registry-mirrors": ["https://q2gr04ke.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.66.102:85"]
}
登录harbor
docker login -u zhangsan -p Xdz@123456 192.168.66.102:85
docker push镜像到harbor
docker push 192.168.66.102:85/tensquare/openjdk:8-jdk-alpine
项目代码上传到Gitlab
idea上传代码到gitlab
tensquare_front
git remote add tensquare_front http://192.168.66.100:82/wuxing_group/tensquare_front.git
git push -u tensquare_front master
从Gitlab拉取项目源码
Jenkinsfile
//git凭证ID
def git_auth = "7fd05954-bb3c-416e-8cad-9eafd681ec35"
//git的url地址
def git_url = "git@192.168.66.100:wuxing_group/tensquare_back.git"
node {
stage('pull code') {
checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
}
}
提交到SonarQube代码审查
sonar-project.properties
# must be unique in a given SonarQube instance
sonar.projectKey=tensquare_eureka_server
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=tensquare_eureka_server
sonar.projectVersion=1.0
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# This property is optional if sonar.modules is set.
sonar.sources=.
sonar.exclusions=**/test/**,**/target/**
sonar.java.binaries=.
sonar.java.source=1.8
sonar.java.target=1.8
#sonar.java.libraries=**/target/classes/**
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8
Jenkinsfile
//git凭证ID
def git_auth = "7fd05954-bb3c-416e-8cad-9eafd681ec35"
//git的url地址
def git_url = "git@192.168.66.100:wuxing_group/tensquare_back.git"
node {
stage('拉取代码') {
checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
}
stage('代码审查') {
//定义当前Jenkins的sonarqubeScanner工具
def scannerHome = tool 'sonar-scanner'
//引用当前Jenkins sonarqube环境
withSonarQubeEnv('sonarqube') {
sh """
cd ${project_name}
${scannerHome}/bin/sonar-scanner
"""
}
}
}
使用Dockerfile编译、生成镜像
上传tensquare_parent目录
cd /root/repo/com/tensquare/tensquare_parent/1.0-SNAPSHOT
vim tensquare_parent-1.0-SNAPSHOT.pom
...
<dependencyManagement>
<dependencies>
<!-- springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version> <!-- 修改这个 -->
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
...
利用dockerfile-maven-plugin插件构建Docker镜像
在每个微服务项目的pom.xml加入dockerfile-maven-plugin插件
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<repository>${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
eureka
Dockerfile
#FROM java:8
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 10086
ENTRYPOINT ["java","-jar","/app.jar"]
zuul
Dockerfile
#FROM java:8
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 10020
ENTRYPOINT ["java","-jar","/app.jar"]
admin
Dockerfile
#FROM java:8
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 9001
ENTRYPOINT ["java","-jar","/app.jar"]
gathering
Dockerfile
#FROM java:8
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 9002
ENTRYPOINT ["java","-jar","/app.jar"]
参数
tensquare_eureka_server
tensquare_zuul
tensquare_admin_service
tensquare_gathering
注册中心
服务网关
认证中心
活动微服务
Jenkinsfile
//git凭证ID
def git_auth = "7fd05954-bb3c-416e-8cad-9eafd681ec35"
//git的url地址
def git_url = "git@192.168.66.100:wuxing_group/tensquare_back.git"
node {
stage('拉取代码') {
checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
}
stage('代码审查') {
//定义当前Jenkins的sonarqubeScanner工具
def scannerHome = tool 'sonar-scanner'
//引用当前Jenkins sonarqube环境
withSonarQubeEnv('sonarqube') {
sh """
cd ${project_name}
${scannerHome}/bin/sonar-scanner
"""
}
}
stage('编译,安装公共子工程') {
sh "mvn -f tensquare_common clean install"
}
stage('编译,打包微服务工程') {
sh "mvn -f ${project_name} clean package dockerfile:build"
}
}
上传到Harbor镜像仓库
jenkins添加登录harbor的凭据
凭据id记录下
71bf3570-2173-4e6f-ad42-ead0b9bf8c99
流水线语法
Jenkinsfile
//git凭证ID
def git_auth = "7fd05954-bb3c-416e-8cad-9eafd681ec35"
//git的url地址
def git_url = "git@192.168.66.100:wuxing_group/tensquare_back.git"
//镜像的版本号
def tag = "latest"
//Harbor的url地址
def harbor_url = "192.168.66.102:85"
//镜像库项目名称
def harbor_project = "tensquare"
//harbor登录凭证ID
def harbor_auth = "71bf3570-2173-4e6f-ad42-ead0b9bf8c99"
node {
stage('拉取代码') {
checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
}
stage('代码审查') {
//定义当前Jenkins的sonarqubeScanner工具
def scannerHome = tool 'sonar-scanner'
//引用当前Jenkins sonarqube环境
withSonarQubeEnv('sonarqube') {
sh """
cd ${project_name}
${scannerHome}/bin/sonar-scanner
"""
}
}
stage('编译,安装公共子工程') {
sh "mvn -f tensquare_common clean install"
}
stage('编译,打包微服务工程,上传镜像') {
sh "mvn -f ${project_name} clean package dockerfile:build"
//定义镜像名称
def imageName = "${project_name}:${tag}"
//镜像打标签
sh "docker tag ${imageName} ${harbor_url}/${harbor_project}/${imageName}"
//镜像推送到harbor
withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
//登录harbor
sh "docker login -u ${username} -p ${password} ${harbor_url}"
//镜像上传到harbor
sh "docker push ${harbor_url}/${harbor_project}/${imageName}"
sh "echo 镜像上传成功"
}
}
}
拉取镜像和发布应用
安装 Publish Over SSH 插件
jenkins服务器的ssh公钥推送到103(部署服务器)
jenkins配置ssh的server
添加port参数
流水线生成脚本
Jenkinsfile
//git凭证ID
def git_auth = "7fd05954-bb3c-416e-8cad-9eafd681ec35"
//git的url地址
def git_url = "git@192.168.66.100:wuxing_group/tensquare_back.git"
//镜像的版本号
def tag = "latest"
//Harbor的url地址
def harbor_url = "192.168.66.102:85"
//镜像库项目名称
def harbor_project = "tensquare"
//harbor登录凭证ID
def harbor_auth = "71bf3570-2173-4e6f-ad42-ead0b9bf8c99"
node {
stage('拉取代码') {
checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
}
stage('代码审查') {
//定义当前Jenkins的sonarqubeScanner工具
def scannerHome = tool 'sonar-scanner'
//引用当前Jenkins sonarqube环境
withSonarQubeEnv('sonarqube') {
sh """
cd ${project_name}
${scannerHome}/bin/sonar-scanner
"""
}
}
stage('编译,安装公共子工程') {
sh "mvn -f tensquare_common clean install"
}
stage('编译,打包微服务工程,上传镜像') {
sh "mvn -f ${project_name} clean package dockerfile:build"
//定义镜像名称
def imageName = "${project_name}:${tag}"
//镜像打标签
sh "docker tag ${imageName} ${harbor_url}/${harbor_project}/${imageName}"
//镜像推送到harbor
withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
//登录harbor
sh "docker login -u ${username} -p ${password} ${harbor_url}"
//镜像上传到harbor
sh "docker push ${harbor_url}/${harbor_project}/${imageName}"
sh "echo 镜像上传成功"
}
//部署应用
sshPublisher(publishers: [sshPublisherDesc(configName: 'master_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/opt/jenkins_shell/deploy.sh $harbor_url $harbor_project $project_name $tag $port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
部署服务器
vim /opt/jenkins_shell/deploy.sh
#! /bin/sh
#接收外部参数
harbor_url=$1
harbor_project_name=$2
project_name=$3
tag=$4
port=$5
imageName=$harbor_url/$harbor_project_name/$project_name:$tag
echo "$imageName"
#查询容器是否存在,存在则删除
containerId=`docker ps -a | grep -w ${project_name}:${tag} | awk '{print $1}'`
if [ "$containerId" != "" ] ; then
#停掉容器
docker stop $containerId
#删除容器
docker rm $containerId
echo "成功删除容器"
fi
#查询镜像是否存在,存在则删除
imageId=`docker images | grep -w $project_name | awk '{print $3}'`
if [ "$imageId" != "" ] ; then
#删除镜像
docker rmi -f $imageId
echo "成功删除镜像"
fi
# 登录Harbor
docker login -u zhangsan -p Xdz@123456 $harbor_url
# 下载镜像
docker pull $imageName
# 启动容器
docker run -di -p $port:$port $imageName
echo "容器启动成功"
导入数据,测试微服务
tensquare_user.sql
tensquare_gathering.sql
创建数据库用户及授权
grant all on *.* to 'root'@'%' identified by 'Root@123';
测试登录MySQL
mysql -h 192.168.66.101 -uroot -pRoot@123
部署前端静态web网站
部署服务器安装nginx
修改nginx的端口,默认80,改为9090
安装NodeJS插件
Jenkins配置Nginx服务器
设置参数
创建前端流水线项目
//gitlab的凭证
def git_auth = "5a925d65-f666-45ee-84d9-664a5e6eca16"
node {
stage('拉取代码') {
checkout([$class: 'GitSCM', branches: [[name: '*/${branch}']],doGenerateSubmoduleConfigurations:false,extensions:[],submoduleCfg:[],userRemoteConfigs:[[credentialsId:"${git_auth}",url: 'git@192.168.66.100:wuxing_group/tensquare_front.git']]])
}
stage('打包,部署网站') {
//使用NodeJS的npm进行打包
nodejs('nodejs12'){
sh '''
npm install
npm run build
'''
}
//=====以下为远程调用进行项目部署========
sshPublisher(publishers: [sshPublisherDesc(configName: 'master_server',transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '',execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes:false, patternSeparator: '[, ]+', remoteDirectory: '/usr/share/nginx/html',remoteDirectorySDF: false, removePrefix: 'dist', sourceFiles: 'dist/**')],usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}