首页 编程笔记

drone 的流水线操作配置文件

pyweeX 发布于 07-05
编程笔记
pyweeX

配了两天关于 drone 的流水线文件,这个支持回滚操作,暂时不算完美。

这里面有几个十分关键的点要注意,一个是超时重试。我在正常的构建中,分的流程比较多,常常会出现超时的情况,而事情已经做到一半了,所以有时候因为超时中断导致原先的服务已断开,新的起不来。

通过这几行代码加入超时

  1. ...
  2. retry:
  3. limit: 2
  4. delay: 25s
  5. ...

需要特别注意,如果是将 secret 传入到基于 ssh 连接的服务器中时,变量不会生效。要操作这三步才会生效:

  1. # 第一步,在environment中声明
  2. environment:
  3. PROJECT_API_NAME:
  4. from_secret: PROJECT_API_NAME
  5. # 第二步,在 envs 中将这个变量加进去
  6. envs: [PROJECT_API_NAME]
  7. # 第三步,在scripts中调用时,写法为
  8. script:
  9. - echo $${PROJECT_API_NAME}

做到上述配置之后,最终执行时,drone自带的控制面板会以 ** 替代变量的值


整个pipeline可通过定义 trigger 来决定何时触发部署,也可以将 tigger 放在某一个 step 中。其中要特别注意 event,它可以使用 includeexclude 来配置包含和排除。其中的 custom 表示手动触发的情况。

  1. trigger:
  2. branch:
  3. - master
  4. - develop
  5. event:
  6. include:
  7. - custom
  8. - merge_request
  9. - push

完整例子

  1. kind: pipeline
  2. type: docker
  3. name: service-deploy
  4. steps:
  5. - name: CI
  6. image: docker:git
  7. environment:
  8. PROJECT_API_NAME:
  9. from_secret: PROJECT_API_NAME
  10. PROJECT_RPC_NAME:
  11. from_secret: PROJECT_RPC_NAME
  12. DOMAIN_PREFIX:
  13. from_secret: DOMAIN_PREFIX
  14. commands:
  15. - export DOCKER_TAG=prod_${DRONE_COMMIT:0:10}
  16. - docker build -f api/Dockerfile -t $PROJECT_API_NAME:latest .
  17. - docker tag $PROJECT_API_NAME:latest harbor.xxx.com/kkkk/$PROJECT_API_NAME:${DRONE_COMMIT:0:10}
  18. - docker login harbor.xxx.com -u admin -p xxx
  19. - docker push harbor.xxx.com/kkkk/$PROJECT_API_NAME:${DRONE_COMMIT:0:10}
  20. - echo "API构建完成, 你可以通过 docker pull harbor.xxx.com/kkkk/$PROJECT_API_NAME:${DRONE_COMMIT:0:10} 获取镜像"
  21. - |
  22. if [ -d "rpc" ]; then
  23. docker build -f rpc/Dockerfile -t $PROJECT_RPC_NAME:latest .
  24. docker tag $PROJECT_RPC_NAME:latest harbor.xxx.com/kkkk/$PROJECT_RPC_NAME:${DRONE_COMMIT:0:10}
  25. docker push harbor.xxx.com/kkkk/$PROJECT_RPC_NAME:${DRONE_COMMIT:0:10}
  26. echo "RPC构建完成, 你可以通过 docker pull harbor.xxx.com/kkkk/$PROJECT_RPC_NAME:${DRONE_COMMIT:0:10} 获取镜像"
  27. fi
  28. volumes:
  29. - name: docker-sock
  30. path: /var/run/docker.sock
  31. when:
  32. branch:
  33. - develop
  34. - master
  35. retry:
  36. limit: 2
  37. delay: 10m
  38. - name: stage-publish
  39. image: appleboy/drone-ssh
  40. environment:
  41. STAGE_DOMAIN_PREFIX:
  42. from_secret: STAGE_DOMAIN_PREFIX
  43. PROJECT_API_NAME:
  44. from_secret: PROJECT_API_NAME
  45. PROJECT_RPC_NAME:
  46. from_secret: PROJECT_RPC_NAME
  47. settings:
  48. host:
  49. from_secret: STAGE_HOST_IP
  50. username:
  51. from_secret: STAGE_HOST_NAME
  52. password:
  53. from_secret: STAGE_HOST_PWD
  54. port: 22
  55. command_timeout: 360s
  56. envs: [PROJECT_API_NAME,STAGE_DOMAIN_PREFIX,PROJECT_RPC_NAME]
  57. script:
  58. - cd /home/kkkk/app_project/${DRONE_REPO_NAME}
  59. - cat ./docker-compose.yml
  60. #- git pull https://userName:userPwd@gitea.xxx.com/path/${DRONE_REPO_NAME}.git
  61. #- docker login harbor.xxx.com -u admin -p xxx
  62. - git pull origin
  63. - git branch
  64. - git fetch origin
  65. - git checkout develop
  66. - docker-compose down
  67. - export DOMAIN_PREFIX=$${STAGE_DOMAIN_PREFIX}
  68. - export GIT_COMMIT=${DRONE_COMMIT:0:10}
  69. - export ENV=""
  70. - docker images | grep $${PROJECT_RPC_NAME} | awk '{print $3}' | xargs docker rmi -f
  71. - docker images | grep $${PROJECT_API_NAME} | awk '{print $3}' | xargs docker rmi -f
  72. - docker-compose up -d
  73. #- echo "CI构建完成 ${DRONE_COMMIT_MESSAGE} ${DRONE_COMMIT:0:10}"
  74. when:
  75. branch:
  76. - develop
  77. - name: prod-publish
  78. image: appleboy/drone-ssh
  79. environment:
  80. PROD_DOMAIN_PREFIX:
  81. from_secret: PROD_DOMAIN_PREFIX
  82. PROJECT_API_NAME:
  83. from_secret: PROJECT_API_NAME
  84. PROJECT_RPC_NAME:
  85. from_secret: PROJECT_RPC_NAME
  86. settings:
  87. host:
  88. from_secret: PROD_HOST_IP
  89. username:
  90. from_secret: PROD_HOST_NAME
  91. password:
  92. from_secret: PROD_HOST_PWD
  93. port: 22
  94. command_timeout: 360s
  95. envs: [PROJECT_API_NAME,PROD_DOMAIN_PREFIX,PROJECT_RPC_NAME]
  96. script:
  97. - bash
  98. - cd /kkkk/app_project/${DRONE_REPO_NAME}
  99. - git pull https://userName:userPwd@gitea.xxx.com/path/${DRONE_REPO_NAME}.git
  100. - docker login harbor.xxx.com -u admin -p xxx
  101. - git pull origin
  102. - git branch
  103. - git fetch origin
  104. - git checkout master
  105. - export ENV="-prod"
  106. - export DOMAIN_PREFIX=$${PROD_DOMAIN_PREFIX}
  107. - export GIT_COMMIT=${DRONE_COMMIT:0:10}
  108. - docker-compose down
  109. - docker images | grep $${PROJECT_API_NAME} | awk '{print $3}' | xargs docker rmi -f
  110. - docker images | grep $${PROJECT_RPC_NAME} | awk '{print $3}' | xargs docker rmi -f
  111. - docker-compose up -d
  112. #- echo "CI构建完成 ${DRONE_COMMIT_MESSAGE} ${DRONE_COMMIT:0:10}"
  113. when:
  114. branch:
  115. - master
  116. retry:
  117. limit: 2
  118. delay: 360s
  119. - name: notify
  120. image: drillster/drone-email
  121. settings:
  122. host:
  123. username:
  124. password:
  125. port: 465
  126. from:
  127. when:
  128. status:
  129. - failure
  130. volumes:
  131. - name: docker-sock
  132. host:
  133. path: /var/run/docker.sock
  134. trigger:
  135. branch:
  136. - develop
  137. - master
  138. event:
  139. include:
  140. - push
  141. - custom
  142. - merge_request
  143. ---
  144. kind: pipeline
  145. type: docker
  146. name: promote/rollback
  147. steps:
  148. - name: stage-rollback
  149. image: appleboy/drone-ssh
  150. environment:
  151. PROJECT_API_NAME:
  152. from_secret: PROJECT_API_NAME
  153. PROJECT_RPC_NAME:
  154. from_secret: PROJECT_RPC_NAME
  155. DOMAIN_PREFIX:
  156. from_secret: DOMAIN_PREFIX
  157. settings:
  158. host:
  159. from_secret: STAGE_HOST_IP
  160. username:
  161. from_secret: STAGE_HOST_NAME
  162. password:
  163. from_secret: STAGE_HOST_PWD
  164. port: 22
  165. command_timeout: 300s
  166. envs: [PROJECT_API_NAME,STAGE_DOMAIN_PREFIX,PROJECT_RPC_NAME]
  167. script:
  168. - cd /home/kkkk/app_project/${DRONE_REPO_NAME}
  169. - export GIT_COMMIT=${DRONE_COMMIT:0:10}
  170. - export DOMAIN_PREFIX=$${STAGE_DOMAIN_PREFIX}
  171. - export ENV=""
  172. - docker-compose down
  173. - docker-compose up -d
  174. - echo "版本已经更新到 ${DRONE_COMMIT:0:10}, ${DRONE_COMMIT_MESSAGE}"
  175. when:
  176. branch:
  177. - develop
  178. - name: prod-rollback
  179. image: appleboy/drone-ssh
  180. environment:
  181. PROJECT_API_NAME:
  182. from_secret: PROJECT_API_NAME
  183. PROJECT_RPC_NAME:
  184. from_secret: PROJECT_RPC_NAME
  185. DOMAIN_PREFIX:
  186. from_secret: DOMAIN_PREFIX
  187. settings:
  188. host:
  189. from_secret: PROD_HOST_IP
  190. username:
  191. from_secret: PROD_HOST_NAME
  192. password:
  193. from_secret: PROD_HOST_PWD
  194. port: 22
  195. command_timeout: 300s
  196. envs: [PROJECT_API_NAME,STAGE_DOMAIN_PREFIX,PROJECT_RPC_NAME]
  197. script:
  198. - cd /kkkk/app_project/${DRONE_REPO_NAME}
  199. - export GIT_COMMIT=${DRONE_COMMIT:0:10}
  200. - export DOMAIN_PREFIX=$${STAGE_DOMAIN_PREFIX}
  201. - export ENV="-prod"
  202. - docker-compose down
  203. - docker-compose up -d
  204. - echo "版本已经更新到 ${DRONE_COMMIT:0:10}, ${DRONE_COMMIT_MESSAGE}"
  205. when:
  206. branch:
  207. - master
  208. volumes:
  209. - name: docker-sock
  210. host:
  211. path: /var/run/docker.sock
  212. trigger:
  213. branch:
  214. - develop
  215. - master
  216. event:
  217. - rollback
  218. - promote

构建时整个流程链路

  1. git 拉取代码
  2. docker build 打镜像
  3. docker push 推送到私有镜像
  4. ssh 登录到远程主机拉取代码
  5. docker compose 运行 此过程通常会拉取私有镜像中的新镜像

回滚时整个流程链路
由于在创建镜像的时候将git的commit放在了镜像后面作为tag,所以回滚时直接指定 git commit 值进行回滚,在docker-compose中引用的镜像格式为 image:gitcommit 所以很方便。


后来我发现这种方式太慢了,而且很不稳定,有时候会卡住完全不动,所以改成了直接在宿主机构建,这时候需要做以下修改

  1. kind: pipeline
  2. # type 使用 exec
  3. type: exec
  4. name: CI-building

第二种方式,type 使用 exec,此时则需要安装一个扩展,否则这个机制使用不了

  1. curl -L https://github.com/drone-runners/drone-runner-exec/releases/latest/download/drone_runner_exec_linux_amd64.tar.gz | tar zx
  2. sudo install -t /usr/local/bin drone-runner-exec
  3. vim /etc/drone-runner-exec/config

将这些变量保存到config中:

DRONE_RPC_PROTO=http
DRONE_RPC_HOST=drone.yoururl.com
DRONE_RPC_SECRET=之前部署时的自定义secret

完成以上操作后,安装并启动它

  1. drone-runner-exec service install
  2. drone-runner-exec service start
  3. # drone-runner-exec service stop

这样就可以直接在 Drone 执行自定以的bash命令了。

下有完整的配置文件

  1. kind: pipeline
  2. type: exec
  3. name: CI-building
  4. environment:
  5. GOOS: linux
  6. GOARCH: amd64
  7. steps:
  8. - name: CI
  9. # 这里一定要在变量中配置go环境,否则 go mod tidy 这类命令如果有下载依赖包,每次构建都不会缓存
  10. environment:
  11. GOPATH: /root/go
  12. PROJECT_API_NAME:
  13. from_secret: PROJECT_API_NAME
  14. PROJECT_RPC_NAME:
  15. from_secret: PROJECT_RPC_NAME
  16. DOMAIN_PREFIX:
  17. from_secret: DOMAIN_PREFIX
  18. commands:
  19. - pwd
  20. - cd /home/xxx/app_project/${DRONE_REPO_NAME}
  21. - git switch ${DRONE_COMMIT_BRANCH}
  22. - git branch --set-upstream-to=origin/${DRONE_COMMIT_BRANCH} ${DRONE_COMMIT_BRANCH}
  23. - git pull
  24. - export PATH=$PATH:/usr/local/go/bin
  25. - go env
  26. - go version
  27. - go build -ldflags="-s -w" -o ./app api/*.go
  28. - docker build -f api/Dockerfile -t $${PROJECT_API_NAME}:latest .
  29. - docker tag $${PROJECT_API_NAME}:latest harbor.xxx.com/xxx/$${PROJECT_API_NAME}:${DRONE_COMMIT:0:10}
  30. - docker login harbor.xxx.com -u admin -p xxx
  31. - docker push harbor.xxx.com/xxx/$${PROJECT_API_NAME}:${DRONE_COMMIT:0:10}
  32. - echo "API构建完成, 你可以通过 docker pull harbor.xxx.com/xxx/$PROJECT_API_NAME:${DRONE_COMMIT:0:10} 获取镜像"
  33. - |
  34. if [ -d "rpc" ]; then
  35. go build -ldflags="-s -w" -o ./rpc_app rpc/*.go
  36. docker build -f rpc/Dockerfile -t $${PROJECT_RPC_NAME}:latest .
  37. docker tag $${PROJECT_RPC_NAME}:latest harbor.xxx.com/xxx/$${PROJECT_RPC_NAME}:${DRONE_COMMIT:0:10}
  38. docker push harbor.xxx.com/xxx/$${PROJECT_RPC_NAME}:${DRONE_COMMIT:0:10}
  39. echo "RPC构建完成, 你可以通过 docker pull harbor.xxx.com/xxx/$${PROJECT_RPC_NAME}:${DRONE_COMMIT:0:10} 获取镜像"
  40. fi
  41. - name: stage-publish
  42. environment:
  43. PROJECT_API_NAME:
  44. from_secret: PROJECT_API_NAME
  45. PROJECT_RPC_NAME:
  46. from_secret: PROJECT_RPC_NAME
  47. DOMAIN_PREFIX:
  48. from_secret: DOMAIN_PREFIX
  49. when:
  50. branch:
  51. - develop
  52. commands:
  53. - echo ">>>>>>>>>>>>>>>>>>>>"
  54. - cd /home/xxx/app_project/${DRONE_REPO_NAME}
  55. - docker-compose down
  56. - export DOMAIN_PREFIX=$${STAGE_DOMAIN_PREFIX}
  57. - export GIT_COMMIT=${DRONE_COMMIT:0:10}
  58. - export ENV=""
  59. - |
  60. if [ -d "rpc" ]; then
  61. echo $PROJECT_RPC_NAME 12345
  62. docker tag $PROJECT_RPC_NAME:latest harbor.xxx.com/xxx/$PROJECT_RPC_NAME:${DRONE_COMMIT:0:10}
  63. docker push harbor.xxx.com/xxx/$PROJECT_RPC_NAME:${DRONE_COMMIT:0:10}
  64. docker images | grep $${PROJECT_RPC_NAME} | awk '{print $3}' | xargs docker rmi -f
  65. fi
  66. - docker images | grep $${PROJECT_API_NAME} | awk '{print $3}' | xargs docker rmi -f
  67. - docker-compose up -d
  68. volumes:
  69. - name: docker-sock
  70. host:
  71. path: /var/run/docker.sock
  72. trigger:
  73. branch:
  74. - develop
  75. - master
  76. event:
  77. include:
  78. - push
  79. - custom
  80. - merge_request
  81. ---
  82. kind: pipeline
  83. type: docker
  84. name: CI-Master-publish
  85. depends_on:
  86. - CI-building
  87. steps:
  88. - name: prod-publish
  89. image: appleboy/drone-ssh
  90. environment:
  91. PROD_DOMAIN_PREFIX:
  92. from_secret: PROD_DOMAIN_PREFIX
  93. PROJECT_API_NAME:
  94. from_secret: PROJECT_API_NAME
  95. PROJECT_RPC_NAME:
  96. from_secret: PROJECT_RPC_NAME
  97. settings:
  98. host:
  99. from_secret: PROD_HOST_IP
  100. username:
  101. from_secret: PROD_HOST_NAME
  102. password:
  103. from_secret: PROD_HOST_PWD
  104. port: 22
  105. command_timeout: 360s
  106. envs: [PROJECT_API_NAME,PROD_DOMAIN_PREFIX,PROJECT_RPC_NAME]
  107. script:
  108. - bash
  109. - cd /xxx/app_project/${DRONE_REPO_NAME}
  110. - git pull https://userName:userPwd@gitea.xxx.com/xxx/${DRONE_REPO_NAME}.git
  111. - docker login harbor.xxx.com -u admin -p xxx
  112. - git pull origin
  113. - git branch
  114. - git fetch origin
  115. - git checkout master
  116. - export ENV="-prod"
  117. - export DOMAIN_PREFIX=$${PROD_DOMAIN_PREFIX}
  118. - export GIT_COMMIT=${DRONE_COMMIT:0:10}
  119. - docker-compose down
  120. - docker images | grep $${PROJECT_API_NAME} | awk '{print $3}' | xargs docker rmi -f
  121. - docker images | grep $${PROJECT_RPC_NAME} | awk '{print $3}' | xargs docker rmi -f
  122. - docker-compose up -d
  123. retry:
  124. limit: 2
  125. delay: 360s
  126. volumes:
  127. - name: docker-sock
  128. host:
  129. path: /var/run/docker.sock
  130. trigger:
  131. branch:
  132. - master
  133. event:
  134. include:
  135. - push
  136. - custom
  137. - merge_request
  138. ---
  139. kind: pipeline
  140. type: docker
  141. name: promote/rollback
  142. steps:
  143. - name: stage-rollback
  144. image: appleboy/drone-ssh
  145. environment:
  146. PROJECT_API_NAME:
  147. from_secret: PROJECT_API_NAME
  148. PROJECT_RPC_NAME:
  149. from_secret: PROJECT_RPC_NAME
  150. DOMAIN_PREFIX:
  151. from_secret: DOMAIN_PREFIX
  152. settings:
  153. host:
  154. from_secret: STAGE_HOST_IP
  155. username:
  156. from_secret: STAGE_HOST_NAME
  157. password:
  158. from_secret: STAGE_HOST_PWD
  159. port: 22
  160. command_timeout: 300s
  161. envs: [PROJECT_API_NAME,STAGE_DOMAIN_PREFIX,PROJECT_RPC_NAME]
  162. script:
  163. - cd /home/xxx/app_project/${DRONE_REPO_NAME}
  164. - export GIT_COMMIT=${DRONE_COMMIT:0:10}
  165. - export DOMAIN_PREFIX=$${STAGE_DOMAIN_PREFIX}
  166. - export ENV=""
  167. - docker-compose down
  168. - docker-compose up -d
  169. - echo "版本已经更新到 ${DRONE_COMMIT:0:10}, ${DRONE_COMMIT_MESSAGE}"
  170. when:
  171. branch:
  172. - develop
  173. - name: prod-rollback
  174. image: appleboy/drone-ssh
  175. environment:
  176. PROJECT_API_NAME:
  177. from_secret: PROJECT_API_NAME
  178. PROJECT_RPC_NAME:
  179. from_secret: PROJECT_RPC_NAME
  180. DOMAIN_PREFIX:
  181. from_secret: DOMAIN_PREFIX
  182. settings:
  183. host:
  184. from_secret: PROD_HOST_IP
  185. username:
  186. from_secret: PROD_HOST_NAME
  187. password:
  188. from_secret: PROD_HOST_PWD
  189. port: 22
  190. command_timeout: 300s
  191. envs: [PROJECT_API_NAME,STAGE_DOMAIN_PREFIX,PROJECT_RPC_NAME]
  192. script:
  193. - cd /xxx/app_project/${DRONE_REPO_NAME}
  194. - export GIT_COMMIT=${DRONE_COMMIT:0:10}
  195. - export DOMAIN_PREFIX=$${STAGE_DOMAIN_PREFIX}
  196. - export ENV="-prod"
  197. - docker-compose down
  198. - docker-compose up -d
  199. - echo "版本已经更新到 ${DRONE_COMMIT:0:10}, ${DRONE_COMMIT_MESSAGE}"
  200. when:
  201. branch:
  202. - master
  203. volumes:
  204. - name: docker-sock
  205. host:
  206. path: /var/run/docker.sock
  207. trigger:
  208. branch:
  209. - develop
  210. - master
  211. event:
  212. - rollback
  213. - promote

声明: 因编程语言版本更新较快,当前文章所涉及的语法或某些特性相关的信息并不一定完全适用于您当前所使用的版本,请仔细甄别。文章内容仅作为学习和参考,若有错误,欢迎指正。

讨论 支持 Markdown 语法 点击演示
回复
评论预览框

开发者

开发者·注册登录
  • 获取验证码
  • 取消