进学阁

业精于勤荒于嬉,行成于思毁于随

0%

使用devpos实现自动部署(九)

找到devpos

选中平台管理

点击访问控制

创建企业空间

然后进入企业空间

点击devpos项目,然后创建项目

创建项目

编写Deployment

在k8s中每个pod中对应着一个Deployment.yaml配置文件所以想要项目上线,就需要先编写Deployment文件

以gateway为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
kind: Deployment
apiVersion: apps/v1
metadata:
name: k-gateway
namespace: koalas-cloud
labels:
app: k-gateway
annotations:
deployment.kubernetes.io/revision: '1'
kubesphere.io/alias-name: 网关
kubesphere.io/creator: admin
spec:
replicas: 1
selector:
matchLabels:
app: k-gateway
template:
metadata:
labels:
app: k-gateway
spec:
volumes:
- name: host-time
hostPath:
path: /etc/localtime
type: ''
containers:
- name: container-gateway
image: '$REGISTRY/$DOCKERHUB_NAMESPACE/koalas-gateway:SNAPSHOT-$BUILD_NUMBER'
ports:
- name: tcp-5056
containerPort: 5056
protocol: TCP
env:
- name: JAVA_OPTS
valueFrom:
configMapKeyRef:
name: k-evn
key: JAVA_OPTS
- name: SPRING_CONFIG
valueFrom:
configMapKeyRef:
name: k-evn
key: SPRING_CONFIG
resources:
limits:
cpu: '1'
memory: 1000Mi
requests:
cpu: 500m
memory: 320Mi
volumeMounts:
- name: host-time
readOnly: true
mountPath: /etc/localtime
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: IfNotPresent
restartPolicy: Always
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
serviceAccountName: default
serviceAccount: default
securityContext: {}
imagePullSecrets:
- name: demo-harbor-secret
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
revisionHistoryLimit: 10
progressDeadlineSeconds: 600

添加凭证

在编写流水线的地方需要先把凭证添加好

添加git代码凭证

输入有读权限的git账号密码,这里也可以用ssl方式不一一列举

添加harbor凭证

同git一致

添加kubeconfig

kubeconfig是k8s容器内可以执行ketcel命令的权限标识符

选择后内容自动填充的不需要手动输入

编写流水线

找到刚才新建的流水线,打开Jenkinsfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
pipeline {
agent {
node {
label 'maven'
}

}
stages {
stage('代码拉取') {
when {
expression {
return (params.IS_BUILD_AND_PACKAGE == true)
}

}
post {
success {
echo '代码拉取成功!'
}

}
steps {
container('maven') {
checkout([$class: 'GitSCM', branches: [[name: "${BRANCH_TAG}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: 'koalas-code',
url: "http://git.tetpark.com/tingeting/koalas-cloud.git"]]])

sh "ls"
}

}
}

stage('Maven编译代码') {
agent none
when {
expression {
return (params.IS_BUILD_AND_PACKAGE == true)
}

}
post {
success {
echo '编译代码成功!'
}

}
steps {
container('maven') {
sh 'mvn -Dmaven.test.skip=true -gs `pwd`/configuration/settings.xml clean package'
sh "ls"
}

}
}

stage('构建镜像,推送') {
steps {
container('maven') {
withCredentials([usernamePassword(passwordVariable : 'HARBOR_PASSWORD' ,usernameVariable : 'HARBOR_USERNAME' ,credentialsId : "$DOCKER_CREDENTIAL_ID" ,)]) {
sh 'echo "$HARBOR_PASSWORD" | docker login $REGISTRY -u "$HARBOR_USERNAME" --password-stdin'
}

script {
sh "ls"
services_str = "${SERVICES}"
def services = services_str.split("\n")
for (int i = 0; i < services.size(); ++i){
service_name = services[i].replaceAll("\"", "")
echo "选择的服务:${service_name}"
// 制作镜像
if("${service_name}".contains("koalas-gateway") || "${service_name}".contains("koalas-auth")){
//基础镜像构建
sh "docker build -t $REGISTRY/$DOCKERHUB_NAMESPACE/${service_name}:SNAPSHOT-$BUILD_NUMBER ${service_name}"
}else{
sh "docker build -t $REGISTRY/$DOCKERHUB_NAMESPACE/${service_name}:SNAPSHOT-$BUILD_NUMBER koalas-modules/${service_name}"
}
// 镜像标签
sh "docker tag $REGISTRY/$DOCKERHUB_NAMESPACE/${service_name}:SNAPSHOT-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/${service_name}:${BRANCH_TAG}"
// 上传镜像
sh "docker push $REGISTRY/$DOCKERHUB_NAMESPACE/${service_name}:SNAPSHOT-$BUILD_NUMBER"
}
//删除悬虚镜像
sh "docker image prune -a -f"
// 登出私有仓库
sh "docker logout $REGISTRY"
}

}

}
}

stage('发布到测试环境') {
agent none
steps {
container('maven') {
sh 'kubectl version --short --client'
withCredentials([kubeconfigFile(credentialsId: "$KUBECONFIG_CREDENTIAL_ID", variable: 'KUBECONFIG')]) {
script {
sh "ls"
services_str = "${SERVICES}"
def services = services_str.split("\n")
for (int i = 0; i < services.size(); ++i){
service_name = services[i].replaceAll("\"", "")
echo "选择的服务:${service_name}"
if("${service_name}".contains("koalas-gateway") || "${service_name}".contains("koalas-auth")){
sh "envsubst < ${service_name}/deploy/dev/deploy.yml | kubectl apply -f -"
}else{
sh "envsubst < koalas-modules/${service_name}/deploy/dev/deploy.yml | kubectl apply -f -"
}
}
}
}
}
}
}
}
environment {
DOCKER_CREDENTIAL_ID = 'harbor'
GITHUB_CREDENTIAL_ID = 'koalas-code'
KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
REGISTRY = '192.168.1.121:8098'
DOCKERHUB_NAMESPACE = 'koalas-cloud'
}
}

运行效果

点击运行

选择k8s-dev分支

选择你要更新的模块点击更新

等着发布完成就好