前提:项目代码准备
- 代码下载
-
- 从SVN将代码checkout到本地
- Vue工程需确保
npm install
和npm run build
正常
- 代码上传到Gitlab
-
- 确保工程代码最新
- 多余文件删除
.gitignore
文件创建- 在gitlab中创建工程
- 上传到Gitlab,如下
csharp
## 上传代码到Git命令
# 进入项目根目录
# 初始化git本地仓库
git init
# 初始提交
git add .
git commit -m "Initial Commit"
# 关联远程Gitlab仓库
git remote add origin http://gitlab.hangzhou.net/date-info/ad/info-manage.git
# 推送代码到远程仓库master分支
git push -u origin master
# 创建并切换到 dev 分支
git checkout -b dev
# 推送dev分支到远程仓库
git push --set-upstream origin dev
一、部署Java工程
1.部署文件准备
Dockerfile
- 在项目根目录中创建Dockerfile文件(如果项目中原有Dockerfile,尽量修改为下述内容结构)
- 内容先复制如下内容
bash
FROM xxxxxxx/openjdk:8-jre
MAINTAINER wangx test@foxmail.com
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
COPY target/test-gateway-server.jar /app.jar
ENTRYPOINT ["java", "-Xmx512m", "-Djava.security.egd=file:/dev/./urandom", "-Ddruid.mysql.usePingMethod=false", "-jar", "/app.jar"]
- 根据项目修改以下几点
-
MAINTAINER
:作者,写自己的即可;COPY
:将jar文件的名称修改项目名称;- 如有需要
COPY
字体文件,可在COPY jar下发增加COPY simsun.ttc /usr/share/fonts/simsun.ttc
命令。
Jenkinsfile
- 在项目根目录中创建Jenkinsfile文件
- 内容先复制如下内容
php
pipeline {
agent any
environment{
repoHost = 'registry-dev.hangzhou.net'
repoNs = 'test'
repoUser = 'testadmin'
repoPasswd = 'test@114514'
}
// 存放所有任务的合集
stages {
// 拉取代码
stage('git checkout') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/dev']], extensions: [], userRemoteConfigs: [[credentialsId: 'wagnxin-gitlab', url: 'http://gitlab.hangzhou.net/date-info/test/test-cloud.git']]])
}
}
// 构建代码
stage('mvn clean package') {
steps {
sh '/var/jenkins_home/maven_3.6.1/bin/mvn clean package -Ptest -DskipTests'
}
}
// 制作自定义镜像并发布
stage('docker build and push') {
steps {
sh '''docker build -t ${JOB_NAME}:${IMAGE_TAG} ./
docker login -u ${repoUser} -p ${repoPasswd} ${repoHost}
docker tag ${JOB_NAME}:${IMAGE_TAG} ${repoHost}/${repoNs}/${JOB_NAME}:${IMAGE_TAG}
docker push ${repoHost}/${repoNs}/${JOB_NAME}:${IMAGE_TAG}
docker rmi ${JOB_NAME}:${IMAGE_TAG}
docker rmi ${repoHost}/${repoNs}/${JOB_NAME}:${IMAGE_TAG}'''
}
}
// 上传pipeline.yml文件
stage('upload yaml to k8s') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/home/test-app', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'PROJECT_NAME.yaml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
// 修改yaml文件中镜像版本为自定生成的版本号
stage('set docker image tag') {
steps {
sh 'ssh root@172.16.1.232 sed -i s/IMAGE_TAG/${IMAGE_TAG}/ /home/test-app/${JOB_NAME}.yaml'
}
}
// 远程执行kubectl命令
stage('publish') {
steps {
sh 'ssh root@172.16.1.232 kubectl apply -f /home/test-app/${JOB_NAME}.yaml'
}
}
}
post {
success {
dingtalk (
robot: 'ad_dingding_robot',
type:'MARKDOWN',
title: "${JOB_NAME}发布成功",
text: ["${JOB_NAME}部署结果通知 \n- 构建结果:成功构建\n- 镜像版本:${IMAGE_TAG}\n- 持续时间:${currentBuild.durationString}\n- 任务:${JOB_NAME}"]
)
}
failure {
dingtalk (
robot: 'ad_dingding_robot',
type:'MARKDOWN',
title: "${JOB_NAME}发布失败",
text: ["${JOB_NAME}部署结果通知\n- 构建结果:构建失败 \n- 镜像版本:${IMAGE_TAG}\n- 持续时间:${currentBuild.durationString}\n- 任务:${JOB_NAME}"]
)
}
}
}
- 根据项目修改以下几点
-
- 拉取代码区域:根据自己的Gitlab代码地址修改
url
的值 - 构建代码区域:根据项目情况决定是否保留
-Ptest
- 上传pipeline.yml文件区域:修改
PROJECT_NAME
为你的项目名称,最终和k8s yaml文件名称保持一致 - 如当前项目是某个学校,需要提前创建好名称空间,替换当前文件中
test-app
为新的名称空间名称
- 拉取代码区域:根据自己的Gitlab代码地址修改
k8s yaml
- 在项目根目录中创建
PROJECT_NAME.yaml
文件,PROJECT_NAME
修改为项目名称 - 内容先复制如下内容
yaml
apiVersion: apps/v1
kind: Deployment
metainfo:
labels:
k8s.kuboard.cn/layer: svc
k8s.kuboard.cn/name: PROJECT_NAME
name: PROJECT_NAME
namespace: test-app
spec:
replicas: 1
selector:
matchLabels:
k8s.kuboard.cn/layer: svc
k8s.kuboard.cn/name: PROJECT_NAME
template:
metainfo:
labels:
k8s.kuboard.cn/layer: svc
k8s.kuboard.cn/name: PROJECT_NAME
spec:
containers:
- image: registry-dev.hangzhou.net/test/PROJECT_NAME:IMAGE_TAG
imagePullPolicy: Always
name: PROJECT_NAME
ports:
- containerPort: 8888
name: gateway
protocol: TCP
resources:
limits:
memory: 500Mi
requests:
memory: 200Mi
restartPolicy: Always
imagePullSecrets:
- name: zyharbor
---
apiVersion: v1
kind: Service
metainfo:
labels:
k8s.kuboard.cn/layer: svc
k8s.kuboard.cn/name: PROJECT_NAME
name: PROJECT_NAME
namespace: test-app
spec:
ports:
- name: api
port: 8888
protocol: TCP
targetPort: 8888
selector:
k8s.kuboard.cn/layer: svc
k8s.kuboard.cn/name: PROJECT_NAME
type: NodePort
- 根据项目修改以下几点
-
- 将所有的
PROJECT_NAME
修改为当前项目名称 - 将
8888
端口修改为项目使用的端口 - 如当前项目是某个学校,需要提前创建好名称空间,替换当前文件中
test-app
为新的名称空间名称
- 将所有的
2.创建Jenkins Job
- 进入Jenkins
arduino
地址:http://172.16.1.247:8080
账号:admin
密码:admin123
- 选择指定组织视图,如果无可创建视图,再点击左上角
+新建任务
- 任务名称输入项目名称
- 选择流水线类型
- 在
复制
输入框输入test-gateway-server
,会出现一个下拉框选择出现的test-gateway-server
- 点击
OK
按钮保存,然后进入配置页 - 点击左侧
流水线
,定位到配置仓库位置,修改Repository URL
的值为当前项目的Git地址 - 脚本路径输入框修改为
Jenkinsfile
值即可 - 点击应用、保存
3.测试应用部署
- 在刚创建的任务里,点击
Build with Parameters
,进入构建页面,继续点击开始构建
即可 - 在左边下发的
Build History
会出现一个进行中的构建,点击可查看具体日志 - 构建成功后,访问K8S
http://172.16.1.232/
(admin/Gj@CbYJihcI#5igy) - 侧边栏找到
名称空间-选择
并点击,点击test-app
名称空间 - 侧边栏找到
应用程序-工作负载
并点击在列表中找到刚刚部署的应用,点击名称进入详情页 - 然后点击顶部栏的
服务
,具体端口如图所示 - 通过
172.16.1.232:PORT
再拼接上接口的详情地址即可访问 - 部署完成
二、部署Vue工程
1.部署文件准备
nginx.conf
- 在项目根目录中创建nginx.conf文件
- 内容复制如下内容
ini
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
#gzip on;
server {
listen 17003 default_server;
listen [::]:17003 default_server;
location / {
root /usr/share/nginx/html;
index index.html;
}
# 接口代理
location /api {
proxy_pass http://172.16.1.232:32001/api;
}
}
}
- 根据项目修改以下几点
-
- 接口代理:修改为项目所需要的接口地址
Dockerfile
- 在项目根目录中创建Dockerfile文件(如果项目中原有Dockerfile,尽量修改为下述内容结构)
- 内容先复制如下内容
bash
FROM registry-dev.hangzhou.net/library/nginx:1.18.0-alpine
WORKDIR /
# 复制前端文件
COPY ./dist /usr/share/nginx/html
# 复制nginx配置文件
COPY ./nginx.conf /etc/nginx/nginx.conf
- 不需要修改任何内容
Jenkinsfile
- 在项目根目录中创建Jenkinsfile文件
- 内容先复制如下内容
php
pipeline {
agent any
environment{
repoHost = 'registry-dev.hangzhou.net'
repoNs = 'test'
repoUser = 'testadmin'
repoPasswd = 'test@114514'
}
// 存放所有任务的合集
stages {
// 拉取代码
stage('git checkout') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/dev']], extensions: [], userRemoteConfigs: [[credentialsId: 'wagnxin-gitlab', url: 'http://gitlab.hangzhou.net/date-info/test/big-info-auth-web.git']]])
}
}
// 构建代码
stage('npm install and build') {
steps {
sh '''/var/jenkins_home/node_12.20.0/bin/npm install
/var/jenkins_home/node_12.20.0/bin/npm run build'''
}
}
// 制作自定义镜像并发布
stage('docker build and push') {
steps {
sh '''docker build -t ${JOB_NAME}:${IMAGE_TAG} ./
docker login -u ${repoUser} -p ${repoPasswd} ${repoHost}
docker tag ${JOB_NAME}:${IMAGE_TAG} ${repoHost}/${repoNs}/${JOB_NAME}:${IMAGE_TAG}
docker push ${repoHost}/${repoNs}/${JOB_NAME}:${IMAGE_TAG}
docker rmi ${JOB_NAME}:${IMAGE_TAG}
docker rmi ${repoHost}/${repoNs}/${JOB_NAME}:${IMAGE_TAG}'''
}
}
// 上传pipeline.yml文件
stage('upload yaml to k8s') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/home/test-app', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'PROJECT_NAME.yaml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
// 修改yaml文件中镜像版本为自定生成的版本号
stage('set docker image tag') {
steps {
sh 'ssh root@172.16.1.232 sed -i s/IMAGE_TAG/${IMAGE_TAG}/ /home/test-app/${JOB_NAME}.yaml'
}
}
// 远程执行kubectl命令
stage('publish') {
steps {
sh 'ssh root@172.16.1.232 kubectl apply -f /home/test-app/${JOB_NAME}.yaml'
}
}
}
post {
success {
dingtalk (
robot: 'ad_dingding_robot',
type:'MARKDOWN',
title: "${JOB_NAME}发布成功",
text: ["${JOB_NAME}部署结果通知 \n- 构建结果:成功构建\n- 镜像版本:${IMAGE_TAG}\n- 持续时间:${currentBuild.durationString}\n- 任务:${JOB_NAME}"]
)
}
failure {
dingtalk (
robot: 'ad_dingding_robot',
type:'MARKDOWN',
title: "${JOB_NAME}发布失败",
text: ["${JOB_NAME}部署结果通知\n- 构建结果:构建失败 \n- 镜像版本:${IMAGE_TAG}\n- 持续时间:${currentBuild.durationString}\n- 任务:${JOB_NAME}"]
)
}
}
}
- 根据项目修改以下几点
-
- 拉取代码区域:根据自己的Gitlab代码地址修改
url
的值 - 上传pipeline.yml文件区域:修改
PROJECT_NAME
为你的项目名称,最终和k8s yaml文件名称保持一致 - 如当前项目是某个学校,需要提前创建好名称空间,替换当前文件中
test-app
为新的名称空间名称
- 拉取代码区域:根据自己的Gitlab代码地址修改
k8s yaml
- 在项目根目录中创建
PROJECT_NAME.yaml
文件,PROJECT_NAME
修改为项目名称 - 内容先复制如下内容
yaml
apiVersion: apps/v1
kind: Deployment
metainfo:
labels:
k8s.kuboard.cn/layer: web
k8s.kuboard.cn/name: PROJECT_NAME
name: PROJECT_NAME
namespace: test-app
spec:
replicas: 1
selector:
matchLabels:
k8s.kuboard.cn/layer: web
k8s.kuboard.cn/name: PROJECT_NAME
template:
metainfo:
labels:
k8s.kuboard.cn/layer: web
k8s.kuboard.cn/name: PROJECT_NAME
spec:
containers:
- image: registry-dev.hangzhou.net/test/PROJECT_NAME:IMAGE_TAG
imagePullPolicy: Always
name: PROJECT_NAME
ports:
- containerPort: 17003
name: web
protocol: TCP
resources:
limits:
memory: 500Mi
requests:
memory: 200Mi
restartPolicy: Always
imagePullSecrets:
- name: zyharbor
---
apiVersion: v1
kind: Service
metainfo:
labels:
k8s.kuboard.cn/layer: web
k8s.kuboard.cn/name: PROJECT_NAME
name: PROJECT_NAME
namespace: test-app
spec:
ports:
- name: web
port: 17003
protocol: TCP
targetPort: 17003
selector:
k8s.kuboard.cn/layer: web
k8s.kuboard.cn/name: PROJECT_NAME
type: NodePort
- 根据项目修改以下几点
-
- 将所有的
PROJECT_NAME
修改为当前项目名称 - 如当前项目是某个学校,需要提前创建好名称空间,替换当前文件中
test-app
为新的名称空间名称
- 将所有的
2.创建Jenkins Job
- 进入Jenkins
arduino
地址:http://172.16.1.247:8080
账号:admin
密码:admin123
- 选择指定组织视图,如果无可创建视图,再点击左上角
+新建任务
- 任务名称输入项目名称
- 选择流水线类型
- 在
复制
输入框输入test-authority-web
,会出现一个下拉框选择出现的test-authority-web
- 点击
OK
按钮保存,然后进入配置页 - 点击左侧
流水线
,定位到配置仓库位置,修改Repository URL
的值为当前项目的Git地址 - 脚本路径输入框修改为
Jenkinsfile
值即可 - 点击应用、保存
3.测试应用部署
- 在刚创建的任务里,点击
Build with Parameters
,进入构建页面,继续点击开始构建
即可 - 在左边下发的
Build History
会出现一个进行中的构建,点击可查看具体日志 - 构建成功后,访问K8S
http://172.16.1.232/
(admin/Gj@CbYJihcI#5igy) - 侧边栏找到
名称空间-选择
并点击,点击test-app
名称空间 - 侧边栏找到
应用程序-工作负载
并点击在列表中找到刚刚部署的应用,点击名称进入详情页 - 然后点击顶部栏的
服务
,具体端口如图所示 - 通过
172.16.1.232:PORT
再拼接上接口的详情地址即可访问 - 部署完成
三、设置Webhooks自动构建
1.Jenkins开启Webhooks
- 找到
构建触发器
中Build when a change is pushed to GitLab. GitLab webhook URL: http://172.16.1.247:8080/project/xxx
并勾选(同时把URL复制放到文本编辑器中留存) - 勾选后会有展开内容,在展开内容最后点击
高级...
按钮, - 找到
Secret token
输入框,点击输入框右下角的Generate
,在输入框中会出现一个字符串,把字符串复制到文本编辑器中留存 - 点击
保存
2.Gitlab配置Webhooks
- 进入
Gitlab
项目中,找到设置-Webhooks
- 把之前复制的URL粘贴到网址输入框
- 把之前复制的Secret token值粘贴到Secret token输入框
- 推送事件数据库输入监听的分支名称,如:dev
- 取消勾选SSL验证
- 点击
Add webhook
进行保存
3.验证
在Gitlab中设置-Webhooks
中最下方的Project Hooks
区域,点击测试-Push-event
,然后前往Jenkins中查看Job是否自动创建。