基於騰訊旗下程式碼管理平臺CODING的CI/CD整合
基於騰訊旗下程式碼管理平臺CODING的CI/CD整合
背景
專案是基於springboot+maven+docker部署的,因為不是私有gitlab,所以用drone可能會比較麻煩一點,恰巧看到CODING有提供現成的CI/CD服務,看了一下,發現模板並不能符合我們的需求,所以需要自己單獨做配置。
實現
Dockerfile
FROM anapsix/alpine-java:8_jdk
RUN sed -i 's/dl-cdn.alpinelinux.org/mirror.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
RUN apk add -U tzdata
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
EXPOSE 7101
COPY startServer.sh /app/
RUN chmod +x /app/startServer.sh
COPY deploy/target/app.jar /app/app.jar
WORKDIR /app
ENTRYPOINT ["./startServer.sh"]
startServer.sh
#!/bin/sh
java -server -Xms500M -Xmx1000M -Xss512k \
-Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 -Duser.timezone=Asia/Shanghai \
-Djava.awt.headless=true \
-Djava.security.egd=file:/dev/./urandom \
-jar app.jar
Jenkinsfile
pipeline {
agent any
stages {
stage('檢出') {
steps {
checkout([$class: 'GitSCM',
branches: [[name: GIT_BUILD_REF]],
userRemoteConfigs: [[
url: GIT_REPO_URL,
credentialsId: CREDENTIALS_ID
]]])
}
}
stage('編譯') {
steps {
sh 'mvn clean package'
}
}
stage('修改版本號') {
steps {
sh "mvn versions:set -DnewVersion=${CODING_MAVEN_VERSION}"
}
}
stage('構建映象並推送到 CODING Docker 製品庫') {
steps {
script {
docker.withRegistry(
"${CCI_CURRENT_WEB_PROTOCOL}://${CODING_DOCKER_REG_HOST}",
"${CODING_ARTIFACTS_CREDENTIALS_ID}"
) {
def dockerImage = docker.build("${CODING_DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_VERSION}", "-f ${DOCKERFILE_PATH} ${DOCKER_BUILD_CONTEXT}")
dockerImage.push()
}
}
}
}
stage('部署到遠端服務') {
steps {
script {
def remoteConfig = [:]
remoteConfig.name = "my-remote-server"
remoteConfig.host = "${REMOTE_HOST}"
remoteConfig.port = "${REMOTE_SSH_PORT}".toInteger()
remoteConfig.allowAnyHosts = true
withCredentials([
sshUserPrivateKey(
credentialsId: "${REMOTE_CRED}",
keyFileVariable: "privateKeyFilePath"
),
usernamePassword(
credentialsId: "${CODING_ARTIFACTS_CREDENTIALS_ID}",
usernameVariable: 'CODING_DOCKER_REG_USERNAME',
passwordVariable: 'CODING_DOCKER_REG_PASSWORD'
)
]) {
// SSH 登陸使用者名稱
remoteConfig.user = "${REMOTE_USER_NAME}"
// SSH 私鑰檔案地址
remoteConfig.identityFile = privateKeyFilePath
// 請確保遠端環境中有 Docker 環境
sshCommand(
remote: remoteConfig,
command: "docker login -u ${CODING_DOCKER_REG_USERNAME} -p ${CODING_DOCKER_REG_PASSWORD} ${CODING_DOCKER_REG_HOST}",
sudo: true,
)
sshCommand(
remote: remoteConfig,
command: "docker rm -f app | true",
sudo: true,
)
// DOCKER_IMAGE_VERSION 中涉及到 GIT_LOCAL_BRANCH / GIT_TAG / GIT_COMMIT 的環境變數的使用
// 需要在本地完成拼接後,再傳入到遠端伺服器中使用
DOCKER_IMAGE_URL = sh(
script: "echo ${CODING_DOCKER_REG_HOST}/${CODING_DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_VERSION}",
returnStdout: true
)
sshCommand(
remote: remoteConfig,
command: "docker run -d -p 7101:7101 -e CONFIGURE='test' --name app ${DOCKER_IMAGE_URL}",
sudo: true,
)
echo "部署成功,請到 http://${REMOTE_HOST}:7101 預覽效果"
}
}
}
}
}
environment {
CODING_DOCKER_REG_HOST = "${CCI_CURRENT_TEAM}-docker.pkg.${CCI_CURRENT_DOMAIN}"
CODING_DOCKER_IMAGE_NAME = "${PROJECT_NAME.toLowerCase()}/${DOCKER_REPO_NAME}/${DOCKER_IMAGE_NAME}"
}
}
環境變數
Docker 映象名稱:DOCKER_IMAGE_NAME=app
Docker 構建目錄:DOCKER_BUILD_CONTEXT=.
Docker 映象版本:DOCKER_IMAGE_VERSION=dev-${GIT_COMMIT}
Dockerfile 檔案位置:DOCKERFILE_PATH=Dockerfile
當前專案下的 Docker 製品倉庫名:DOCKER_REPO_NAME=dev
目標服務地址:REMOTE_HOST=127.0.0.1
SSH 登陸憑據:REMOTE_CRED=Coding憑據,需要在頁面配置
SSH 使用者名稱:REMOTE_USER_NAME=root
SSH 埠:REMOTE_SSH_PORT=22
製品庫登入使用者名稱:CODING_DOCKER_REG_USERNAME=dev-1611627313723
製品庫登入密碼:CODING_DOCKER_REG_PASSWORD=8cbbfc1ba07a0e14b39id0bbe54ae7204c978620
然後切換到圖形化編輯器,在開始步驟里加入環境變數
CODING_DOCKER_REG_HOST="
C
C
I
C
U
R
R
E
N
T
T
E
A
M
−
d
o
c
k
e
r
.
p
k
g
.
{CCI_CURRENT_TEAM}-docker.pkg.
CCICURRENTTEAM−docker.pkg.{CCI_CURRENT_DOMAIN}"
CODING_DOCKER_IMAGE_NAME="
P
R
O
J
E
C
T
N
A
M
E
.
t
o
L
o
w
e
r
C
a
s
e
(
)
/
{PROJECT_NAME.toLowerCase()}/
PROJECTNAME.toLowerCase()/{DOCKER_REPO_NAME}/${DOCKER_IMAGE_NAME}"
觸發規則
根據情況配置即可,我配置的是dev節點根據分支規則
^refs/heads/(dev/.*)$
意思是所有dev/開頭的分支推送程式碼時均會執行構建
master節點合併程式碼時觸發