Commit b9b2a521 authored by 智勇's avatar 智勇

Merge branch 'latest' into 'master'

定时更新latest



See merge request !30
parents 8e6b7056 4cee0479
...@@ -14,6 +14,7 @@ const repositoryRouter = require('./repository') ...@@ -14,6 +14,7 @@ const repositoryRouter = require('./repository')
const tag = require('./tag') const tag = require('./tag')
const commonServiceRoute = require('./commonService') const commonServiceRoute = require('./commonService')
const ingressRoute = require('./ingress') const ingressRoute = require('./ingress')
const deploy = require('./restartLatest')
const logFormat = ':req[x-real-ip] :req[x-forwarded-for] - -' const logFormat = ':req[x-real-ip] :req[x-forwarded-for] - -'
+ ' ":method :url HTTP/:http-version"' + ' ":method :url HTTP/:http-version"'
...@@ -53,6 +54,7 @@ exports.start = function () { ...@@ -53,6 +54,7 @@ exports.start = function () {
schedule('0 */1 * * * ?') schedule('0 */1 * * * ?')
// 加载所有路由 // 加载所有路由
loadRoutes(router) loadRoutes(router)
deploy()
app.use(log4js.koaLogger(log4js.getLogger('http'), { level: 'auto', format: logFormat })) app.use(log4js.koaLogger(log4js.getLogger('http'), { level: 'auto', format: logFormat }))
app.use(router.routes()) app.use(router.routes())
app.listen(4000) app.listen(4000)
......
const schedule = require('node-schedule')
const _ = require('lodash')
const sleep = require('sleep')
const logger = require('koa-log4').getLogger('deployLatest')
const cluster = require('../services/tke.clusterService').create()
const container = require('../services/tke.containerService').create()
const { getServiceDetail, serviceRestart, getServicesFormat } = require('../kubeService/service')
const keepNamespace = ['default', 'kube-system']
const repoNS = ['qa-java', 'qa-ui', 'qa-node', 'qa-python']
const testNamespace = ['qa', 'fe', 'data', 'fis', 'xyqb2']
const deploy = async () => {
logger.info('deployLatest start')
for (const ns of repoNS) {
const repoNSData = await container.repository_get(ns)
for (const repo of repoNSData.repoInfo) {
logger.info('开始检查仓库项目:', repo.reponame)
const repoName = repo.reponame.split('/')[1]
const repoType = repo.reponame.split('/')[0].split('-')[1]
const latest = await container.getTagByName(repo.reponame, 'latest')
const latestImageID = _.get(latest.tagInfo, '[0].tagId', '')
let ns = await cluster.namespace_get()
ns = ns.namespaces && ns.namespaces.filter(item => testNamespace.includes(item.name))
for (const namespace of ns) {
const svcs = await getServicesFormat(namespace.name)
for (const svc of svcs) {
if (svc.serviceName === repoName && svc.image.indexOf('latest') !== -1) {
const data = await getServiceDetail(namespace.name, repoName, repoType)
if (latestImageID !== data.imageID.split('@')[1]) {
logger.info('部署项目', namespace.name, data.podName)
await serviceRestart(namespace.name, data.podName)
sleep.msleep(500)
}
}
}
}
logger.info('仓库项目检查完毕:', repo.reponame)
}
}
logger.info('deployLatest end')
}
module.exports = () => {
schedule.scheduleJob('0 2 * * *', async () => {
try {
await deploy()
} catch (e) {
logger.info('deployLatest', e)
}
});
}
...@@ -6,7 +6,6 @@ const moment = require('moment') ...@@ -6,7 +6,6 @@ const moment = require('moment')
const yaml = require('js-yaml') const yaml = require('js-yaml')
const logger = require('koa-log4').getLogger('kubeService') const logger = require('koa-log4').getLogger('kubeService')
const yamls = require('../yamls') const yamls = require('../yamls')
const dict = require('./dictService')
const client = new Client({ const client = new Client({
config: config.fromKubeconfig( config: config.fromKubeconfig(
...@@ -88,7 +87,7 @@ const serviceUpdate = async (data) => { ...@@ -88,7 +87,7 @@ const serviceUpdate = async (data) => {
for (const item of yamlArray) { for (const item of yamlArray) {
const jsonObj = yaml.load(item); const jsonObj = yaml.load(item);
if (jsonObj.kind === 'Deployment') { if (jsonObj.kind === 'Deployment') {
logger.info('Deployment:', JSON.stringify(jsonObj)) logger.info('更新deploy:', JSON.stringify(jsonObj))
await client.apis.apps.v1beta1.namespaces(namespace).deployments(serviceName).put({ body: jsonObj }) await client.apis.apps.v1beta1.namespaces(namespace).deployments(serviceName).put({ body: jsonObj })
} }
} }
...@@ -96,9 +95,11 @@ const serviceUpdate = async (data) => { ...@@ -96,9 +95,11 @@ const serviceUpdate = async (data) => {
const formatServiceInfo = (obj) => { const formatServiceInfo = (obj) => {
const portObj = {} const portObj = {}
obj.spec.ports.forEach((i) => { if (obj.spec.type === 'NodePort') {
portObj[`${i.name}_port`] = i.nodePort obj.spec.ports.forEach((i) => {
}) portObj[`port_${i.port}`] = i.nodePort
})
}
return _.assign(portObj, { return _.assign(portObj, {
clusterIp: obj.spec.clusterIP, clusterIp: obj.spec.clusterIP,
...@@ -132,8 +133,8 @@ const formatPodInfo = (podInfo) => { ...@@ -132,8 +133,8 @@ const formatPodInfo = (podInfo) => {
// } // }
const podStatus = getPodStatus(podInfo) const podStatus = getPodStatus(podInfo)
// const containerImage = _.get(podInfo.status.containerStatuses, '[0].image', '') const imageID = _.get(podInfo.status.containerStatuses, '[0].imageID', '')
const containerImage = _.get(podInfo.spec.containers, '[0].image', '') const image = _.get(podInfo.spec.containers, '[0].image', '')
const ret = { const ret = {
serviceName: (podInfo.metadata.labels && podInfo.metadata.labels['qcloud-app']) || podInfo.metadata.name, serviceName: (podInfo.metadata.labels && podInfo.metadata.labels['qcloud-app']) || podInfo.metadata.name,
...@@ -143,14 +144,13 @@ const formatPodInfo = (podInfo) => { ...@@ -143,14 +144,13 @@ const formatPodInfo = (podInfo) => {
lanIp: podInfo.status.hostIP, lanIp: podInfo.status.hostIP,
startTime: podInfo.status.startTime, startTime: podInfo.status.startTime,
createdAt: moment(new Date(podInfo.status.startTime)).startOf('minute').fromNow(), createdAt: moment(new Date(podInfo.status.startTime)).startOf('minute').fromNow(),
image: containerImage, image,
imageID,
labels: podInfo.metadata.labels, labels: podInfo.metadata.labels,
} }
if (containerImage !== '') { if (image !== '') {
ret.branch = containerImage.split(':')[1] ret.branch = image.split(':')[1]
ret.branch_no_time = containerImage.split(':')[1].split('-')[0]
ret.branch_time = containerImage.split(':')[1].split('-')[1]
} }
return ret return ret
...@@ -221,6 +221,7 @@ const getServiceDetail = async (namespace, name, type) => { ...@@ -221,6 +221,7 @@ const getServiceDetail = async (namespace, name, type) => {
} }
const serviceRestart = async (namespace, name) => { const serviceRestart = async (namespace, name) => {
logger.info('重置服务', namespace, name)
await client.api.v1.namespaces(namespace).pods(name).delete() await client.api.v1.namespaces(namespace).pods(name).delete()
} }
......
...@@ -4133,6 +4133,21 @@ ...@@ -4133,6 +4133,21 @@
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
"dev": true "dev": true
}, },
"sleep": {
"version": "6.1.0",
"resolved": "http://npmprivate.quantgroups.com/sleep/-/sleep-6.1.0.tgz",
"integrity": "sha512-Z1x4JjJxsru75Tqn8F4tnOFeEu3HjtITTsumYUiuz54sGKdISgLCek9AUlXlVVrkhltRFhNUsJDJE76SFHTDIQ==",
"requires": {
"nan": "^2.13.2"
},
"dependencies": {
"nan": {
"version": "2.14.0",
"resolved": "http://npmprivate.quantgroups.com/nan/-/nan-2.14.0.tgz",
"integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg=="
}
}
},
"slice-ansi": { "slice-ansi": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "http://npmprivate.quantgroups.com/slice-ansi/-/slice-ansi-2.1.0.tgz", "resolved": "http://npmprivate.quantgroups.com/slice-ansi/-/slice-ansi-2.1.0.tgz",
......
...@@ -16,7 +16,8 @@ ...@@ -16,7 +16,8 @@
"lru-cache": "^5.1.1", "lru-cache": "^5.1.1",
"moment": "^2.24.0", "moment": "^2.24.0",
"node-schedule": "^1.3.2", "node-schedule": "^1.3.2",
"request": "^2.88.0" "request": "^2.88.0",
"sleep": "^6.1.0"
}, },
"devDependencies": { "devDependencies": {
"eslint": "^5.15.3", "eslint": "^5.15.3",
......
...@@ -15,6 +15,10 @@ class Container extends Client { ...@@ -15,6 +15,10 @@ class Container extends Client {
return this.post('GetTagList', { reponame }) return this.post('GetTagList', { reponame })
} }
getTagByName(reponame, tag) {
return this.post('GetTagList', { reponame, tag })
}
getNamespaceInfo(namespace) { getNamespaceInfo(namespace) {
return this.post('GetNamespaceInfo', { namespace, limit: 50 }) return this.post('GetNamespaceInfo', { namespace, limit: 50 })
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment