1. 程式人生 > 其它 >基於騰訊旗下程式碼管理平臺CODING的CI/CD整合

基於騰訊旗下程式碼管理平臺CODING的CI/CD整合

技術標籤:docker騰訊git

基於騰訊旗下程式碼管理平臺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. CCICURRENTTEAMdocker.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節點合併程式碼時觸發