企业级持续交付系统 CircleCI 是怎么炼成的(三):带你 4 步创建入门级 workflow

研发效能领域洞察系列

CircleCI 在 2019 年被 Forrester 评为云原生连续集成领域的领导者,并被提名为多个Best DevOps Tools列表。CircleCI 是第一个通过 FedRAMP认证的CI / CD 工具,每月在 Linux,macOS,Docker 和 Windows 构建环境中处理超过 3000 万个构建。这篇文章将带领大家创建一个CircleCI入门级workflow。

作者简介 

刘仁权(弈阁)

蚂蚁金服 高级开发工程师

刘仁权,花名弈阁,蚂蚁金服研发效能部高级开发工程师,主要从事DevOps平台持续交付系统研发工作,在Pipeline编排、容器化调度、CI提效、插件体系等方面有丰富的实战经验。

01

注册

进入CircleCI界面, https://circleci.com/signup/ ,支持通过Github或Bitbucket登陆。

这篇文档我们用Github作为输出源来测试,首先需要先在Github中创建一个测试project,circleci-demo https://github.com/liurq93/circleci-demo。

在Github创建完project后,我们进入CircleCI界面点击Github登陆,首次登陆会请求授权给CircleCI,点击确认即可。

首次进入CircleCI,可以看到主界面主要 分为6个部分JOBS (任务执行纪录)、 WORKFOLOWS (流水线执行纪录)、 INSIGHTS (各种视图)、 ADD PROJECTS (添加和初始化项目)、 TEAM (团队管理)、 SETTINGS (配置)。

02

初始化yaml

我们 点击"ADD PROJECTS" 进入Projects界面 ,这里可以查看到所有从GIthub同步过来的project信息,我们可以选择刚刚在github创建的project开始一个workflow

点击Set Up Project按钮,可以发现CircleCI为我们提供了不同语言的默认模版的流水线yaml, 这里我们选择maven

默认的模版有点简单,我们丰富一下

点击Start Building ,弹出界面,提示是否自动将yaml推送至仓库,so方便!

为了通过这个demo尽可能多的测试circleci yaml功能,我 定义了5个job ,分别是:

我们来看下yaml,先有一个整体感觉, 最后会详细讲解yaml含义

version: 2
parameters:
  temp-workspace:
    type: string
    default: "/temp/workspace"
jobs:
  build:
    docker:
      - image: circleci/openjdk:8-jdk
    working_directory: ~/circleci-demo

    environment:
      JVM_OPTS: -Xmx3200m
      MVN_ARGS: -Dmaven.repo.local=.repo

    steps:
      - checkout

      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "pom.xml" }}
            # fallback to using the latest cache if no exact match is found
            - v1-dependencies-

      - run: mvn clean install package ${MVN_ARGS}

      - save_cache:
          paths:
            -  .repo
          key: v1-dependencies-{{ checksum "pom.xml" }}

      - store_artifacts:
          path: target/
          destination: circleci-demo-jar

      - persist_to_workspace:
          root: ~/
          paths:
            - circleci-demo
  test:
    docker:
      - image: circleci/openjdk:8-jdk
    working_directory: ~/circleci-demo

    environment:
      JVM_OPTS: -Xmx3200m
      MVN_ARGS: -Dmaven.repo.local=.repo

    steps:
      - attach_workspace:
          at: ~/circleci-demo

      - run: | 
          cd circleci-demo
          mvn clean test ${MVN_ARGS}

      - store_test_results:
          path: circleci-demo/target/surefire-reports


  deploy-site1:
    docker:
      - image: circleci/openjdk:8-jdk 
    steps:
      - run: echo 'deploy sit1'


  deploy-site2:
    docker:
      - image: circleci/openjdk:8-jdk 
    steps:
      - run: echo 'deploy sit2'


workflows:
  version: 2
  circleci-demo-workflow:
    jobs:
      - build:
          filters:
            branches:
              only: master

      - test:
          requires:
            - build

      - approval-deploy:
          type: approval
          requires:
            - test

      - deploy-site1:
          requires:
            - approval-deploy
          filters:
            branches:
              only: master

      - deploy-site2:
          requires:
            - approval-deploy
          filters:
            branches:
              only: master

03

触发workflow

默认通过代码push触发yaml,我们来看下流水线整体效果:

build和test执行成功后,workflow会hold在手工确认job“approval-deploy”中

点击每个job,会进入单独的job界面,这里包含了很多信息,包括 Test summary (测试汇总)、 Artifacts (产物)、 Configuration (配置)、 Parameters (参数)等等,比如这次的build job,执行结束后生成了一堆产物:

这里是test job的测试结果

点击手工确认job,确定将jar发布至2个站点(这里的deploy job仅仅是模拟,执行了一个echo)。

确认后,deploy-site1和deploy-site2会并发执行

04

解读yaml

在上面我们看到了完整的yaml,是不是一头雾水,没关系,我们拆分来看。

(如果想了解更多的yaml语法,可以看下另一篇文章,传送门)

首先将整个yaml拆分为jobs和workflows,jobs和workflows都是yml的根key,根jobs的作用是定义任务的具体执行逻辑,而workflows的作用是编排job,关于workflows的更多介绍可以看下 《每月处理 3000万+ 构建的企业级持续交付系统 CircleCI 是怎么炼成的?(二)超详细Pipeline语法解读》

4.1、jobs

jobs在yaml中结构:

version: 2
jobs:
  build:
    ...
  test:
    ...  

(1)build job

version: 2
jobs:
  build:
    #1.定义运行的环境,这里是包含jdk8的一个image
    docker:
      - image: circleci/openjdk:8-jdk

    #2.设置step共享的工作目录(step脚本相对这个目录执行)
    working_directory: ~/circleci-demo

        #3.定义job级别的环境变量,所有step共享
    environment:
      JVM_OPTS: -Xmx3200m
      MVN_ARGS: -Dmaven.repo.local=.repo

        #4.steps
    steps:
        #4.1 下载代码
      - checkout

      #4.2 拉取maven缓存
      - restore_cache:
          keys:
              # cachae key, 仅当pom.xml文件的校验和和上次一样(也就是没有变更)才会更新
            - v1-dependencies-{{ checksum "pom.xml" }} #
            # 如果上面的key失效用这个key代替
            - v1-dependencies-

            #4.3 打包
      - run: mvn clean install package ${MVN_ARGS}

            #4.4 上传缓存
      - save_cache:
              #缓存目录
          paths:
            -  .repo
          #换粗key,仅当pom.xml发生变更才更新
          key: v1-dependencies-{{ checksum "pom.xml" }}

          #4.5 上传产物(编译jar)
      - store_artifacts:
          path: target/
          destination: circleci-demo-jar

            #4.6 将workspace临时存储下来,供workflow下的其他job复用
      - persist_to_workspace:
          root: ~/
          paths:
            - circleci-demo

(2)test job

一个测试job,执行mvn test测试,并将测试产物上传

version: 2
jobs:
  test:
      #1.定义运行的环境,这里是包含jdk8的一个image
    docker:
      - image: circleci/openjdk:8-jdk
    #2.设置step共享的工作目录(step脚本相对这个目录执行)
    working_directory: ~/circleci-demo

        #3.定义job级别的环境变量,所有step共享
    environment:
      JVM_OPTS: -Xmx3200m
      MVN_ARGS: -Dmaven.repo.local=.repo

        #4.steps
    steps:
      #4.1 将build临时保留的workspace恢复到job中
      - attach_workspace:
          at: ~/circleci-demo

            #4.2执行mvn test测试脚本
      - run: | 
          cd circleci-demo
          mvn clean test ${MVN_ARGS}
            #4.3 上传测试产物
      - store_test_results:
          path: circleci-demo/target/surefire-reports

(3)deploy-site1/2 job

两个deploy job,模拟发布jar到两个站点

version: 2
jobs:       
  deploy-site1:
    docker:
      - image: circleci/openjdk:8-jdk 
    steps:
      - run: echo 'deploy sit1'


  deploy-site2:
    docker:
      - image: circleci/openjdk:8-jdk 
    steps:
      - run: echo 'deploy sit2'

4.2、workflows

workflows的作用就是编排job的先后顺序、指定job的执行条件等等

version: 2
workflows:
    #1. workflow版本
  version: 2
  #2. workflow 名称
  circleci-demo-workflow:
      #2.1 jobs
    jobs:
        #2.1.1 build job,仅在master分支触发
      - build:
          filters:
            branches:
              only: master

      #2.1.2 build job,仅在master分支触发,依赖build job
      - test:
          requires:
            - build

            #2.1.3 手动确认job,依赖test job
      - approval-deploy:
          type: approval
          requires:
            - test
            #2.1.4 发布job,依赖approval-deploy job, 和deploy-site2并发执行
      - deploy-site1:
          requires:
            - approval-deploy
          filters:
            branches:
              only: master

            #2.1.5 发布job,依赖approval-deploy job, 和deploy-site1并发执行
      - deploy-site2:
          requires:
            - approval-deploy
          filters:
            branches:
              only: master

引用

[1]Configuring CircleCI :https://circleci.com/docs/2.0/configuration-reference

[2]Getting Started Introduction:https://circleci.com/docs/2.0/getting-started/#creating-a-repository

系列预告 - 深入解读企业级持续交付系统CircleCI

Part 1:What is CircleCI ?

Part 2:Pipeline 语法完整解读

Part 3:手把手指导入门案例

【敬请期待】 Part 4: 全新UI界面

【敬请期待】 Part 5: 细品集成利器orbs

如果还想要了解更多,这里有更多研发效能内容推荐:

趋势研究:从0到1打造软件供应链

点击查看原文:《 【前沿探索】安全交付:GCP 的安全软件供应链

硬核的俄文会议转播,如何打造下一代IDE?

点击查看原文:《 JetBrains OpenDay 2019 盘点:如何打造下一代 IDE

长按识别二维码关注我们

号外号外!!!

蚂蚁金服研发效能团队招募进行中, 高级iOS开发工程师/技术专家、资深前端开发工程师/技术专家、高级Java开发工程师/技术专家、技术支持、静态程序分析技术专家、产品专家 十余+ 岗位持续开放,让我们一起助力内部及外部伙伴研发效能的持续提升,「效」傲江湖:rocket::rocket::rocket:

详细岗位信息扫描下方二维码

如果你对任何岗位感兴趣,欢迎发简历到: AntLinkE@antfin.com

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章