前置条件
此篇文档是以已经安装并配置好Choerodon、Gitlab,Gitlab-Runner的基础上进行讲解。
如需进行学习Gitlab CI文件如何编写请参考官方文档
Choerodon中CI文件详解
与Choerodon集成
- 通过Choerodon创建应用后,在Gitlab中将自动会对应创建一个Git仓库,并且会在该仓库的CI Secret中添加一个
Token
,它是Choerodon给该Git仓库的唯一标识,请勿更改。 - 下面curl语句最主要是进行获取环境变量以及一些固定的函数。
CHOERODON_URL
为Choerodon的API地址,此项建议环境变量配置在Runner中。type
的值有microservice
、front
、lib
,分别对应java后端应用,前端,java库。
.auto_devops: &auto_devops |
http_status_code=`curl -o .auto_devops.sh -s -m 10 --connect-timeout 10 -w %{http_code} "${CHOERODON_URL}/devops/ci?token=${Token}"`
if [ "$http_status_code" != "200" ]; then
cat .auto_devops.sh
exit 1
fi
source .auto_devops.sh
before_script:
- *auto_devops
.auto_devops.sh详解
- 上述语句就是在CI的每个JOB运行后立即请求
.auto_devops.sh
脚本,脚本中有该项目的相关变量和一些封装的函数。
C7N_COMMIT_TIMESTAMP=$(git log -1 --pretty=format:"%ci"| awk '{print $1$2}' | sed 's/[-:]//g')
C7N_COMMIT_YEAR=${C7N_COMMIT_TIMESTAMP:0:4}
C7N_COMMIT_MONTH=$(echo ${C7N_COMMIT_TIMESTAMP:4:2} | sed s'/^0//')
C7N_COMMIT_DAY=$(echo ${C7N_COMMIT_TIMESTAMP:6:2} | sed s'/^0//')
C7N_COMMIT_HOURS=${C7N_COMMIT_TIMESTAMP:8:2}
C7N_COMMIT_MINUTES=${C7N_COMMIT_TIMESTAMP:10:2}
C7N_COMMIT_SECONDS=${C7N_COMMIT_TIMESTAMP:12:2}
export C7N_COMMIT_TIME=$C7N_COMMIT_YEAR.$C7N_COMMIT_MONTH.$C7N_COMMIT_DAY-$C7N_COMMIT_HOURS$C7N_COMMIT_MINUTES$C7N_COMMIT_SECONDS
# 8位sha值
export C7N_COMMIT_SHA=$(git log -1 --pretty=format:"%H" | awk '{print substr($1,1,8)}')
# 获取的项目名称
export GROUP_NAME={{ GROUP_NAME }}
# 获取的应用名称
export PROJECT_NAME={{ PROJECT_NAME }}
# 分支名
if [ $CIRCLECI ]; then
export C7N_BRANCH=$(echo $CIRCLE_BRANCH | tr '[A-Z]' '[a-z]' | tr '[:punct:]' '-')
elif [ $GITLAB_CI ]; then
export C7N_BRANCH=$CI_COMMIT_REF_SLUG
fi
# 默认Version
if [ $CI_COMMIT_TAG ]; then
export C7N_VERSION=$CI_COMMIT_TAG
elif [ $CIRCLE_TAG ]; then
export C7N_VERSION=$CIRCLE_TAG
else
export C7N_VERSION=$C7N_COMMIT_TIME-$C7N_BRANCH
fi
export CI_COMMIT_TAG=$C7N_VERSION
# 更新maven项目本版本号
function update_pom_version(){
mvn versions:set -DnewVersion=${CI_COMMIT_TAG} || \
find . -name pom.xml | xargs xml ed -L \
-N x=http://maven.apache.org/POM/4.0.0 \
-u '/x:project/x:version' -v "${CI_COMMIT_TAG}"
mvn versions:commit
}
# 测试分支合并到指定分支,比如合并到master:git_merge master,默认合并到develop
function git_merge(){
git config user.name ${GITLAB_USER_NAME}
git config user.email ${GITLAB_USER_EMAIL}
git checkout origin/${1:-"develop"}
git merge ${CI_COMMIT_SHA} --no-commit --no-ff
}
# 此项为上传构建并上传chart包到Choerodon中,只有通过此函数Choerodon才会有相应版本记录。
function chart_build(){
# 查找Chart.yaml文件
CHART_PATH=`find . -maxdepth 3 -name Chart.yaml`
# 重置values.yaml文件中image.repository属性
sed -i "s,repository:.*$,repository: ${DOCKER_REGISTRY}/${GROUP_NAME}/${PROJECT_NAME},g" ${CHART_PATH%/*}/values.yaml
# 构建chart包,重写version与app-version为当前版本
helm package ${CHART_PATH%/*} --version ${CI_COMMIT_TAG} --app-version ${CI_COMMIT_TAG}
TEMP=${CHART_PATH%/*}
FILE_NAME=${TEMP##*/}
# 通过Choerodon API上传chart包
curl --fail -X POST \
-F "token=${Token}" \
-F "version=${CI_COMMIT_TAG}" \
-F "file=@${FILE_NAME}-${CI_COMMIT_TAG}.tgz" \
-F "commit=${CI_COMMIT_SHA}" \
-F "image=${DOCKER_REGISTRY}/${GROUP_NAME}/${PROJECT_NAME}:${CI_COMMIT_TAG}" \
"${CHOERODON_URL}/devops/ci"
}