# CircleCI

CircleCI 可以绑定 GitHub/Bitbucket,只要你的代码有变更,就会自动抓取,根据你的配置,提供运行环境,执行测试、构建和部署。

所以,通过 CircleCI 我可以快速方便的实现持续集成和持续部署。

CircleCI Arch

# 基础配置

版本:指定使用的 CircleCI 版本。

# 指定要使用的 CircleCI 版本
version: 2

工作流:工作流定义了一系列的任务和他们的运行顺序。它可以使任务并行,穿行和按计划或者手动控制运行。

workflows:
  version: 2
  one_and_two: # this is the name of our workflow
    jobs:
      - one
      - two:
          requires:
            - one # wait for one job to complete successfully before starting

在上面的 one_and_two 工作流中我们包含了 onetwo 两个任务,任务是步骤的集合:

jobs:
  one: # this is the name of our first job.
    docker: # it uses the docker executor
      - image: circleci/ruby:2.4.1 # specifically, a docker image with ruby 2.4.1
    # Steps are a list of commands to run inside the docker container above.
    steps:
      - checkout # this pulls code down from GitHub
      - run: echo "A first hello" # This prints "A first hello" to stdout.
      - run: sleep 25 # a command telling the job to "sleep" for 25 seconds.
  two:
    docker:
      - image: circleci/ruby:2.4.1
    steps:
      - checkout
      - run: echo "A more familiar hi"
      - run: sleep 15

如上可见,步骤一般是可执行的命令组成的。

# Workspaces

每个工作流都有一个关联的工作空间,可用于在工作流进行时将文件传输到下游作业,此时我们需要使用 persist_to_workspace 键。

文件和目录中的带有 paths 的属性使用 persist_to_workspace 会被上传到工作区中的临时目录中,相对于 root 键定义的目录。文件和目录在这时上传之后,就可以在相应的子任务中使用。

配置任务接收存储的数据时,需要用到 attach_workspace 键。

version: 2
jobs:
  one:
    docker:
      - image: circleci/ruby:2.4.1
    steps:
      - checkout
      - run: echo "A first hello"
      - run: mkdir -p my_workspace
      - run: echo "Trying out workspaces" > my_workspace/echo-output
      - persist_to_workspace:
          # Must be an absolute path, or relative path from working_directory
          root: my_workspace
          # Must be relative path from root
          paths:
            - echo-output
  two:
    docker:
      - image: circleci/ruby:2.4.1
    steps:
      - checkout
      - run: echo "A more familiar hi"
      - attach_workspace:
          # Must be absolute path or relative path from working_directory
          at: my_workspace

      - run: |
          if [[ $(cat my_workspace/echo-output) == "Trying out workspaces" ]]; then
            echo "It worked!";
          else
            echo "Nope!"; exit 1
          fi
workflows:
  version: 2
  one_and_two:
    jobs:
      - one
      - two:
          requires:
            - one

这里 (opens new window)阅读有关工作区的更多信息。

# SSH into Your Build

当出现问题时,我们可能需要对问题进行调试,这时后我们可以通过 SSH 直接在 CircleCI jobs 中执行操作。

SSH CircleCI

使用以下命令,查看是否可以找到并查看使用工作空间创建的文件的内容:

pwd                  # print what directory, find out where you are in the file system
ls -al               # list what files and directories are in the current directory
cd <directory_name>  # change directory to the <directory_name> directory
cat <file_name>      # show me the contents of the file <file_name>

# 减少重复的指令

通过 YAML 语法的特性,你可以将重复的指令统一放到一个地方来进行引用。

defaults: &defaults
  adapter: postgres
  host: localhost

development:
  database: myapp_development
  <<: *defaults

test:
  database: myapp_test
  <<: *defaults

相当于:

defaults:
  adapter: postgres
  host: localhost

development:
  database: myapp_development
  adapter: postgres
  host: localhost

test:
  database: myapp_test
  adapter: postgres
  host: localhost

其中 & 用来建立锚点(defaults),<< 表示合并到当前数据,* 用来引用锚点。

# Refs