ci 持续集成 Continuous Integration

为了更快地发现和修复系统集成遇到的各类问题,它建议开发人员一天最少提交一次或者多次代码到代码库中,让自动化工具对提交的代码进行集成部署,并使用自动化测试工具检验代码是否正常运行,从而更快地发现代码中存在的问题并进行修复。

image.png

Jenkins 是常用的持续集成工具。它采用 Java 开发,提供 Web 界面简化操作,并支持插件式扩展

Pipeline

Jenkins 中提供多种方式进行构建工作,其中 Pipeline 是最为常用的方式之一。

Pipeline 是一套运行在 Jenkins 上的工作框架。它能够将多个节点中的任务连接起来,实现单个节点难以完成的复杂流程的编排和可视化工作。Pipeline 以代码的形式实现,它将一个流水线划分为多个 Stage,每个 Stage 代表了一组操作,比如构建、测试、部署等;而 Stage 内部又由多个 Step 组成,每一个 Step 就是基本的操作命令,比如打印日志 “echo” 等命令。

Pipeline 脚本是由 Groovy 语言实现,支持 Declarative(声明式)和 Scripted(脚本式)语法

🌰

  1. node {
  2. script {
  3. mysql_addr = '127.0.0.1' // service cluster ip
  4. redis_addr = '127.0.0.1' // service cluster ip
  5. user_addr = '127.0.0.1:30036' // nodeIp : port
  6. }
  7. stage('clone code from github') {
  8. echo "first stage: clone code"
  9. git url: "https://github.com/longjoy/micro-go-course.git"
  10. script {
  11. commit_id = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
  12. }
  13. }
  14. stage('build image') {
  15. echo "second stage: build docker image"
  16. sh "docker build -t aoho/user:${commit_id} section11/user/"
  17. }
  18. stage('push image') {
  19. echo "third stage: push docker image to registry"
  20. sh "docker login -u aoho -p xxxxxx"
  21. sh "docker push aoho/user:${commit_id}"
  22. }
  23. stage('deploy to Kubernetes') {
  24. echo "forth stage: deploy to Kubernetes"
  25. sh "sed -i 's/<COMMIT_ID_TAG>/${commit_id}/' user-service.yaml"
  26. sh "sed -i 's/<MYSQL_ADDR_TAG>/${mysql_addr}/' user-service.yaml"
  27. sh "sed -i 's/<REDIS_ADDR_TAG>/${redis_addr}/' user-service.yaml"
  28. sh "kubectl apply -f user.yaml"
  29. }
  30. stage('http test') {
  31. echo "fifth stage: http test"
  32. sh "cd section11/user/transport && go test -args ${user_addr}"
  33. }
  34. }