pipeline {
agent {
node {
label 'base'
}
}
stages {
stage('clone code') {
steps {
//代码分支
git(url: 'https://git.test.net/xx/test.git', credentialsId: "$DOCKER_CREDENTIAL_ID", branch: 'develop', changelog: true, poll: false)
script {
env.COMMIT_ID = sh(returnStdout: true,script: 'git rev-parse HEAD')
env.COMMIT_MSG = sh(returnStdout: true,script: 'git log -1 --pretty=%B')
env.COMMIT_TIME = sh(returnStdout: true,script: 'git show --pretty=format:"%ci %cr" | head -1')
env.GIT_BRANCH = sh(returnStdout: true,script: 'git rev-parse --abbrev-ref HEAD')
}
sh 'mkdir $GIT_PROJECT_NAME && ls -alh && ls | grep -v $GIT_PROJECT_NAME | xargs && cp -r $(ls | grep -v $GIT_PROJECT_NAME | xargs ) $GIT_PROJECT_NAME'
//部署分支,dockercompose,配置文件等
git(url: 'https://git.test.net/xx/test.git', credentialsId: "$DOCKER_CREDENTIAL_ID", changelog: true, poll: false, branch: 'deploy')
script {
env.COMMIT_ID_CONFIG = sh(returnStdout: true,script: 'git rev-parse HEAD')
env.COMMIT_MSG_DOCKER = sh(returnStdout: true,script: 'git log -1 --pretty=%B')
env.GIT_DOCKER_BRANCH = sh(returnStdout: true,script: 'git rev-parse --abbrev-ref HEAD')
}
sh 'ls -all'
}
}
stage('default-1') {
parallel {
stage('build & push mirrors对内') {
agent none
when {
expression {
TAG_NAME.contains('test')
}
}
steps {
container('base') {
withCredentials([usernamePassword(credentialsId : "$DOCKER_CREDENTIAL_ID" ,passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
sh 'DOCKER_BUILDKIT=1 docker build -f $GIT_PROJECT_NAME/$DOCKERFILE_NAME -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$TAG_NAME .'
sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$TAG_NAME'
}
}
}
}
stage('build对外') {
agent none
when {
expression {
TAG_NAME.contains('v')
}
}
steps {
container('base') {
withCredentials([usernamePassword(credentialsId : "$DOCKER_CREDENTIAL_ID" ,passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY_HUB -u "$DOCKER_USERNAME" --password-stdin'
sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
sh 'DOCKER_BUILDKIT=1 docker build -f $GIT_PROJECT_NAME/$DOCKERFILE_NAME -t $REGISTRY_HUB/$DOCKERHUB_NAMESPACE/$APP_NAME:$TAG_NAME .'
}
}
}
}
}
}
stage('审核') {
agent none
when {
expression {
TAG_NAME.contains('rc') or TAG_NAME.contains('v')
}
}
steps {
timeout(unit: 'HOURS', activity: false, time: 12) {
input(message: "@$AUDIT_ID", submitter: "$AUDIT_ID")
script {
RUN_FLAG = true
}}
}
}
stage('正式发布到hub') {
agent none
when {
expression {
TAG_NAME.contains('v')
}
}
steps {
container('base') {
withCredentials([usernamePassword(credentialsId : "$DOCKER_CREDENTIAL_ID" ,passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,)]) {
sh 'ls -all && pwd'
sh 'echo "流水线id $JOB_NAME">>README.md && echo -n "提交时间 $COMMIT_TIME">>README.md && echo -n "代码版本 ${COMMIT_ID}">>README.md && echo -n "代码分支 ${GIT_BRANCH}">>README.md && echo -n "代码提交说明 ${COMMIT_MSG}">>README.md && echo -n "部署版本 ${COMMIT_ID_CONFIG}">>README.md && echo -n "部署分支 ${GIT_DOCKER_BRANCH}">>README.md'
sh 'cat README.md'
sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY_HUB -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $REGISTRY_HUB/$DOCKERHUB_NAMESPACE/$APP_NAME:$TAG_NAME'
sh 'old_version=`cat docker-compose.yml |grep "image"| grep "$REGISTRY_HUB/$DOCKERHUB_NAMESPACE/$APP_NAME"|sort -u| awk -F: \'{print $3}\'` && sed -i "s#$REGISTRY_HUB/$DOCKERHUB_NAMESPACE/$APP_NAME:$old_version#$REGISTRY_HUB/$DOCKERHUB_NAMESPACE/$APP_NAME:$TAG_NAME#g" docker-compose.yml && cat docker-compose.yml'
sh '''tar -czvf docker-compose-$TAG_NAME.tar.gz README.md docker-compose.yml config
response=$(curl -X POST https://speedcenter.test.net/admin-api/admin/login/sso -H \'Content-Type: application/json\' -d \'{
"username": "\'"$DOCKER_USERNAME"\'",
"password": "\'"$DOCKER_PASSWORD"\'"
}\')
token=$(echo "$response" | grep -o \'"token":"[^"]*\' | cut -d\':\' -f2 | tr -d \'"\')
response_curl=$(curl -X POST -H "Authorization: Bearer $token" -F "file=@docker-compose-$TAG_NAME.tar.gz" -F "prefix=project/$PROJECT_ID/$GIT_PROJECT_NAME" $SPEEDCENTER_API_ADDR)
code=$(echo "$response_curl" | grep -o \'"code":"[^"]*\' | grep -o \'[0-9]*\')
if [ "$code" = "200" ]; then
echo "Code is 200"
else
return 1
fi
'''
sh '''
git config --global user.name $DOCKER_CREDENTIAL_ID
git config --global user.email ${DOCKER_CREDENTIAL_ID}@test.net
git config --local credential.helper "!p() { echo username=\\$DOCKER_USERNAME; echo password=\\$DOCKER_PASSWORD; }; p"
git add docker-compose.yml
git commit -m "docker-compose.yml"
git branch --set-upstream-to=origin/$GIT_DOCKER_BRANCH
git pull
git push -u origin HEAD:$GIT_DOCKER_BRANCH'''
}
}
}
}
stage('只打包配置文件') {
agent none
when {
expression {
TAG_NAME.contains('rc')
}
}
steps {
container('base') {
withCredentials([usernamePassword(credentialsId : "$DOCKER_CREDENTIAL_ID" ,passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,)]) {
sh 'echo "流水线id $JOB_NAME">>README.md && echo -n "提交时间 $COMMIT_TIME">>README.md && echo -n "代码版本 ${COMMIT_ID}">>README.md && echo -n "代码分支 ${GIT_BRANCH}">>README.md && echo -n "代码提交说明 ${COMMIT_MSG}">>README.md && echo -n "部署版本 ${COMMIT_ID_CONFIG}">>README.md && echo -n "部署分支 ${GIT_DOCKER_BRANCH}">>README.md'
sh '''tar -czvf docker-compose-$TAG_NAME.tar.gz README.md docker-compose.yml config
response=$(curl -X POST https://xx.test.net/admin-api/admin/login/sso -H \'Content-Type: application/json\' -d \'{
"username": "\'"$DOCKER_USERNAME"\'",
"password": "\'"$DOCKER_PASSWORD"\'"
}\')
token=$(echo "$response" | grep -o \'"token":"[^"]*\' | cut -d\':\' -f2 | tr -d \'"\')
response_curl=$(curl -X POST -H "Authorization: Bearer $token" -F "file=@docker-compose-$TAG_NAME.tar.gz" -F "prefix=project/$PROJECT_ID/$GIT_PROJECT_NAME" $SPEEDCENTER_API_ADDR)
code=$(echo "$response_curl" | grep -o \'"code":"[^"]*\' | grep -o \'[0-9]*\')
if [ "$code" = "200" ]; then
echo "Code is 200"
else
return 1
fi
'''
}
}
}
}
}
environment {
//用户账号
DOCKER_CREDENTIAL_ID = ''
//审核用户账号
AUDIT_ID = ''
KUBECONFIG_CREDENTIAL_ID = ''
//内部镜像仓库,开发测试仓库
REGISTRY = 'xx'
//对外镜像仓库,创建项目要规范
REGISTRY_HUB = 'xx'
//仓库名字,跟speedcenter项目编号绑定
DOCKERHUB_NAMESPACE = 'xx0121019'
//必须跟dockercompose.yml里面的镜像版本号前面一段一样
APP_NAME = 'smallstack-agent-bin'
//docker路径和名字
DOCKERFILE_NAME = '/doc/dockerfile/Dockerfile'
//项目名字与git仓库一样
GIT_PROJECT_NAME = 'xx'
SONAR_CREDENTIAL_ID = 'sonar-token'
//项目编号,跟speedcenter绑定
PROJECT_ID = 'xxxx'
SPEEDCENTER_API_ADDR = 'https://xx.test.net/admin-api/project/software/upload'
SPEEDCENTER_API_LOGIN = 'https://xx.test.net/admin-api/admin/login/sso'
}
}