前置条件

此篇文档是以已经安装并配置好Choerodon、Gitlab,Gitlab-Runner的基础上进行讲解。

如需进行学习Gitlab CI文件如何编写请参考官方文档

Choerodon中CI文件详解

与Choerodon集成

  • 通过Choerodon创建应用后,在Gitlab中将自动会对应创建一个Git仓库,并且会在该仓库的CI Secret中添加一个Token,它是Choerodon给该Git仓库的唯一标识,请勿更改。
  • 下面curl语句最主要是进行获取环境变量以及一些固定的函数。
  • CHOERODON_URL为Choerodon的API地址,此项建议环境变量配置在Runner中。
  • type的值有microservicefrontlib,分别对应java后端应用,前端,java库。
  1. .auto_devops: &auto_devops |
  2. http_status_code=`curl -o .auto_devops.sh -s -m 10 --connect-timeout 10 -w %{http_code} "${CHOERODON_URL}/devops/ci?token=${Token}"`
  3. if [ "$http_status_code" != "200" ]; then
  4. cat .auto_devops.sh
  5. exit 1
  6. fi
  7. source .auto_devops.sh
  8. before_script:
  9. - *auto_devops

.auto_devops.sh详解

  • 上述语句就是在CI的每个JOB运行后立即请求.auto_devops.sh脚本,脚本中有该项目的相关变量和一些封装的函数。
  1. C7N_COMMIT_TIMESTAMP=$(git log -1 --pretty=format:"%ci"| awk '{print $1$2}' | sed 's/[-:]//g')
  2. C7N_COMMIT_YEAR=${C7N_COMMIT_TIMESTAMP:0:4}
  3. C7N_COMMIT_MONTH=$(echo ${C7N_COMMIT_TIMESTAMP:4:2} | sed s'/^0//')
  4. C7N_COMMIT_DAY=$(echo ${C7N_COMMIT_TIMESTAMP:6:2} | sed s'/^0//')
  5. C7N_COMMIT_HOURS=${C7N_COMMIT_TIMESTAMP:8:2}
  6. C7N_COMMIT_MINUTES=${C7N_COMMIT_TIMESTAMP:10:2}
  7. C7N_COMMIT_SECONDS=${C7N_COMMIT_TIMESTAMP:12:2}
  8. export C7N_COMMIT_TIME=$C7N_COMMIT_YEAR.$C7N_COMMIT_MONTH.$C7N_COMMIT_DAY-$C7N_COMMIT_HOURS$C7N_COMMIT_MINUTES$C7N_COMMIT_SECONDS
  9. # 8位sha值
  10. export C7N_COMMIT_SHA=$(git log -1 --pretty=format:"%H" | awk '{print substr($1,1,8)}')
  11. # 获取的项目名称
  12. export GROUP_NAME={{ GROUP_NAME }}
  13. # 获取的应用名称
  14. export PROJECT_NAME={{ PROJECT_NAME }}
  15. # 分支名
  16. if [ $CIRCLECI ]; then
  17. export C7N_BRANCH=$(echo $CIRCLE_BRANCH | tr '[A-Z]' '[a-z]' | tr '[:punct:]' '-')
  18. elif [ $GITLAB_CI ]; then
  19. export C7N_BRANCH=$CI_COMMIT_REF_SLUG
  20. fi
  21. # 默认Version
  22. if [ $CI_COMMIT_TAG ]; then
  23. export C7N_VERSION=$CI_COMMIT_TAG
  24. elif [ $CIRCLE_TAG ]; then
  25. export C7N_VERSION=$CIRCLE_TAG
  26. else
  27. export C7N_VERSION=$C7N_COMMIT_TIME-$C7N_BRANCH
  28. fi
  29. export CI_COMMIT_TAG=$C7N_VERSION
  30. # 更新maven项目本版本号
  31. function update_pom_version(){
  32. mvn versions:set -DnewVersion=${CI_COMMIT_TAG} || \
  33. find . -name pom.xml | xargs xml ed -L \
  34. -N x=http://maven.apache.org/POM/4.0.0 \
  35. -u '/x:project/x:version' -v "${CI_COMMIT_TAG}"
  36. mvn versions:commit
  37. }
  38. # 测试分支合并到指定分支,比如合并到master:git_merge master,默认合并到develop
  39. function git_merge(){
  40. git config user.name ${GITLAB_USER_NAME}
  41. git config user.email ${GITLAB_USER_EMAIL}
  42. git checkout origin/${1:-"develop"}
  43. git merge ${CI_COMMIT_SHA} --no-commit --no-ff
  44. }
  45. # 此项为上传构建并上传chart包到Choerodon中,只有通过此函数Choerodon才会有相应版本记录。
  46. function chart_build(){
  47. # 查找Chart.yaml文件
  48. CHART_PATH=`find . -maxdepth 3 -name Chart.yaml`
  49. # 重置values.yaml文件中image.repository属性
  50. sed -i "s,repository:.*$,repository: ${DOCKER_REGISTRY}/${GROUP_NAME}/${PROJECT_NAME},g" ${CHART_PATH%/*}/values.yaml
  51. # 构建chart包,重写version与app-version为当前版本
  52. helm package ${CHART_PATH%/*} --version ${CI_COMMIT_TAG} --app-version ${CI_COMMIT_TAG}
  53. TEMP=${CHART_PATH%/*}
  54. FILE_NAME=${TEMP##*/}
  55. # 通过Choerodon API上传chart包
  56. curl --fail -X POST \
  57. -F "token=${Token}" \
  58. -F "version=${CI_COMMIT_TAG}" \
  59. -F "file=@${FILE_NAME}-${CI_COMMIT_TAG}.tgz" \
  60. -F "commit=${CI_COMMIT_SHA}" \
  61. -F "image=${DOCKER_REGISTRY}/${GROUP_NAME}/${PROJECT_NAME}:${CI_COMMIT_TAG}" \
  62. "${CHOERODON_URL}/devops/ci"
  63. }