@[TOC]k8s 上部署
可以使用 kubesphere,快速搭建 MySQL 环境。
启动 56.10 ,56.100、56.101、56.102
k8s控制台,http://192.168.56.100:30880/ 用户名:project-regular, 密码 Qwer23456
mysql-master-cnf mysql-master的配置
键:my.cnf
值是
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
server_id=1
log-bin=mysql-bin
read-only=0
binlog-do-db=gulimall_ums
binlog-do-db=gulimall_pms
binlog-do-db=gulimall_oms
binlog-do-db=gulimall_sms
binlog-do-db=gulimall_wms
binlog-do-db=gulimall_admin
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
创建mysql有状态服务
名称:mysql-master
别名:mysql主节点
下一步
mysql:5.7
高级设置
环境变量
MYSQL_ROOT_PASSWORD
下一步
添加存储劵、配置文件
挂载配置文件或密钥,需要自己创建。
添加挂载配置文件
/etc/mysql
my.cnf
添加存储劵
/var/lib/mysql
下一步
创建
创建mysql-master服务成功
j进入服务的容器组,就好像进入mysql的容器,如exec进入一样
gulimall项目,配置中心,配置,创建
名称:mysql-slaver-cnf
别名:mysql的slaver的配置
下一步
点击 添加数据
key:my.cnf
值:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
server_id=2
log-bin=mysql-bin
read-only=1
binlog-do-db=gulimall_ums
binlog-do-db=gulimall_pms
binlog-do-db=gulimall_oms
binlog-do-db=gulimall_sms
binlog-do-db=gulimall_wms
binlog-do-db=gulimall_admin
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
gulimall项目,存储劵,创建,
名称:gulimall-mysql-slaver-pvc
别名:mysql-slaver-pvc
下一步
下一步
创建
gulimall项目,应用负载,服务,创建
有状态服务
名称:mysql-slaver
别名:mysql的slaver
下一步
添加容器镜像
mysql:5.7 ,回车
点击 使用默认端口
环境变量
选择环境变量
点击 引用配置文件或密钥
添加存储劵
点击 添加存储劵
选择mysql-slaver-pvc
/var/lib/mysql
点击对号
挂载配置文件或密钥
点击 添加挂载配置
选择mysql-slaver-cnf
/etc/mysql
点击对号
创建
点击mysql-slaver服务,进入 mysql-slaver 服务
自动分配 mysql-slaver.gulimall
为 master 授权用户来他的同步数据
进入mysql-master服务,进入容器组
点击终端,进入终端
连接上mysql-master,密码为123456
mysql -uroot -p123456
执行,命令,为 master 授权用户来他的同步数据
GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by '123456';
查看 master 状态
show master status;
结果:mysql-bin.000003
mysql-bin.000031
exit 退出
配置 slaver 同步 master 数据
进入mysql-slaver服务,点击容器组,进入终端
连接上mysql-slaver,密码为123456
mysql -uroot -p123456;
设置主库连接
change master to master_host='mysql-master.gulimall',master_user='backup',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=0,master_port=3306;
change master to master_host='mysql-master.gulimall',master_user='backup',master_password='123456',master_log_file='mysql-bin.000031',master_log_pos=0,master_port=3306;
其中mysql-master.gulimall,是mysql-master的域名,mysql-bin.000003是mysql-master的位置,3306是mysql-master的端口号
启动从库同步
start slave;
查看从库状态
show slave status\G;
在主库,即mysql-master,创建数据库,看从库,即mysql-slaver是否同步。
进入mysql-master终端,,连接mysql
mysql -uroot -p123456;
msater 创建数据库
CREATE DATABASE gulimall_oms DEFAULT CHARACTER set utf8mb4;
从库 查看是否有数据库,主从复制是否实现
进入mysql-slaver服务,进入容器组,进入终端
连接mysql-slaver
mysql -uroot -p123456;
查看数据库
show databases;
结果:从库有gulimall_oms数据库,说明主从复制成功
k8s部署mysql集群,省略
与上面的操作一样,
创建多对 [ master 、slaver结构,主从复制。。 ]
还可以 ,读写分离,目前不知道怎么做??
自定义进行,此镜像已经主从复制。
拉取镜像
gulimall项目,配置中心,配置,创建
redis-conf
下一步
redis-conf
appendonly yes
点击 创建
gulimall项目,存储卷,创建
gulimall-redis-pvc
下一步
创建
gulimall项目,应用负载,服务,创建
有状态服务
redis
下一步
添加镜像
redis:5.0.7
使用默认端口
高级不用设置,使用默认
选择 启动命令
运行命令: redis-server
参数: /etc/redis/redis.conf
点击对号
下一步
添加配置文件
选择redis的conf
/etc/redis
选择特定的键与路径
redis.conf
点击对号
下一步
创建
redis域名:
redis.gulimall
点击redis服务,容器组,容器,进入控制台
执行命令,进入redis客户端
redis-cli
set aa bb
get aa
创建6个redis,6个redis配置文件、6个redis的PVC,就行啦
es安装 百度云地址 链接:https://pan.baidu.com/s/1wyQCKVoDpiJd-Hyh-g7f4w 提取码:1111
guliamll项目,配置中心,配置,创建
elasticsearch-conf
下一步
添加数据
第一组数据 http.host 0.0.0.0 点击对号
配置单节点
第一组数据 discovery.type single-node 点击对号
环境变量设置
第一组数据 ES_JAVA_OPTS -Xms64m -Xmx512m 点击对号
创建
创建 存储劵
elasticsearch-pvc
下一步
下一步
创建
服务,创建,有状态服务
elasticsearch
下一步
添加容器镜像
elasticsearch:7.4.2
使用默认端口
高级环境
环境变量
选择环境变量,
引用配置文件或密钥
第一组: ES_JAVA_OPTS
第二组: discovery.type
第三组: http.host
添加配置
暂时未配置
添加存储劵pvc
选择elasticsearch-pvc
/usr/share/elasticsearch/data
点击对号
下一步
创建
集群内部进行访问,使用DNS ,为 :
elasticsearch的域名 elasticsearch.gulimall
服务,创建,无状态服务
kibana
下一步
添加容器镜像
kibana:7.4.2
使用默认端口
环境变量
选择环境变量
点击 添加环境变量
ELASTICSEARCH_HOSTS http://elasticsearch.gulimall:9200
其中elasticsearch.gulimall 为elasticsearch的域名
点击对号
下一步
下一步
服务,进入kibana服务
可别看到kibana对外暴露的端口号:31183
rabbitmq-pvc
下一步
创建
服务,创建
有状态服务
rabbitmq-management
下一步
添加容器镜像
rabbitmq:management
使用默认端口
高级设置:最大占用 1G内存
点击ok,下一步
添加存储劵pvc
/var/lib/rabbitmq
点击对号,下一步
创建
点击服务,找到RabbitMQ服务,进入它
暴露服务为: rabbitmq-management.gulimall
存储劵,创建
nacos-pvc nacos存储劵pvc
下一步
创建单节点nacos服务
gulimall项目,应用负载,服务,创建,有状态服务
服务名称:nacos
下一步
添加容器镜像
nacos/nacos-server:1.1.4
使用默认端口
环境变量
选择环境变量
点击 添加配置文件
MODE standalone
点击对号,下一步
添加存储劵
选择nacos-pvc
/home/nacos/data
点击对号,下一步
创建
创建无状态服务
服务,创建,指定工作负载
服务名称:nacos
下一步
点击 nacos,进入服务内部,查看暴露服务端口号 31453
访问成功http://192.168.56.100:31453/nacos
用户名、密码 为nacos
创建服务,指定工作负载。与zipkin、sentinel一样
名称:nacos-service
下一步
进入nacos-service服务,查看域名:
nacos-service.gulimall
服务,创建
无状态服务
服务名称:zipkin
下一步
添加容器镜像
openzipkin/zipkin
点击 使用默认端口
添加环境变量
把zipkin存储给es
STORAGE_TYPE elasticsearch
ES_HOSTS elasticsearch.gulimall:9200
创建
服务,指定工作负载。与nacos、sentinel一样
创建zipkin-service服务 ,
访问类型
端口
下一步,创建
进入zipkin-service ,查看域名
zipkin-service.gulimall
创建无状态服务
服务,创建,创建无状态服务
sentinel
下一步
添加容器镜像
bladex/sentinel-dashboard:1.6.3
使用默认端口
点击对号,下一步,下一步
进入sentinel服务
集群端口8333,对外暴露端口 31508
访问
http://192.168.56.100:31508/
用户名、密码 为sentinel
服务,点击 指定工作负载 。与nacos、zipkin一样
sentinel-service
访问类型
端口
创建
进入sentinel-service服务,查看域名
制作项目镜像、打包上传仓库、Dockerfile、编写Deploy文件、部署到k8s集群、k8s的yaml
编写Service文件、暴露到k8s集群、k8s的yaml、
集群内访问测试、外部访问测试
devops自动部署,使用流水线 拉取项目代码
流水线要求:项目里必须有Jenkinsfile文件
自动的把每一个微服务打包成一个docker镜像,上传到dockerhub
k8s自己从dockerhub拉取镜像,拉取镜像后,启动k8s的服务,即service。service是对pod的封装。
拉取镜像后,启动一个容器,容器用pod封装。
假设都是购物车服务,检索、商品订单服务,
订单服务,按它镜像启动一个容器,把这个容器封装成一个pod,订单服务还可以部署到多台机器上。让他有3个副本,让三台机器每台一个。
所有的pod可以封装为一个service。但pod、service也需要部署。
部署两种方式:
法一:可视化界面 --------> 创建服务
法二:devops自动化部署
devops自动化部署
编写每一个项目怎么部署。
把可视化配置文件,放到项目中。
把代码拉取后,自动的安装配置文件的指定,把代码部署成一个deployment,即一个部署。把这个部署封装成service,对外通过服务。
然后是,编写deploy文件,部署到k8s集群,k8s的yaml
编写service文件,暴露到k8s集群,k8s的yaml
第一步:
第二部:
编写2个文件,用自动化代码,把这块进行部署。
部署好后,
集群内访问测试、外部访问测试
1.为每个项目准备一个DockerFile。
2 .为每个项目生成k8s的部署描述文件
3、Jenkins编写好Jenkinsfile
谷粒商城项目,每个项目创建都是以下操作
把每一微服务的配置文件,进行抽取
为项目创建application-pod.properties文件,把application.properties复制粘贴到application-pod.properties
每个端口号都为8080,打包进行后,容器内为8080,向外暴露端口号不同即可
域名访问
因为nacos是无服务状态。有服务状态不用这样操作。。
怎么获得域名?查看nacos关于域名的设置。创建nacos-service服务,工作负载。使用它的域名。
spring.cloud.nacos.discovery.server-addr=nacos-service.gulimall:8848
redis是有服务状态,直接用域名进行访问
redis.gulimall
spring.redis.host=redis.gulimall
sentinel是无状态服务,不能直接用域名进行访问,怎么办?
创建再次创建sentinel-service,工作负载。再使用它的域名进行访问。见sentinel部署。
查看sentinel-service服务,域名为:
sentinel-service.gulimall
spring.cloud.sentinel.transport.dashboard=sentinel-service.gulimall:8333
zipkin服务是无状态服务,不能直接用域名进行访问,怎么办?
创建zipkin-service,工作负载。再使用它的域名进行访问。见zipkin部署。
查看zipkin-service服务,域名为:
zipkin-service.gulimall
spring.zipkin.base-url=zipkin-service.gulimall:9411/
使用mysql-master,mysql-master是有状态服务,它的域名:
mysql-master.gulimall
spring.datasource.url=jdbc:mysql://mysql-master.gulimall:3306/gulimall_oms
mysql密码123456,mysql版本5.7,驱动为com.mysql.jdbc.Driver
使用rabbitmq,mysql-master是有状态服务,它的域名:
rabbitmq-management.gulimall
spring.rabbitmq.host=rabbitmq-management.gulimall
为每个项目,创建Dockerfile文件
FROM java:8
EXPOSE 8080
VOLUME /tmp
ADD target/*.jar /app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar","--spring.profiles.active=prod"]
参考devops-sample.yaml
sentinel-service服务的工作负载,点击进入,更多操作,编辑配置文件
复制内容到,项目的yaml中。
所有项目的deploy都有deploy.yaml文件
如gulimall-auth-server-deploy.yaml
name:是项目名称
namespace:是项目的名称空间,都为gulimall
app: 是项目名称,使用app全部改过来。(使用ctrl + r,替换)
前半部分为deployment,后半部分为service
都 修改name,app名称,为项目名称
service修改:
kind: Deployment
apiVersion: apps/v1
metadata:
name: gulimall-auth-server
namespace: gulimall
labels:
app: gulimall-auth-server
spec:
replicas: 1
selector:
matchLabels:
app: gulimall-auth-server
template:
metadata:
labels:
app: gulimall-auth-server
spec:
containers:
- name: gulimall-auth-server
image: $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$TAG_NAME
ports:
- containerPort: 8080
protocol: TCP
resources:
limits:
cpu: 1000m
memory: 500Mi
requests:
cpu: 10m
memory: 10Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: IfNotPresent
restartPolicy: Always
terminationGracePeriodSeconds: 30
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
revisionHistoryLimit: 10
progressDeadlineSeconds: 600
---
kind: Service
apiVersion: v1
metadata:
name: gulimall-auth-server
namespace: gulimall
labels:
app: gulimall-auth-server
spec:
ports:
- name: http
protocol: TCP
port: 8080
targetPort: 8080
nodePort: 20001
selector:
app: gulimall-auth-server
type: NodePort
sessionAffinity: None
Jenkinsfile参考Jenkinsfile-online
在gulimall项目,创建Jenkinsfile文件
gulimall-cicd
下一步,创建
parameters {
string(name:'PROJECT_VERSION',defaultValue: 'v0.0Beta',description:'')
}
编辑流水线
添加步骤
点击shell
echo $PROJECT_VERSION
确定,保存
运行
查看日志
点击 编辑Jenkinsfile
string(name: ‘PROJECT_NAME’, defaultValue: ‘’, description: ‘’)
确定
PROJECT_NAME
gulimall-auth-server
gulimall-cart
gulimall-coupon
gulimall-gateway
gulimall-member
gulimall-order
gulimall-product
gulimall-search
gulimall-seckill
gulimall-ware
gulinal-third-party
renren-fast
renren-generator
编辑Jenkinsfile,日志打印项目名称
sh ‘echo 正在构建 $PROJECT_NAME 版本号: $PROJECT_VERSION’
编辑Jenkinsfile文件
environment {
DOCKER_CREDENTIAL_ID = 'dockerhub-id'
GITEE_CREDENTIAL_ID = 'gitee-id'
KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
REGISTRY = 'docker.io'
DOCKERHUB_NAMESPACE = 'lzl123456'
GITEE_ACCOUNT = 'yummi'
SONAR_CREDENTIAL_ID = 'sonar-qube'
}
sh 'echo 正在构建 $PROJECT_NAME 版本号: $PROJECT_VERSION 将会提交给 $REGISTRY 镜像仓库'
其中:
代码测试不做了,直接做sonar质量代码分析
在gulimall下创建mvn-settings.xml文件
<settings>
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
</settings>
把它提交到码云仓库,码云地址yummi https://gitee.com/yummi/gulimail.git
stage('sonar代码质量分析') {
steps {
container ('maven') {
withCredentials([string(credentialsId: "$SONAR_CREDENTIAL_ID", variable: 'SONAR_TOKEN')]) {
withSonarQubeEnv('sonar') {
sh "echo 当前目录 `pwd` "
sh "mvn sonar:sonar -gs `pwd`/mvn-settings.xml -Dsonar.branch=$BRANCH_NAME -Dsonar.login=$SONAR_TOKEN"
}
}
timeout(time: 1, unit: 'HOURS') {
waitForQualityGate abortPipeline: true
}
}
}
}
No such property: BRANCH_NAME for class: groovy.lang.Binding
没有BRANCH_NAME分支名称,怎么解决?
环境变量添加分支名称
BRANCH_NAME=‘master’
[ERROR] Child module /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/renren-generator of /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/pom.xml does not exist
++ pwd
+ mvn sonar:sonar -gs /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/mvn-settings.xml -Dsonar.branch=master -Dsonar.login=****
[INFO] Scanning for projects...
[ERROR] [ERROR] Some problems were encountered while processing the POMs:
[ERROR] Child module /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/renren-generator of /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/pom.xml does not exist @
@
[ERROR] The build could not read 1 project -> [Help 1]
[ERROR]
[ERROR] The project com.gulimall:gulimall:0.0.1-SNAPSHOT (/home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/pom.xml) has 1 error
[ERROR] Child module /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/renren-generator of /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/pom.xml does not exist
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
script returned exit code 1
[ERROR] Child module /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/renren-generator of /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/pom.xml does not exist @
[ERROR] Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.9.0.2155:sonar (default-cli) on project gulimall: Please provide compiled classes of your project with sonar.java.binaries property -> [Help 1]
没有sonar.java.binaries property配置
gulimall的pom.xml加入以下配置
<properties>
<sonar.jacoco.reportPaths>${PWD}/./target/jacoco.exec</sonar.jacoco.reportPaths>
<sonar.groovy.binaries>target/classes</sonar.groovy.binaries>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.2</version>
<configuration>
<append>true</append>
</configuration>
<executions>
<execution>
<id>agent-for-ut</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>agent-for-it</id>
<goals>
<goal>prepare-agent-integration</goal>
</goals>
</execution>
<execution>
<id>jacoco-site</id>
<phase>verify</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.6.0.1398</version>
</plugin>
</plugins>
</build>
[ERROR] Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.9.0.2155:sonar (default-cli) on project gulimall: Please provide compiled classes of your project with sonar.java.binaries property -> [Help 1]
点击 编辑Jenkinsfile,添加编译的配置
container(‘maven’) {
sh ‘mvn clean install -Dmaven.test.skip=true’
}
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project common: Compilation failure: Compilation failure:
[ERROR] /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/common/src/main/java/com/atguigu/common/xss/HTMLFilter.java:[76,32] diamond operator is not supported in -source 1.5
[ERROR] (use -source 7 or higher to enable diamond operator)
[ERROR] /home/jenkins/agent/workspace/project-Rvj6VjzqBRLO/gulimall-cicd/common/src/main/java/com/atguigu/common/utils/Query.java:[40,33] diamond operator is not supported in -source 1.5
mv-settings.xml添加jdk配置,配置为jdk1.8
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
编辑Jemkinsfile,使用mvn-settings.xml
container('maven') {
sh 'mvn clean install -Dmaven.test.skip=true -gs `pwd`/mvn-settings.xml'
}
点击 容易出错,跳转到,使用master的ip,
http://192.168.56.100:30687/project/issues?id=com.gulimall:gulimall:master&resolved=false&types=CODE_SMELL
http://192.168.56.100:30687/project/issues?id=com.gulimall:gulimall:master&resolved=false&types=CODE_SMELL
stage ('构建 & 推送镜像') {
steps {
container ('maven') {
sh 'mvn -Dmaven.test.skip=true -gs `pwd`/mvn-settings.xml clean package'
sh 'cd $PROJECT_NAME && docker build -f Dockerfile -t $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$DOCKER_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER'
}
}
}
}
原因:denied: requested access to the resource is denied
推送镜像第四步失败,也就是推送到dockerhub失败
网络失败,或者master,即master连接失败
修改环境变量,看看dockerhub是否正确。
查看https://hub.docker.com/,获得dockerhub用户名是l123456
修改环境变量的dockerhub就可以
DOCKERHUB_NAMESPACE = 'lzl123456'
sh 'docker tag $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:latest '
sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:latest '
把项目部署到k8s集群
stage('部署到k8s集群') {
steps {
input(id: 'deploy-to-dev-$PROJECT_NAME', message: '是否把 $PROJECT_NAME 部署到集群中 ?')
kubernetesDeploy(configs: '$PROJECT_NAME/deploy/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
}
}
stage('发布版本'){
when{
expression{
return params.PROJECT_VERSION =~ /v.*/
}
}
steps {
container ('maven') {
input(id: 'release-image-with-tag', message: '发布当前版本镜像吗 ?')
withCredentials([usernamePassword(credentialsId: "$GITEE_CREDENTIAL_ID", passwordVariable: 'GIT_PASSWORD', usernameVariable: 'GIT_USERNAME')]) {
sh 'git config --global user.email "[email protected]" '
sh 'git config --global user.name "litianyu" '
sh 'git tag -a $PROJECT_VERSION -m "$PROJECT_VERSION" '
sh 'git push http://$GIT_USERNAME:[email protected]/$GITEE_ACCOUNT/gulimail.git --tags --ipv4'
}
sh 'docker tag $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:$PROJECT_VERSION '
sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:$PROJECT_VERSION '
}
}
}
邮箱改为自己的。如 [email protected]
用户名改为自己的。如 litianyu
码云地址改为自己的。如gulimail.git
github.com改为gitee.com
GITHUB_ACCOUNT改为GITEE_ACCOUNT
GITHUB_CREDENTIAL_ID改为GITEE_CREDENTIAL_ID
TAG_NAME 改为PROJECT_VERSION
TAG_NAME改为 PROJECT_NAME
修改所有项目的yaml文件的$APP_NAME:$TAG_NAME 为 $PROJECT_NAME:$PROJECT_VERSION
pipeline {
agent {
node {
label 'maven'
}
}
stages {
stage('拉取代码') {
steps {
git(credentialsId: 'gitee-id', url: 'https://gitee.com/yummi/gulimail.git', branch: 'master', changelog: true, poll: false)
sh 'echo 正在构建 $PROJECT_NAME 版本号: $PROJECT_VERSION 将会提交给 $REGISTRY 镜像仓库'
sh 'echo 正在完整编译项目。。。。。。。。。'
container('maven') {
sh 'mvn clean install -Dmaven.test.skip=true -gs `pwd`/mvn-settings.xml'
}
}
}
stage('sonar代码质量分析') {
steps {
container('maven') {
withCredentials([string(credentialsId: "$SONAR_CREDENTIAL_ID", variable: 'SONAR_TOKEN')]) {
withSonarQubeEnv('sonar') {
sh 'echo 当前目录 `pwd` '
sh "mvn sonar:sonar -gs `pwd`/mvn-settings.xml -Dsonar.branch=$BRANCH_NAME -Dsonar.login=$SONAR_TOKEN"
}
}
timeout(time: 1, unit: 'HOURS') {
waitForQualityGate true
}
}
}
}
stage('构建 & 推送镜像') {
steps {
container('maven') {
sh 'mvn -Dmaven.test.skip=true -gs `pwd`/mvn-settings.xml clean package'
sh 'cd $PROJECT_NAME && docker build -f Dockerfile -t $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$DOCKER_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker tag $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:latest '
sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:latest '
}
}
}
}
stage('部署到k8s集群') {
steps {
input(id: 'deploy-to-dev-$PROJECT_NAME', message: '是否把 $PROJECT_NAME 部署到集群中 ?')
kubernetesDeploy(configs: '$PROJECT_NAME/deploy/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
}
}
stage('发布版本'){
when{
expression{
return params.PROJECT_VERSION =~ /v.*/
}
}
steps {
container ('maven') {
input(id: 'release-image-with-tag', message: '发布当前版本镜像吗 ?')
withCredentials([usernamePassword(credentialsId: "$GITEE_CREDENTIAL_ID", passwordVariable: 'GIT_PASSWORD', usernameVariable: 'GIT_USERNAME')]) {
sh 'git config --global user.email "[email protected]" '
sh 'git config --global user.name "litianyu" '
sh 'git tag -a $PROJECT_VERSION -m "$PROJECT_VERSION" '
sh 'git push http://$GIT_USERNAME:[email protected]/$GITEE_ACCOUNT/gulimail.git --tags --ipv4'
}
sh 'docker tag $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:$PROJECT_VERSION '
sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:$PROJECT_VERSION '
}
}
}
}
environment {
DOCKER_CREDENTIAL_ID = 'dockerhub-id'
GITEE_CREDENTIAL_ID = 'gitee-id'
KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
REGISTRY = 'docker.io'
DOCKERHUB_NAMESPACE = 'lzl123456'
GITEE_ACCOUNT = 'yummi'
SONAR_CREDENTIAL_ID = 'sonar-qube'
BRANCH_NAME = 'master'
}
parameters {
string(name: 'PROJECT_VERSION', defaultValue: 'v0.0Beta', description: '')
string(name: 'PROJECT_NAME', defaultValue: '', description: '')
}
}
如
renren-generator-deploy.yaml
gulimall项目,服务,创建
mysql-node-port
下一步
启动k8s-node1,k8s-node2
启动失败
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
执行命令
systemctl daemon-reload
systemctl start docker.service
devops,流水线,创建
gulimall-jenkinsfile-cicd
谷粒商城自动微服务部署,参数化构建
选择代码仓库
使用gulimall的Jenkinsfile创建流水线
https://gitee.com/yummi/gulimail.git
点击对号,下一步
创建
原因:没有项目名
解决:使用自动填充参数的方式,运行
使用自动填充参数的方式,运行
再次执行
问题:deploy下的文件无法无法识别。项目名无法动态取出来
解决:把参数使用""包括。修改Jekinsfile文件
再次执行
问题:端口号指定在30000-32767之间
解决:修改每个项目的deploy.yaml文件
从31000开始设置。。
再次执行
问题:空指针??
发布到k8s第二步失败,空指针。
可能找不到deploy.yaml文件
解决:不知道。。。
可能找不到deploy.yaml文件,那就手动指定。。虽然笨,但是结果成功就行。。。
构建哪个项目,jenkinsfile修改为哪个项目的deploy.yaml文件
gulimall项目,服务。端口号为31003
进入它的服务,看到容器正在创建
原因:容器内存 不足
每个项目的deploy.yaml文件,限制了内存
ENTRYPOINT ["java","-jar","-Xms128m","-Xmx300m","/app.jar","--spring.profiles.active=prod"]
修改完,再次运行,部署网关1.0