27

每月处理 3000万+ 构建的企业级持续交付系统 CircleCI 是怎么炼成的?(三)带你4步创...

 3 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzU3NzczMDI4Ng%3D%3D&%3Bmid=2247484159&%3Bidx=1&%3Bsn=75533aa8a1df3da3b19bb385c049968d
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

研发效能领域洞察系列

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

作者简介 

yqUF3mE.png!web

刘仁权(弈阁)

蚂蚁金服 高级开发工程师

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

yA7zErE.png!web

01

注册

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

zauE3aj.png!web

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

iqYnQzu.png!web

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

i6r2yqJ.png!web

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

aUN36ff.png!web

02

初始化yaml

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

emMFnqE.png!web

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

qy6veqr.png!web

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

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

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

YVV77v6.png!web

我们来看下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,我们来看下流水线整体效果:

2Un2m2R.png!web

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

IJni6fJ.png!web

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

myqM3ub.png!web

这里是test job的测试结果

QFNzAjb.png!web

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

vYbQZve.png!web

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

ray2qur.png!web

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

UBVbUr3.jpg!web

长按识别二维码关注我们

号外号外!!!

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

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

如果你对任何岗位感兴趣,欢迎发简历到: [email protected]


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK