* Update jenkins pipeline.

This commit is contained in:
qishiyao
2023-08-15 15:11:13 +08:00
parent 8fcd7d59f6
commit 8b73e9afae
7 changed files with 613 additions and 227 deletions
+1
View File
@@ -33,3 +33,4 @@ CodeSniffer.conf
test/runtime/*
test/www
!/**/.gitkeep
build/*.gz
Vendored
+239 -210
View File
@@ -20,6 +20,11 @@ pipeline {
SRC_ZENTAOEXT_PATH = "${WORKSPACE}/zentaoext"
MIRROR = "true"
BUILD_BASIC = "true"
PUBLISH_ZIP = "true"
PUBLISH_IMAGE = "true"
PUBLISH_ZBOX = "true"
}
stages {
@@ -35,6 +40,28 @@ pipeline {
agent {
kubernetes {
inheritFrom "zentao-package build-docker xuanim"
yaml '''
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- "k3s-worker01"
containers:
- name: docker
volumeMounts:
- mountPath: /var/run/docker.sock
name: docker-socket
volumes:
- name: docker-socket
hostPath:
path: /var/run/docker.sock
type: Socket
'''
}
}
@@ -110,6 +137,9 @@ pipeline {
}
stage("Build") {
when {
environment name:'BUILD_BASIC', value:'true'
}
stages {
stage("make ciCommon") {
environment {
@@ -170,6 +200,10 @@ pipeline {
returnStdout: true,
script: 'cat ${SRC_ZENTAOEXT_PATH}/MAXVERSION'
).trim()}"""
IPD_VERSION = """${sh(
returnStdout: true,
script: 'cat ${SRC_ZENTAOEXT_PATH}/IPDVERSION'
).trim()}"""
GIT_URL = """${sh(
returnStdout: true,
@@ -224,7 +258,9 @@ pipeline {
stages {
stage("Merge and Upload") {
when {
environment name:'PUBLISH_ZIP', value:'true'
}
matrix {
agent {
kubernetes {
@@ -274,6 +310,7 @@ pipeline {
returnStdout: true,
script: 'test ${ZLANG} = cn && echo -n "int." || echo -n ""'
).trim()}"""
DOWNGRADE_ENABLED = "true"
}
stages {
@@ -305,51 +342,56 @@ pipeline {
type: 'zip']
]
)
nexusArtifactUploader(
nexusVersion: 'nexus3',
protocol: env.ARTIFACT_PROTOCOL,
nexusUrl: env.ARTIFACT_HOST,
groupId: 'zentao.bizPack' + '.' + env.GIT_TAG_BUILD_GROUP,
version: env.BIZ_VERSION,
repository: env.ARTIFACT_REPOSITORY,
credentialsId: env.ARTIFACT_CRED_ID,
artifacts: [
[artifactId: env.ARTIFACT_NAME,
classifier: env.PHPVERSION,
file: env.ZENTAO_RELEASE_PATH + '/biz.zip',
type: 'zip'],
[artifactId: env.ARTIFACT_NAME + '.update',
classifier: env.PHPVERSION,
file: env.ZENTAO_RELEASE_PATH + '/biz.update.zip',
type: 'zip']
]
)
nexusArtifactUploader(
nexusVersion: 'nexus3',
protocol: env.ARTIFACT_PROTOCOL,
nexusUrl: env.ARTIFACT_HOST,
groupId: 'zentao.maxPack' + '.' + env.GIT_TAG_BUILD_GROUP,
version: env.MAX_VERSION,
repository: env.ARTIFACT_REPOSITORY,
credentialsId: env.ARTIFACT_CRED_ID,
artifacts: [
[artifactId: env.ARTIFACT_NAME,
classifier: env.PHPVERSION,
file: env.ZENTAO_RELEASE_PATH + '/max.zip',
type: 'zip'],
[artifactId: env.ARTIFACT_NAME + '.update',
classifier: env.PHPVERSION,
file: env.ZENTAO_RELEASE_PATH + '/max.update.zip',
type: 'zip']
]
)
sh 'mkdir ${OUTPUT_PKG_PATH}/${PMS_VERSION} ${OUTPUT_PKG_PATH}/${BIZ_VERSION} ${OUTPUT_PKG_PATH}/${MAX_VERSION}'
sh 'cp ${ZENTAO_RELEASE_PATH}/base.zip ${OUTPUT_PKG_PATH}/${PMS_VERSION}/${ARTIFACT_NAME}.${PMS_VERSION}.${INT_FLAG}${PHPVERSION}.zip'
sh 'mv ${ZENTAO_RELEASE_PATH}/biz.zip ${OUTPUT_PKG_PATH}/${BIZ_VERSION}/${ARTIFACT_NAME}.${BIZ_VERSION}.${INT_FLAG}${PHPVERSION}.zip'
sh 'mv ${ZENTAO_RELEASE_PATH}/biz.update.zip ${OUTPUT_PKG_PATH}/${BIZ_VERSION}/${ARTIFACT_NAME}.${BIZ_VERSION}.${INT_FLAG}update.${PHPVERSION}.zip'
sh 'mv ${ZENTAO_RELEASE_PATH}/max.zip ${OUTPUT_PKG_PATH}/${MAX_VERSION}/${ARTIFACT_NAME}.${MAX_VERSION}.${INT_FLAG}${PHPVERSION}.zip'
sh 'mv ${ZENTAO_RELEASE_PATH}/max.update.zip ${OUTPUT_PKG_PATH}/${MAX_VERSION}/${ARTIFACT_NAME}.${MAX_VERSION}.${INT_FLAG}update.${PHPVERSION}.zip'
sh 'mkdir ${OUTPUT_PKG_PATH}/${PMS_VERSION}'
sh 'cp ${ZENTAO_RELEASE_PATH}/base.zip ${OUTPUT_PKG_PATH}/${PMS_VERSION}/${ARTIFACT_NAME}-${PMS_VERSION}-${PHPVERSION}.zip'
script {
sh 'env | grep VERSION'
def pkgVersionMap = [
"biz": ["bizPack", env.BIZ_VERSION],
"max": ["maxPack", env.MAX_VERSION],
"ipd": ["ipdPack", env.IPD_VERSION]
]
for (entry in pkgVersionMap.entrySet()) {
echo "set ExtName to ${entry.key}"
def ExtName = entry.key
echo "set SubGroup to ${entry.value[0]}"
def SubGroup = entry.value[0]
echo "set Zversion to ${entry.value[1]}"
def Zversion = entry.value[1]
nexusArtifactUploader(
nexusVersion: 'nexus3',
protocol: env.ARTIFACT_PROTOCOL,
nexusUrl: env.ARTIFACT_HOST,
groupId: 'zentao.' + SubGroup + '.' + env.GIT_TAG_BUILD_GROUP,
version: Zversion,
repository: env.ARTIFACT_REPOSITORY,
credentialsId: env.ARTIFACT_CRED_ID,
artifacts: [
[artifactId: env.ARTIFACT_NAME,
classifier: env.PHPVERSION,
file: env.ZENTAO_RELEASE_PATH + '/' + ExtName + '.zip',
type: 'zip'],
[artifactId: env.ARTIFACT_NAME,
classifier: 'update.' + env.PHPVERSION,
file: env.ZENTAO_RELEASE_PATH + '/' + ExtName + '.update.zip',
type: 'zip']
]
)
sh 'mkdir ${OUTPUT_PKG_PATH}/' + Zversion
def moveCmd1 = String.format('mv ${ZENTAO_RELEASE_PATH}/%s.zip ${OUTPUT_PKG_PATH}/%s/${ARTIFACT_NAME}-%s-${PHPVERSION}.zip', ExtName, Zversion, Zversion)
sh moveCmd1
def moveCmd2 = String.format('mv ${ZENTAO_RELEASE_PATH}/%s.update.zip ${OUTPUT_PKG_PATH}/%s/${ARTIFACT_NAME}-%s-update.${PHPVERSION}.zip', ExtName, Zversion, Zversion)
sh moveCmd2
} // End for loop
}
}
} // End upload zip
@@ -373,8 +415,8 @@ pipeline {
}
steps {
sh 'mv ${ZENTAO_RELEASE_PATH}/zentao.rpm ${OUTPUT_PKG_PATH}/${PMS_VERSION}/${ARTIFACT_NAME}.${PMS_VERSION}.${PHPVERSION}.1.noarch.rpm'
sh 'mv ${ZENTAO_RELEASE_PATH}/zentao.deb ${OUTPUT_PKG_PATH}/${PMS_VERSION}/${ARTIFACT_NAME}.${PMS_VERSION}.${PHPVERSION}.1.all.deb'
sh 'mv ${ZENTAO_RELEASE_PATH}/zentao.rpm ${OUTPUT_PKG_PATH}/${PMS_VERSION}/${ARTIFACT_NAME}-${PMS_VERSION}-${PHPVERSION}-1.noarch.rpm'
sh 'mv ${ZENTAO_RELEASE_PATH}/zentao.deb ${OUTPUT_PKG_PATH}/${PMS_VERSION}/${ARTIFACT_NAME}_${PMS_VERSION}-${PHPVERSION}-1_all.deb'
}
} // End upload syspack cn
@@ -407,6 +449,9 @@ pipeline {
} // End Merge and Upload Max
stage("Notice ZIP") {
when {
environment name:'PUBLISH_ZIP', value:'true'
}
steps {
container('xuanimbot') {
sh 'env | grep GIT'
@@ -418,14 +463,32 @@ pipeline {
}
stage("Docker Image") {
when {
environment name:'PUBLISH_IMAGE', value:'true'
}
agent {
kubernetes {
inheritFrom "dind xuanim"
}
}
environment {
REGISTRY_HOST="hub.zentao.net"
CI_BUILD_PUBLIC_IMAGE="""${sh(
returnStdout: true,
script: 'test "$GIT_TAG_BUILD_TYPE" = release && echo true || echo false'
).trim()}"""
CI_PUBLIC_IMAGE_NAMESPACE="""${sh(
returnStdout: true,
script: "echo $GIT_URL | grep demo/zentao >/dev/null && echo test || echo app"
).trim()}"""
}
stages() {
stage("prepare") {
steps {
sh 'env'
checkout scmGit(branches: [[name: "master"]],
extensions: [cloneOption(depth: 2, noTags: false, reference: '', shallow: true)],
userRemoteConfigs: [[credentialsId: 'git-zcorp-cc-jenkins-bot-http', url: 'https://git.zcorp.cc/app/zentao.git']]
@@ -433,9 +496,6 @@ pipeline {
container('docker') {
sh "sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories"
sh "apk --no-cache add make bash jq git"
sh "docker run --privileged --rm tonistiigi/binfmt --install all"
sh "docker buildx create --name mybuilder --driver docker-container --bootstrap"
sh "docker buildx use mybuilder"
sh "make markdown-init"
}
}
@@ -448,9 +508,13 @@ pipeline {
).trim()}"""
}
steps {
sh 'echo ${ZENTAO_URL}'
container('docker') {
sh 'env | grep ZENTAO'
sh 'make build'
withDockerRegistry(credentialsId: 'hub-qucheng-push', url: 'https://' + env.REGISTRY_HOST) {
sh "docker buildx create --name mybuilder --driver docker-container --bootstrap"
sh "docker buildx use mybuilder"
sh 'make build'
}
}
}
}
@@ -464,9 +528,14 @@ pipeline {
}
steps {
container('docker') {
sh 'make build-biz'
sh 'make build-biz-k8s'
withDockerRegistry(credentialsId: 'hub-qucheng-push', url: 'https://' + env.REGISTRY_HOST) {
sh "docker buildx create --name mybuilder --driver docker-container --bootstrap"
sh "docker buildx use mybuilder"
sh 'make build-biz'
sh 'make build-biz-k8s'
}
}
}
}
@@ -479,8 +548,31 @@ pipeline {
}
steps {
container('docker') {
sh 'make build-max'
sh 'make build-max-k8s'
withDockerRegistry(credentialsId: 'hub-qucheng-push', url: 'https://' + env.REGISTRY_HOST) {
sh "docker buildx create --name mybuilder --driver docker-container --bootstrap"
sh "docker buildx use mybuilder"
sh 'make build-max'
sh 'make build-max-k8s'
}
}
}
}
stage("docker ipd") {
environment {
ZENTAO_URL = """${sh(
returnStdout: true,
script: "echo ${ARTIFACT_PROTOCOL}://${ARTIFACT_HOST}/repository/${ARTIFACT_REPOSITORY}/zentao/ipdPack/`echo ${GIT_TAG_BUILD_GROUP} | tr . /`/ZenTaoPMS"
).trim()}"""
}
steps {
container('docker') {
withDockerRegistry(credentialsId: 'hub-qucheng-push', url: 'https://' + env.REGISTRY_HOST) {
sh "docker buildx create --name mybuilder --driver docker-container --bootstrap"
sh "docker buildx use mybuilder"
sh 'make build-ipd'
sh 'make build-ipd-k8s'
}
}
}
}
@@ -500,7 +592,12 @@ pipeline {
}
} // End Docker Image
stage("Zbox") {
when {
environment name:'PUBLISH_ZBOX', value:'true'
}
agent {
kubernetes {
inheritFrom "xuanim"
@@ -553,78 +650,48 @@ pipeline {
steps {
container('docker') {
sh 'bash build-zbox.sh en win $PMS_VERSION $BIZ_VERSION $MAX_VERSION'
sh 'bash build-zbox.sh zh-cn win $PMS_VERSION $BIZ_VERSION $MAX_VERSION'
sh 'bash build-zbox.sh en win $PMS_VERSION $BIZ_VERSION $MAX_VERSION $IPD_VERSION'
sh 'bash build-zbox.sh zh-cn win $PMS_VERSION $BIZ_VERSION $MAX_VERSION $IPD_VERSION'
sh 'tree ./release'
sh 'cd ./release/zh-cn/$PMS_VERSION/; zip ZenTaoPMS.$PMS_VERSION.zbox.win64.zip ZenTaoPMS.$PMS_VERSION.zbox.win64.exe'
sh 'cd ./release/en/$PMS_VERSION/; zip ZenTaoALM.$PMS_VERSION.int.zbox.win64.zip ZenTaoALM.$PMS_VERSION.int.zbox.win64.exe'
sh 'cd ./release/zh-cn/$BIZ_VERSION/; zip ZenTaoPMS.$BIZ_VERSION.zbox.win64.zip ZenTaoPMS.$BIZ_VERSION.zbox.win64.exe'
sh 'cd ./release/en/$BIZ_VERSION/; zip ZenTaoALM.$BIZ_VERSION.int.zbox.win64.zip ZenTaoALM.$BIZ_VERSION.int.zbox.win64.exe'
sh 'cd ./release/zh-cn/$MAX_VERSION/; zip ZenTaoPMS.$MAX_VERSION.zbox.win64.zip ZenTaoPMS.$MAX_VERSION.zbox.win64.exe'
sh 'cd ./release/en/$MAX_VERSION/; zip ZenTaoALM.$MAX_VERSION.int.zbox.win64.zip ZenTaoALM.$MAX_VERSION.int.zbox.win64.exe'
}
nexusArtifactUploader(
nexusVersion: 'nexus3',
protocol: env.ARTIFACT_PROTOCOL,
nexusUrl: env.ARTIFACT_HOST,
groupId: 'zentao.pmsPack' + '.' + env.GIT_TAG_BUILD_GROUP,
version: env.PMS_VERSION,
repository: env.ARTIFACT_REPOSITORY,
credentialsId: env.ARTIFACT_CRED_ID,
artifacts: [
[artifactId: 'ZenTaoPMS',
classifier: 'zbox.win64',
file: './release/zh-cn/' + PMS_VERSION + '/ZenTaoPMS.' + PMS_VERSION + '.zbox.win64.zip',
type: 'zip'],
[artifactId: 'ZenTaoALM',
classifier: 'zbox.win64',
file: './release/en/' + PMS_VERSION + '/ZenTaoALM.' + PMS_VERSION + '.int.zbox.win64.zip',
type: 'zip']
script {
def pkgVersionMap = [
"pms": ["pmsPack", "${env.PMS_VERSION}"],
"biz": ["bizPack", "${env.BIZ_VERSION}"],
"max": ["maxPack", "${env.MAX_VERSION}"],
"ipd": ["ipdPack", "${env.IPD_VERSION}"]
]
)
nexusArtifactUploader(
nexusVersion: 'nexus3',
protocol: env.ARTIFACT_PROTOCOL,
nexusUrl: env.ARTIFACT_HOST,
groupId: 'zentao.bizPack' + '.' + env.GIT_TAG_BUILD_GROUP,
version: env.BIZ_VERSION,
repository: env.ARTIFACT_REPOSITORY,
credentialsId: env.ARTIFACT_CRED_ID,
artifacts: [
[artifactId: 'ZenTaoPMS',
classifier: 'zbox.win64',
file: './release/zh-cn/' + BIZ_VERSION + '/ZenTaoPMS.' + BIZ_VERSION + '.zbox.win64.zip',
type: 'zip'],
[artifactId: 'ZenTaoALM',
classifier: 'zbox.win64',
file: './release/en/' + BIZ_VERSION + '/ZenTaoALM.' + BIZ_VERSION + '.int.zbox.win64.zip',
type: 'zip']
]
)
for (entry in pkgVersionMap.entrySet()) {
echo "key is ${entry.key}"
def ExtName = entry.key
def SubGroup = entry.value[0]
def Zversion = entry.value[1]
nexusArtifactUploader(
nexusVersion: 'nexus3',
protocol: env.ARTIFACT_PROTOCOL,
nexusUrl: env.ARTIFACT_HOST,
groupId: 'zentao.' + SubGroup + '.' + env.GIT_TAG_BUILD_GROUP,
version: Zversion,
repository: env.ARTIFACT_REPOSITORY,
credentialsId: env.ARTIFACT_CRED_ID,
artifacts: [
[artifactId: 'ZenTaoPMS',
classifier: 'zbox.win64',
file: './release/zh-cn/' + Zversion + '/ZenTaoPMS-' + Zversion + '-zbox.win64.tar.gz',
type: 'tar.gz'],
[artifactId: 'ZenTaoALM',
classifier: 'zbox.win64',
file: './release/en/' + Zversion + '/ZenTaoALM-' + Zversion + '-zbox.win64.tar.gz',
type: 'tar.gz']
]
)
} // End for loop
}
nexusArtifactUploader(
nexusVersion: 'nexus3',
protocol: env.ARTIFACT_PROTOCOL,
nexusUrl: env.ARTIFACT_HOST,
groupId: 'zentao.maxPack' + '.' + env.GIT_TAG_BUILD_GROUP,
version: env.MAX_VERSION,
repository: env.ARTIFACT_REPOSITORY,
credentialsId: env.ARTIFACT_CRED_ID,
artifacts: [
[artifactId: 'ZenTaoPMS',
classifier: 'zbox.win64',
file: './release/zh-cn/' + MAX_VERSION + '/ZenTaoPMS.' + MAX_VERSION + '.zbox.win64.zip',
type: 'zip'],
[artifactId: 'ZenTaoALM',
classifier: 'zbox.win64',
file: './release/en/' + MAX_VERSION + '/ZenTaoALM.' + MAX_VERSION + '.int.zbox.win64.zip',
type: 'zip']
]
)
}
}
@@ -641,11 +708,12 @@ pipeline {
steps {
container('docker') {
sh 'mkdir -pv ./release/upload && cd ./release/upload && mkdir $PMS_VERSION $BIZ_VERSION $MAX_VERSION'
sh 'mkdir -pv ./release/upload && cd ./release/upload && mkdir $PMS_VERSION $BIZ_VERSION $MAX_VERSION $IPD_VERSION'
sh 'tree ./release'
sh "mv `find release/zh-cn/$PMS_VERSION release/en/$PMS_VERSION -type f -name 'ZenTao*.zip'` release/upload/$PMS_VERSION"
sh "mv `find release/zh-cn/$BIZ_VERSION release/en/$BIZ_VERSION -type f -name 'ZenTao*.zip'` release/upload/$BIZ_VERSION"
sh "mv `find release/zh-cn/$MAX_VERSION release/en/$MAX_VERSION -type f -name 'ZenTao*.zip'` release/upload/$MAX_VERSION"
sh "mv `find release/zh-cn/$PMS_VERSION release/en/$PMS_VERSION -type f -name 'ZenTao*.tar.gz'` release/upload/$PMS_VERSION"
sh "mv `find release/zh-cn/$BIZ_VERSION release/en/$BIZ_VERSION -type f -name 'ZenTao*.tar.gz'` release/upload/$BIZ_VERSION"
sh "mv `find release/zh-cn/$MAX_VERSION release/en/$MAX_VERSION -type f -name 'ZenTao*.tar.gz'` release/upload/$MAX_VERSION"
sh "mv `find release/zh-cn/$IPD_VERSION release/en/$IPD_VERSION -type f -name 'ZenTao*.tar.gz'` release/upload/$IPD_VERSION"
}
container('jnlp') {
sh 'qshell account $QINIU_ACCESS_KEY $QINIU_SECRET_KEY uploader'
@@ -690,94 +758,54 @@ pipeline {
stage("Build") {
steps {
container('docker') {
sh 'bash build-zbox.sh zh-cn linux $PMS_VERSION $BIZ_VERSION $MAX_VERSION'
sh 'bash build-zbox.sh en linux $PMS_VERSION $BIZ_VERSION $MAX_VERSION'
sh 'bash build-zbox.sh zh-cn linux $PMS_VERSION $BIZ_VERSION $MAX_VERSION $IPD_VERSION'
sh 'bash build-zbox.sh en linux $PMS_VERSION $BIZ_VERSION $MAX_VERSION $IPD_VERSION'
sh 'tree ./release'
}
nexusArtifactUploader(
nexusVersion: 'nexus3',
protocol: env.ARTIFACT_PROTOCOL,
nexusUrl: env.ARTIFACT_HOST,
groupId: 'zentao.pmsPack' + '.' + env.GIT_TAG_BUILD_GROUP,
version: env.PMS_VERSION,
repository: env.ARTIFACT_REPOSITORY,
credentialsId: env.ARTIFACT_CRED_ID,
artifacts: [
[artifactId: 'ZenTaoPMS',
classifier: 'zbox_amd64',
file: './release/zh-cn/' + PMS_VERSION + '/amd64/ZenTaoPMS.' + PMS_VERSION + '.zbox_amd64.tar.gz',
type: 'tar.gz'],
[artifactId: 'ZenTaoPMS',
classifier: 'zbox_arm64',
file: './release/zh-cn/' + PMS_VERSION + '/arm64/ZenTaoPMS.' + PMS_VERSION + '.zbox_arm64.tar.gz',
type: 'tar.gz'],
[artifactId: 'ZenTaoALM',
classifier: 'zbox_amd64',
file: './release/en/' + PMS_VERSION + '/amd64/ZenTaoALM.' + PMS_VERSION + '.int.zbox_amd64.tar.gz',
type: 'tar.gz'],
[artifactId: 'ZenTaoALM',
classifier: 'zbox_arm64',
file: './release/en/' + PMS_VERSION + '/arm64/ZenTaoALM.' + PMS_VERSION + '.int.zbox_arm64.tar.gz',
type: 'tar.gz']
script {
def pkgVersionMap = [
"pms": ["pmsPack", "${env.PMS_VERSION}"],
"biz": ["bizPack", "${env.BIZ_VERSION}"],
"max": ["maxPack", "${env.MAX_VERSION}"],
"ipd": ["ipdPack", "${env.IPD_VERSION}"]
]
)
nexusArtifactUploader(
nexusVersion: 'nexus3',
protocol: env.ARTIFACT_PROTOCOL,
nexusUrl: env.ARTIFACT_HOST,
groupId: 'zentao.bizPack' + '.' + env.GIT_TAG_BUILD_GROUP,
version: env.BIZ_VERSION,
repository: env.ARTIFACT_REPOSITORY,
credentialsId: env.ARTIFACT_CRED_ID,
artifacts: [
[artifactId: 'ZenTaoPMS',
classifier: 'zbox_amd64',
file: './release/zh-cn/' + BIZ_VERSION + '/amd64/ZenTaoPMS.' + BIZ_VERSION + '.zbox_amd64.tar.gz',
type: 'tar.gz'],
[artifactId: 'ZenTaoPMS',
classifier: 'zbox_arm64',
file: './release/zh-cn/' + BIZ_VERSION + '/arm64/ZenTaoPMS.' + BIZ_VERSION + '.zbox_arm64.tar.gz',
type: 'tar.gz'],
[artifactId: 'ZenTaoALM',
classifier: 'zbox_amd64',
file: './release/en/' + BIZ_VERSION + '/amd64/ZenTaoALM.' + BIZ_VERSION + '.int.zbox_amd64.tar.gz',
type: 'tar.gz'],
[artifactId: 'ZenTaoALM',
classifier: 'zbox_arm64',
file: './release/en/' + BIZ_VERSION + '/arm64/ZenTaoALM.' + BIZ_VERSION + '.int.zbox_arm64.tar.gz',
type: 'tar.gz']
]
)
for (entry in pkgVersionMap.entrySet()) {
echo "key is ${entry.key}"
def ExtName = entry.key
def SubGroup = entry.value[0]
def Zversion = entry.value[1]
nexusArtifactUploader(
nexusVersion: 'nexus3',
protocol: env.ARTIFACT_PROTOCOL,
nexusUrl: env.ARTIFACT_HOST,
groupId: 'zentao.maxPack' + '.' + env.GIT_TAG_BUILD_GROUP,
version: env.MAX_VERSION,
repository: env.ARTIFACT_REPOSITORY,
credentialsId: env.ARTIFACT_CRED_ID,
artifacts: [
[artifactId: 'ZenTaoPMS',
classifier: 'zbox_amd64',
file: './release/zh-cn/' + MAX_VERSION + '/amd64/ZenTaoPMS.' + MAX_VERSION + '.zbox_amd64.tar.gz',
type: 'tar.gz'],
[artifactId: 'ZenTaoPMS',
classifier: 'zbox_arm64',
file: './release/zh-cn/' + MAX_VERSION + '/arm64/ZenTaoPMS.' + MAX_VERSION + '.zbox_arm64.tar.gz',
type: 'tar.gz'],
[artifactId: 'ZenTaoALM',
classifier: 'zbox_amd64',
file: './release/en/' + MAX_VERSION + '/amd64/ZenTaoALM.' + MAX_VERSION + '.int.zbox_amd64.tar.gz',
type: 'tar.gz'],
[artifactId: 'ZenTaoALM',
classifier: 'zbox_arm64',
file: './release/en/' + MAX_VERSION + '/arm64/ZenTaoALM.' + MAX_VERSION + '.int.zbox_arm64.tar.gz',
type: 'tar.gz']
]
)
nexusArtifactUploader(
nexusVersion: 'nexus3',
protocol: env.ARTIFACT_PROTOCOL,
nexusUrl: env.ARTIFACT_HOST,
groupId: 'zentao.' + SubGroup + '.' + env.GIT_TAG_BUILD_GROUP,
version: Zversion,
repository: env.ARTIFACT_REPOSITORY,
credentialsId: env.ARTIFACT_CRED_ID,
artifacts: [
[artifactId: 'ZenTaoPMS',
classifier: 'zbox_amd64',
file: './release/zh-cn/' + Zversion + '/amd64/ZenTaoPMS-' + Zversion + '-zbox_amd64.tar.gz',
type: 'tar.gz'],
[artifactId: 'ZenTaoPMS',
classifier: 'zbox_arm64',
file: './release/zh-cn/' + Zversion + '/arm64/ZenTaoPMS-' + Zversion + '-zbox_arm64.tar.gz',
type: 'tar.gz'],
[artifactId: 'ZenTaoALM',
classifier: 'zbox_amd64',
file: './release/en/' + Zversion + '/amd64/ZenTaoALM-' + Zversion + '-zbox_amd64.tar.gz',
type: 'tar.gz'],
[artifactId: 'ZenTaoALM',
classifier: 'zbox_arm64',
file: './release/en/' + Zversion + '/arm64/ZenTaoALM-' + Zversion + '-zbox_arm64.tar.gz',
type: 'tar.gz']
]
)
} // End for loop
}
}
}
@@ -794,11 +822,12 @@ pipeline {
steps {
container('docker') {
sh 'mkdir -pv ./release/upload && cd ./release/upload && mkdir $PMS_VERSION $BIZ_VERSION $MAX_VERSION'
sh 'mkdir -pv ./release/upload && cd ./release/upload && mkdir $PMS_VERSION $BIZ_VERSION $MAX_VERSION $IPD_VERSION'
sh 'tree ./release'
sh "mv `find release/zh-cn/$PMS_VERSION release/en/$PMS_VERSION -type f -name 'ZenTao*'` release/upload/$PMS_VERSION"
sh "mv `find release/zh-cn/$BIZ_VERSION release/en/$BIZ_VERSION -type f -name 'ZenTao*'` release/upload/$BIZ_VERSION"
sh "mv `find release/zh-cn/$MAX_VERSION release/en/$MAX_VERSION -type f -name 'ZenTao*'` release/upload/$MAX_VERSION"
sh "mv `find release/zh-cn/$IPD_VERSION release/en/$IPD_VERSION -type f -name 'ZenTao*'` release/upload/$IPD_VERSION"
}
container('jnlp') {
sh 'qshell account $QINIU_ACCESS_KEY $QINIU_SECRET_KEY uploader'
@@ -808,6 +837,7 @@ pipeline {
} // End Upload Qiniu
}
} // End Zbox linux
} // End parallel
}
@@ -827,7 +857,6 @@ pipeline {
}
} // End Zbox
}
post {
+11 -6
View File
@@ -272,12 +272,17 @@ ciCommon:
make cleanAssets
zip -rq -9 ZenTaoPMS.$(VERSION).zip zentaopms
# en
cd zentaopms/; grep -rl 'zentao.net'|xargs sed -i 's/zentao.net/zentao.pm/g';
cd zentaopms/; grep -rl 'http://www.zentao.pm'|xargs sed -i 's/http:\/\/www.zentao.pm/https:\/\/www.zentao.pm/g';
cd zentaopms/config/; echo >> config.php; echo '$$config->isINT = true;' >> config.php
mv zentaopms zentaoalm
zip -r -9 ZenTaoALM.$(VERSION).int.zip zentaoalm
rm -fr zentaoalm
cp -a zentaopms zentaoalm
cd zentaoalm/; grep -rl 'zentao.net'|xargs sed -i 's/zentao.net/zentao.pm/g';
cd zentaoalm/; grep -rl 'http://www.zentao.pm'|xargs sed -i 's/http:\/\/www.zentao.pm/https:\/\/www.zentao.pm/g';
cd zentaoalm/config/; echo >> config.php; echo '$$config->isINT = true;' >> config.php
zip -rq -9 ZenTaoALM.$(VERSION).int.zip zentaoalm
# downgrade
./misc/downgrade.sh -p 7.2,7.1,7.0,5.4 -i -r zentaopms framework/ module/*
cp zentaopms/build/downgrade-*.tar.gz $(RELEASE_PATH)
rm -fr zentaopms zentaoalm
# move pms zip to build and release path.
rm -f $(BUILD_PATH)/ZenTao*.zip $(RELEASE_PATH)/ZenTaoPMS.$(VERSION).zip $(RELEASE_PATH)/ZenTaoALM.$(VERSION).int.zip
cp ZenTaoPMS.$(VERSION).zip $(BUILD_PATH)
+15
View File
@@ -0,0 +1,15 @@
{
"require-dev": {
"rector/rector": "0.15.*"
},
"scripts": {
"rector": [
"Composer\\Config::disableProcessTimeout",
"rector process --no-diffs --no-progress-bar"
],
"rector-nocache": [
"Composer\\Config::disableProcessTimeout",
"rector process --no-diffs --no-progress-bar --clear-cache"
]
}
}
+313
View File
@@ -0,0 +1,313 @@
#!/bin/bash
set -e
phpVer="7.4"
installRector="false"
codeRootDir=$PWD
composerDir="$(dirname "$(realpath "$0")")"
helper() {
cat << EOF
Usage: $0 -p version dirs...
Arguments:
-p php版本号,如 7.4
可以指定多个版本,用逗号分隔,如 7.4,7.0,5.4
-i 在 misc 目录执行 composer install, 安装 rector
-r 指定要降级的代码根目录, 默认为当前目录
EOF
}
# 处理命令行参数, 获取要降级的目录
[ $# -eq 0 ] && helper
while getopts "ir:p:" opt; do
case $opt in
"p")
phpVer=$OPTARG
;;
"r")
codeRootDir=$(realpath "$OPTARG")
;;
"i")
installRector="true"
;;
*)
helper
exit 1
;;
esac
done
shift $((OPTIND - 1))
if [ "$#" -eq 0 ];then
echo "need at least one file or directory"
exit 2
fi
# 处理降级目录路径
downGradeDirs=()
for d in "$@"
do
targetDir="$codeRootDir/$d"
test -d "$targetDir" || (echo "$d ($targetDir) is not a directory, abort."; exit 2)
downGradeDirs+=("${targetDir}")
done
# 结束命令行参数处理
excludeRegexList=(
module/holiday/ext/
lib/purifier/HTMLPurifier.autoload-legacy.php
lib/sqlparser/vendor/
)
##################################
# 在非容器环境,返回 cpu 核数减一
# 在容器环境,如未对 cpu 做限制,返回宿主机核数减一,否则按实际限制的 cpu 核数
##################################
quotaFile="/sys/fs/cgroup/cpu.max"
getCpuQuota() {
if [ -f $quotaFile ];then
quota=$(cut -d ' ' -f 1 $quotaFile)
period=$(cut -d ' ' -f 2 $quotaFile)
if [ "$quota" = "max" ];then
echo $(($(nproc)-1))
return
else
echo $((quota/period))
return
fi
else
echo $(($(nproc)-1))
return
fi
}
# 检查要降级版本的 php 命令行是否存在,将用于校验语法
existsPHPCli() {
phpVersion="$1"
which php"${phpVersion}" >/dev/null
}
#########################################
# 执行降级命令
# 参数:
# 1. 降级版本, 如 7.4, 7.0
# 2. 关闭缓存 (可选项), nocache
# 3. 并行执行 (可选项), parallel
# * 降级目录列表
# 说明
# 1. 由于降级命令有可能会发生异常,故设置了重试,
# 在函数运行时,缓存目录不变,故重试时会减少部分时间
# 2. 并行执行的个数,根据 cpu 最大核数减一处理,如果是容器环境,按分配的核数
# 并行执行需要安装 parallel 包
##########################################
maxRectorRetries=3
downGradeDir() {
rectorCmd="rector"
export PHP_VERSION=${1/./}
shift
if [ "$1" = "nocache" ];then
rectorCmd="rector-nocache"
shift
fi
withParallel="false"
if [ "$1" = "parallel" ];then
withParallel="true"
shift
fi
downDirs=("$@")
echo "set PHP_VERSION to $PHP_VERSION"
echo "do downgrade on dir ${downDirs[*]}"
lastDir=$PWD
cd "$composerDir" || exit
rectorResult=0
set +e
for ((i=0;i<maxRectorRetries;i++)) {
if [ "$withParallel" = "true" ];then
quotaCpu=$(getCpuQuota)
parallel -j "$quotaCpu" -k composer "${rectorCmd}" ::: "${downDirs[@]}"
else
composer ${rectorCmd} -- "${downDirs[@]}"
fi
rectorResult="$?"
if [ "$rectorResult" -eq 0 ];then
break
fi
}
set -e
if [ "$rectorResult" -ne 0 ];then
echo "Rector failed"
return $rectorResult
fi
cd "$lastDir" || exit
}
############################
# 校验单个 php 文件语法
# 返回值
# 0 没有语法错误
# 1 语法异常,或是执行时异常
############################
syntaxCheck() {
phpVersion="$1"
phpFilePath="$2"
phpCli=$(which php"${phpVersion}")
$phpCli -l "$phpFilePath" | grep -v 'No syntax errors detected' && return 1 || return 0
}
########################################
# 确保php文件语法正确
# 第一次校验失败后,对文件所在目录执行一次降级
# 再做第二次校验,如继续失败,返回错误
########################################
ensureSyntaxPassed() {
phpVersion="$1"
phpFilePath="$2"
beforeMD5=$(md5sum "$phpFilePath" | awk '{print $1}')
if syntaxCheck "$phpVersion" "$phpFilePath";then
echo "Syntax OK, $phpFilePath"
else
downGradeDir "$phpVersion" "nocache" "$(dirname "$phpFilePath")"
afterMD5=$(md5sum "$phpFilePath" | awk '{print $1}')
if ! syntaxCheck "$phpVersion" "$phpFilePath";then
echo "downgrade failed"
echo "md5 compare (before:$beforeMD5) (after:$afterMD5)"
return 1
else
echo "Syntax OK, $phpFilePath"
fi
fi
}
#########################################
# 将变更的文件打包
# 判断条件为文件修改时间晚于脚本开始执行的时间
#########################################
archiveChangedFiles() {
phpVersion="$1"
pointTime=$2
archiveDir=$3
find "$archiveDir" -type f -newermt "$pointTime" -printf "%P\n" > /tmp/changedFiles
lastDir=$PWD
cd "$archiveDir" || exit 1
mkdir -p build/
downPatchFile="${archiveDir}/build/downgrade-php$phpVersion.tar.gz"
tar zcf "$downPatchFile" --files-from=/tmp/changedFiles
echo "Release downgrade patch file: $downPatchFile"
cd "$lastDir"
}
# 正则匹配要排除的文件,跳过校验
matchExclude() {
filePath="$1"
for reg in "${excludeRegexList[@]}"
do
if [[ "$filePath" =~ $reg ]];then
echo "true"
return
fi
done
echo "false"
}
#############################
# 对单个 php 版本降级的主函数
# 参数:
# 1. php 版本
# 2. 起始时间, 用于比较降级后变更的文件
# * 降级目录列表
# 步骤:
# 设置临时缓存目录,执行降级
# 对降级目录里所有 php 文件校验语法,确保通过
# 打包变更文件
########################################
DownGrade() {
phpVersion="$1"
pointTime="$2"
shift 2
downDirs=("$@")
RECTOR_CACHE_DIR=$(mktemp -d)
export RECTOR_CACHE_DIR
startTime="$(date +%s)"
if which parallel >/dev/null ;then
downGradeDir "$phpVersion" parallel "${downDirs[@]}"
else
for d in "${downDirs[@]}"
do
downGradeDir "$phpVersion" "$d"
done
fi
for f in $(find "${downGradeDirs[@]}" -type f -name '*.php')
do
shouldIgnore=$(matchExclude "$f")
if [ "$shouldIgnore" = "true" ];then
echo "$f is excluded"
continue
fi
ensureSyntaxPassed "$phpVersion" "$f"
done
archiveChangedFiles "$phpVersion" "$pointTime" "$codeRootDir"
test -d "$RECTOR_CACHE_DIR" && rm -rf "$RECTOR_CACHE_DIR"
endTime="$(date +%s)"
echo "downgrade to ${phpVersion} cost $((endTime-startTime)) seconds"
echo
}
# 设置脚本启动时间
startPointTime=$(date +'%Y-%m-%d %H:%M:%S')
# 执行 composer 组件安装
if [ "$installRector" = "true" ];then
lastDir=$PWD
cd "$composerDir" || exit 1
composer config -g repo.packagist composer https://mirrors.cloud.tencent.com/composer/
composer install
cd "$lastDir" || exit 1
fi
# 检查 -p 参数, 执行多版本降级或是单版本降级
if [[ "$phpVer" =~ ^.*, ]];then
IFS=',' read -r -a verList <<< "$phpVer"
for v in "${verList[@]}"
do
existsPHPCli "$v" || (echo "php${v} is not found, abort."; exit 3)
done
for v in "${verList[@]}"
do
DownGrade "$v" "$startPointTime" "${downGradeDirs[@]}"
done
else
existsPHPCli "$phpVer" || (echo "php${phpVer} is not found, abort."; exit 3)
DownGrade "$phpVer" "$startPointTime" "${downGradeDirs[@]}"
fi
# syntaxCheck "$phpVer" /code/module/pipeline/model.php
# downGradeDir "$phpVer" "${downGradeDirs[@]}"
# archiveChangedFiles "$t" "$codeRootDir"
+11 -11
View File
@@ -58,30 +58,30 @@ blankLine
subGroupPath=`echo $GIT_TAG_BUILD_GROUP | sed 's/\./\//'`
outputLine "#### 下载地址"
outputLine "##### 开源版"
outputFrame "[${PMS_VERSION} (中文)](${ARTIFACT_PROTOCOL}://${ARTIFACT_HOST}/service/rest/repository/browse/${ARTIFACT_REPOSITORY}/zentao/pmsPack/$subGroupPath/ZenTaoPMS/${PMS_VERSION}/)"
outputFrame "\t\t"
outputLine "[${PMS_VERSION} (English)](${ARTIFACT_PROTOCOL}://${ARTIFACT_HOST}/service/rest/repository/browse/${ARTIFACT_REPOSITORY}/zentao/pmsPack/$subGroupPath/ZenTaoALM/${PMS_VERSION}/)"
outputLine "##### 企业版"
outputFrame "[${BIZ_VERSION:3} (中文)](${ARTIFACT_PROTOCOL}://${ARTIFACT_HOST}/service/rest/repository/browse/${ARTIFACT_REPOSITORY}/zentao/bizPack/$subGroupPath/ZenTaoPMS/${BIZ_VERSION}/)"
outputFrame "\t\t"
outputLine "[${BIZ_VERSION:3} 升级包 (中文)](${ARTIFACT_PROTOCOL}://${ARTIFACT_HOST}/service/rest/repository/browse/${ARTIFACT_REPOSITORY}/zentao/bizPack/$subGroupPath/ZenTaoPMS.update/${BIZ_VERSION}/)"
outputLine "[${BIZ_VERSION:3} (English)](${ARTIFACT_PROTOCOL}://${ARTIFACT_HOST}/service/rest/repository/browse/${ARTIFACT_REPOSITORY}/zentao/bizPack/$subGroupPath/ZenTaoALM/${BIZ_VERSION}/)"
outputFrame "[${BIZ_VERSION:3} (English)](${ARTIFACT_PROTOCOL}://${ARTIFACT_HOST}/service/rest/repository/browse/${ARTIFACT_REPOSITORY}/zentao/bizPack/$subGroupPath/ZenTaoALM/${BIZ_VERSION}/)"
outputFrame "\t"
outputLine "[${BIZ_VERSION:3} 升级包 (English)](${ARTIFACT_PROTOCOL}://${ARTIFACT_HOST}/service/rest/repository/browse/${ARTIFACT_REPOSITORY}/zentao/bizPack/$subGroupPath/ZenTaoALM.update/${BIZ_VERSION}/)"
outputLine "##### 旗舰版"
outputFrame "[${MAX_VERSION:3} (中文)](${ARTIFACT_PROTOCOL}://${ARTIFACT_HOST}/service/rest/repository/browse/${ARTIFACT_REPOSITORY}/zentao/maxPack/$subGroupPath/ZenTaoPMS/${MAX_VERSION}/)"
outputFrame "\t\t"
outputLine "[${MAX_VERSION:3} 升级包 (中文)](${ARTIFACT_PROTOCOL}://${ARTIFACT_HOST}/service/rest/repository/browse/${ARTIFACT_REPOSITORY}/zentao/maxPack/$subGroupPath/ZenTaoPMS.update/${MAX_VERSION}/)"
outputLine "[${MAX_VERSION:3} (English)](${ARTIFACT_PROTOCOL}://${ARTIFACT_HOST}/service/rest/repository/browse/${ARTIFACT_REPOSITORY}/zentao/maxPack/$subGroupPath/ZenTaoALM/${MAX_VERSION}/)"
outputFrame "[${MAX_VERSION:3} (English)](${ARTIFACT_PROTOCOL}://${ARTIFACT_HOST}/service/rest/repository/browse/${ARTIFACT_REPOSITORY}/zentao/maxPack/$subGroupPath/ZenTaoALM/${MAX_VERSION}/)"
outputFrame "\t"
outputLine "[${MAX_VERSION:3} 升级包 (English)](${ARTIFACT_PROTOCOL}://${ARTIFACT_HOST}/service/rest/repository/browse/${ARTIFACT_REPOSITORY}/zentao/maxPack/$subGroupPath/ZenTaoALM.update/${MAX_VERSION}/)"
if [ -n "$IPD_VERSION" ];then
outputLine "##### IPD版"
outputFrame "[${IPD_VERSION:3} (中文)](${ARTIFACT_PROTOCOL}://${ARTIFACT_HOST}/service/rest/repository/browse/${ARTIFACT_REPOSITORY}/zentao/ipdPack/$subGroupPath/ZenTaoPMS/${IPD_VERSION}/)"
outputFrame "\t\t"
outputLine "[${IPD_VERSION:3} (English)](${ARTIFACT_PROTOCOL}://${ARTIFACT_HOST}/service/rest/repository/browse/${ARTIFACT_REPOSITORY}/zentao/ipdPack/$subGroupPath/ZenTaoALM/${IPD_VERSION}/)"
fi
outputLine "##### 历史版本"
outputLine "[查看历史版本](${ARTIFACT_PROTOCOL}://${ARTIFACT_HOST}/#browse/browse:easycorp-snapshot)"
outputLine "[查看历史版本](${ARTIFACT_PROTOCOL}://${ARTIFACT_HOST}/#browse/browse:${ARTIFACT_REPOSITORY})"
+23
View File
@@ -0,0 +1,23 @@
<?php
use Rector\Config\RectorConfig;
use Rector\Set\ValueObject\DowngradeLevelSetList;
use Rector\Set\ValueObject\DowngradeSetList;
use Rector\Core\ValueObject\PhpVersion;
use Rector\Caching\ValueObject\Storage\FileCacheStorage;
$version = getenv('PHP_VERSION');
$version = $version ?: '72';
$cacheDir = getenv('RECTOR_CACHE_DIR');
$cacheDir = $cacheDir ?: '/tmp/rector_cached_files';
return static function (RectorConfig $rectorConfig) use ($version,$cacheDir): void {
$rectorConfig->skip([
'test/*',
]);
$rectorConfig->phpVersion(constant(PhpVersion::class . '::PHP_' . $version));
$rectorConfig->sets([constant(DowngradeLevelSetList::class . '::DOWN_TO_PHP_' . $version)]);
// $rectorConfig->sets([constant(DowngradeSetList::class . '::PHP_' . $version)]);
$rectorConfig->cacheClass(FileCacheStorage::class);
$rectorConfig->cacheDirectory($cacheDir);
};