GitLab
- GitLab上创建三个测试项目用于构建,代码自行上传
- 生成
api token
,保存该token
Jenkins
- 登陆harbor
[root@harbor internet-hospital]# docker login 192.168.1.40
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
-
maven
下载地址:https://maven.apache.org/download.cgi,下载后上传到服务器/opt
目录,解压、改名为maven3.6
在Jenkins上配置
-
git
yum install -y git
# 查看版本
[root@harbor opt]# git --version
git version 1.8.3.1
Jenkins上配置
- nodejs
wget https://nodejs.org/dist/v10.16.3/node-v10.16.3-linux-x64.tar.xz \
&& tar -xvf node-v10.16.3-linux-x64.tar.xz \
&& mv node-v10.16.3-linux-x64 node \
&& ln -s /opt/node/bin/npm /usr/bin/npm \
&& ln -s /opt/node/bin/node /usr/bin/node \
# 查看版本
[root@harbor ~]# node -v
v10.16.3
[root@harbor ~]# npm -v
6.9.0
Java构建脚本
#!/bin/bash
# 脚本功能:通过Jenkins在k8s集群部署Java服务
# 准备工作:Jenkins所在主机的kubectl已配置好k8s链接
# jar包路径
app_dir="./cn-scaffold-cs/target"
# jar包名称
app_name="cn-scaffold-cs-0.0.1.jar"
# 服务暴露端口
config_port="31009"
################################## 切换环境时改动 ##################################
# 项目名代号,归档配置文件用
project="scaffold"
# 部署环境(dev/test/prd)
env="dev"
# 配置文件类型(java/node/vue)
config_type="java"
# harbor的IP
harbor_ip="192.168.1.40"
# harbor的镜像仓库名称,需提前在harbor创建好
harbor_pro="yd"
# k8s上该项目的namespace,需提前在k8s创建好
namespace="dev-yd"
# harbor密钥名称,需提前在k8s创建好
secret="yd-secret"
# POD副本数
replicas="1"
################################## 以下内容不需改动 ##################################
# 配置文件路径
conf_dir="/opt/config/${config_type}/${env}/${project}/${JOB_NAME}"
config_dir="${conf_dir}/config"
dockerfile_dir="${conf_dir}/dockerfile"
deployment_dir="${conf_dir}/deployment"
# Docker
docker_space="/tmp/docker/${JOB_NAME}"
docker_images="${JOB_NAME}:v${BUILD_ID}"
# 配置文件名称
config_name="bootstrap_${JOB_NAME}_v${BUILD_ID}.yml"
dockerfile_name="dockerfile_${JOB_NAME}_v${BUILD_ID}"
deployment_name="deployment_${JOB_NAME}_v${BUILD_ID}.yaml"
# 检查目录函数
function dir_check()
{
if [ ! -d "$1" ];then mkdir -p $1; fi
}
################################## 生成config ##################################
dir_check ${config_dir}
cat >${config_dir}/${config_name}<<EOF
spring:
application:
name: cn-scaffold-cs
server:
port: 31009
eureka:
client:
serviceUrl:
defaultZone: http://root:root@192.168.1.11:31008/eureka
instance:
instance-id: \${spring.cloud.client.ipAddress}:\${server.port}:\${spring.application.name}
prefer-ip-address: true
statusPageUrlPath: /doc.html
management:
security:
enabled: false
swagger:
basePackage: com.cn
contact: mcz
description: 脚手组件架工程
title: 脚手架组件
project:
versionUrl: v1
security:
basic:
enabled: false
cn:
enableGlobalException: false
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
datasource:
mapperLocations: classpath:com/cn/*/mapper/*.xml
typeAliasPackage: com.cn.beans.*.entity.*
mysqldb:
datasource:
connection-init-sqls: set names utf8mb4;
driverClassName: com.mysql.jdbc.Driver
filters: stat
initialSize: 10
maxActive: 100
maxIdle: 30
maxOpenPreparedStatements: 20
maxWait: 10000
minEvictableIdleTimeMillis: 300000
minIdle: 1
password: 6yhn^YHN
poolPreparedStatements: true
testOnBorrow: false
testOnReturn: false
testWhileIdle: true
timeBetweenEvictionRunsMillis: 10000
url: jdbc:mysql://192.168.1.26:3306/scaffold-cs?dontTrackOpenResources=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
username: root
validationQuery: select 'x'
EOF
################################## 生成dockerfile ##################################
dir_check ${dockerfile_dir}
cat >${dockerfile_dir}/${dockerfile_name}<<EOF
FROM openjdk:8u252-slim-buster
EXPOSE ${config_port}
WORKDIR /my-java
ADD . /my-java
CMD ["java","-Xms2048m","-Xmx4096m","-XX:PermSize=256m","-XX:MaxPermSize=512m","-XX:MaxNewSize=512m","-Dfile.encoding=UTF8","-Duser.timezone=GMT+08","-jar","${app_name}"]
EOF
################################## 生成deployment ##################################
dir_check ${deployment_dir}
cat >${deployment_dir}/${deployment_name}<<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: ${JOB_NAME}
namespace: ${namespace}
spec:
replicas: ${replicas}
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app: ${JOB_NAME}-pod
template:
metadata:
labels:
app: ${JOB_NAME}-pod
spec:
restartPolicy: Always
imagePullSecrets:
- name: ${secret}
containers:
- name: ${JOB_NAME}-con
image: ${harbor_ip}/${harbor_pro}/${docker_images}
imagePullPolicy: Always
ports:
- name:
containerPort: ${config_port}
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: ${JOB_NAME}-svc
namespace: ${namespace}
labels:
name: ${JOB_NAME}-svc
spec:
type: NodePort
selector:
app: ${JOB_NAME}-pod
ports:
- protocol: TCP
port: ${config_port}
targetPort: ${config_port}
nodePort: ${config_port}
EOF
################################## 构建镜像 ##################################
dir_check ${docker_space}
cp ${config_dir}/${config_name} ${docker_space}/bootstrap.yml
cp ${app_dir}/${app_name} ${docker_space}
cd ${docker_space};docker build -f ${dockerfile_dir}/${dockerfile_name} -t ${harbor_ip}/${harbor_pro}/${docker_images} .
docker push ${harbor_ip}/${harbor_pro}/${docker_images}
docker rmi ${harbor_ip}/${harbor_pro}/${docker_images}
rm -rf ${docker_space}/*
################################## 部署deployment ##################################
kubectl apply -f ${deployment_dir}/${deployment_name} --record
kubectl rollout status deployment/${JOB_NAME} -n ${namespace}
Node脚本
#!/bin/bash
# 脚本功能:通过Jenkins在k8s集群部署Node服务
# 准备工作:Jenkins所在主机的kubectl已配置好k8s链接
# 自己制作的镜像:192.168.1.40/xzzyy/node:hospital_room
# 服务暴露端口
config_port="30180"
################################## 切换环境时改动 ##################################
# 项目名代号,归档配置文件用
project="internet-hospital"
# 部署环境(dev/test/prd)
env="dev"
# 配置文件类型(java/node/vue)
config_type="node"
# harbor的IP
harbor_ip="192.168.1.40"
# harbor的镜像仓库名称,需提前在harbor创建好
harbor_pro="xzzyy"
# k8s上该项目的namespace,需提前在k8s创建好
namespace="demo-space"
# harbor密钥名称,需提前在k8s创建好
secret="demo-secret"
################################## 以下内容不需改动 ##################################
# 配置文件路径
conf_dir="/opt/config/${config_type}/${env}/${project}/${JOB_NAME}"
config_dir="${conf_dir}/config"
dockerfile_dir="${conf_dir}/dockerfile"
deployment_dir="${conf_dir}/deployment"
# Docker
docker_space="/tmp/docker/${JOB_NAME}"
docker_images="${JOB_NAME}:v${BUILD_ID}"
# 配置文件名称
config_name="config_${JOB_NAME}_v${BUILD_ID}.js"
dockerfile_name="dockerfile_${JOB_NAME}_v${BUILD_ID}"
deployment_name="deployment_${JOB_NAME}_v${BUILD_ID}.yaml"
# 检查目录函数
function dir_check()
{
if [ ! -d "$1" ];then mkdir -p $1; fi
}
################################## 生成config ##################################
dir_check ${config_dir}
cat >${config_dir}/${config_name}<<EOF
const dbConfig = {
connectionLimit: 5,
host: "192.168.1.26",
user: "root",
port: "3306",
password: "6yhn^YHN",
database: "demo-x",
timezone: "08:00"
};
// redis配置文件
const redisConfig = {
port: 26379,
host: "192.168.1.26"
};
// 微信配置文件
const wxConfig = {
appid: "wxef50c70a177d514a", // 公众号id
mchid: "1568794661", // 微信商户号
partnerKey: "123123" //微信支付安全密钥
};
// kafka配置
const kafkaConfig = "192.168.1.26:9092";
// 公共平台地址
const livingRoomConfig = {
url: "http://192.168.1.26:31174"
};
// 消息中心地址
const massageConfig = {
url: "http://192.168.1.26:31177"
};
const publicTopicObj = {};
exports.dbConfig = dbConfig;
exports.redisConfig = redisConfig;
exports.wxConfig = wxConfig;
exports.livingRoomConfig = livingRoomConfig;
exports.massageConfig = massageConfig;
exports.publicTopicObj = publicTopicObj;
exports.kafkaConfig = kafkaConfig;
EOF
################################## 生成dockerfile ##################################
dir_check ${dockerfile_dir}
cat >${dockerfile_dir}/${dockerfile_name}<<EOF
FROM 192.168.1.40/xzzyy/node:hospital_room
EXPOSE 30180
WORKDIR /my-node
ADD node.tar.gz /my-node
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
CMD ["npm","start"]
EOF
################################## 生成deployment ##################################
dir_check ${deployment_dir}
cat >${deployment_dir}/${deployment_name}<<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: ${JOB_NAME}-deployment
namespace: ${namespace}
spec:
replicas: 2
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app: ${JOB_NAME}-pod
template:
metadata:
labels:
app: ${JOB_NAME}-pod
spec:
restartPolicy: Always
imagePullSecrets:
- name: ${secret}
containers:
- name: ${JOB_NAME}-con
image: ${harbor_ip}/${harbor_pro}/${docker_images}
ports:
- name: ${JOB_NAME}-port
containerPort: ${config_port}
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: ${JOB_NAME}-service
namespace: ${namespace}
labels:
name: ${JOB_NAME}-service
spec:
type: NodePort
selector:
app: ${JOB_NAME}-pod
ports:
- protocol: TCP
port: ${config_port}
targetPort: ${config_port}
nodePort: ${config_port}
EOF
################################## 项目编译 ##################################
rm -rf node.tar.gz
\cp ${config_dir}/${config_name} ./config/config.js
npm install
tar -zcf node.tar.gz *
################################## 构建镜像 ##################################
dir_check ${docker_space}
cp ./node.tar.gz ${docker_space}
cd ${docker_space};docker build -f ${dockerfile_dir}/${dockerfile_name} -t ${harbor_ip}/${harbor_pro}/${docker_images} .
docker push ${harbor_ip}/${harbor_pro}/${docker_images}
docker rmi ${harbor_ip}/${harbor_pro}/${docker_images}
rm -rf ${docker_space}/*
################################## 部署deployment ##################################
kubectl apply -f ${deployment_dir}/${deployment_name}
tomcat
#!/bin/bash
# 脚本功能:通过Jenkins在k8s集群部署Vue服务
# 准备工作:Jenkins所在主机的kubectl已配置好k8s链接
# 服务暴露端口
config_port="31010"
################################## 切换环境时改动 ##################################
# 项目名代号,归档配置文件用
project="scaffold"
# 部署环境(dev/test/prd)
env="dev"
# 配置文件类型(java/node/vue)
config_type="vue"
# harbor的IP
harbor_ip="192.168.1.40"
# harbor的镜像仓库名称,需提前在harbor创建好
harbor_pro="yd"
# k8s上该项目的namespace,需提前在k8s创建好
namespace="dev-yd"
# harbor密钥名称,需提前在k8s创建好
secret="yd-secret"
# POD副本数
replicas="1"
################################## 以下内容不需改动 ##################################
# 配置文件路径
conf_dir="/opt/config/${config_type}/${env}/${project}/${JOB_NAME}"
config_dir="${conf_dir}/config"
dockerfile_dir="${conf_dir}/dockerfile"
deployment_dir="${conf_dir}/deployment"
# Docker
docker_space="/tmp/docker/${JOB_NAME}"
docker_images="${JOB_NAME}:v${BUILD_ID}"
# 配置文件名称
config_name="index_${JOB_NAME}_v${BUILD_ID}.js"
dockerfile_name="dockerfile_${JOB_NAME}_v${BUILD_ID}"
deployment_name="deployment_${JOB_NAME}_v${BUILD_ID}.yaml"
# 检查目录函数
function dir_check()
{
if [ ! -d "$1" ];then mkdir -p $1; fi
}
################################## 生成config ##################################
dir_check ${config_dir}
cat >${config_dir}/${config_name}<<EOF
let configObj = {
iot: "http://192.168.1.11:30003",
iot_login: "http://192.168.1.11:30003"
};
const { iot, iot_login } = configObj;
export {
iot,
iot_login,
}
EOF
################################## 生成dockerfile ##################################
dir_check ${dockerfile_dir}
cat >${dockerfile_dir}/${dockerfile_name}<<EOF
FROM tomcat:9.0.35-jdk8-openjdk-slim
EXPOSE 8080
WORKDIR /usr/local/tomcat/webapps/ROOT
ADD dist /usr/local/tomcat/webapps/ROOT
EOF
################################## 生成deployment ##################################
dir_check ${deployment_dir}
cat >${deployment_dir}/${deployment_name}<<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: ${JOB_NAME}
namespace: ${namespace}
spec:
replicas: ${replicas}
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app: ${JOB_NAME}-pod
template:
metadata:
labels:
app: ${JOB_NAME}-pod
spec:
restartPolicy: Always
imagePullSecrets:
- name: ${secret}
containers:
- name: ${JOB_NAME}-con
image: ${harbor_ip}/${harbor_pro}/${docker_images}
imagePullPolicy: Always
ports:
- name:
containerPort: ${config_port}
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: ${JOB_NAME}-svc
namespace: ${namespace}
labels:
name: ${JOB_NAME}-svc
spec:
type: NodePort
selector:
app: ${JOB_NAME}-pod
ports:
- protocol: TCP
port: ${config_port}
targetPort: 8080
nodePort: ${config_port}
EOF
################################## 项目编译 ##################################
\cp ${config_dir}/${config_name} ./src/config/index.js
npm install --unsafe-perm
npm run build
################################## 构建镜像 ##################################
dir_check ${docker_space}
cp -r ./dist ${docker_space}
cd ${docker_space};docker build -f ${dockerfile_dir}/${dockerfile_name} -t ${harbor_ip}/${harbor_pro}/${docker_images} .
docker push ${harbor_ip}/${harbor_pro}/${docker_images}
docker rmi ${harbor_ip}/${harbor_pro}/${docker_images}
rm -rf ${docker_space}/*
################################## 部署deployment ##################################
kubectl apply -f ${deployment_dir}/${deployment_name} --record
kubectl rollout status deployment/${JOB_NAME} -n ${namespace}