前置条件

此篇文档是以已经安装并配置好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. }