跳至内容

CircleCI

在本节中,我们将使用 CircleCI 作为我们的持续集成服务。用 几句话 来说,CircleCI 自动执行软件构建、测试和部署。它支持 不同的编程语言,对于我们的特定情况,它支持 Crystal 语言

在本节中,我们将介绍一些配置示例,以了解 CircleCI 如何实现一些 持续集成概念

CircleCI orbs

在展示一些示例之前,值得一提的是 CircleCI orbs。如官方文档中所定义的

Orbs 定义了可重用的命令、执行器和作业,以便可以将常用配置片段压缩成一行代码。

在我们的案例中,我们将使用 Crystal 的 Orb

构建和运行规范

使用 latest 的简单示例

让我们从一个简单的示例开始。我们将使用最新的 Crystal 版本运行测试

.circleci/config.yml
workflows:
  version: 2
  build:
    jobs:
      - crystal/test

orbs:
  crystal: manastech/[email protected]
version: 2.1

是的!就这么简单!借助 Orbs,构建了一个抽象层,使配置文件更易于阅读和理解。

如果我们想知道作业 crystal/test 的作用,我们可以随时查看源代码。

使用 nightly

使用 nightly 版本的 Crystal 发布版本就像这样

.circleci/config.yml
workflows:
  version: 2
  build:
    jobs:
      - crystal/test:
          name: test-on-nightly
          executor:
            name: crystal/default
            tag: nightly

orbs:
  crystal: manastech/[email protected]
version: 2.1

使用特定 Crystal 版本

.circleci/config.yml
workflows:
  version: 2
  build:
    jobs:
      - crystal/test:
          name: test-on-0.30
          executor:
            name: crystal/default
            tag: 0.30.0

orbs:
  crystal: manastech/[email protected]
version: 2.1

安装分片包

您不必担心,因为 crystal/test 作业运行 crystal/shard-install orb 命令。

安装二进制依赖项

我们的应用程序或可能是一些分片可能需要库和包。这些二进制依赖项可以使用 Apt 命令进行安装。

以下是一个安装 libsqlite3 开发包的示例

.circleci/config.yml
workflows:
  version: 2
  build:
    jobs:
      - crystal/test:
          pre-steps:
            - run: apt-get update && apt-get install -y libsqlite3-dev

orbs:
  crystal: manastech/[email protected]
version: 2.1

使用服务

现在,让我们使用外部服务(例如 MySQL)运行规范

.circleci/config.yml
executors:
  crystal_mysql:
    docker:
      - image: 'crystallang/crystal:latest'
        environment:
          DATABASE_URL: 'mysql://root@localhost/db'
      - image: 'mysql:5.7'
        environment:
          MYSQL_DATABASE: db
          MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'

workflows:
  version: 2
  build:
    jobs:
      - crystal/test:
          executor: crystal_mysql
          pre-steps:
            - run:
                name: Waiting for service to start (check dockerize)
                command: sleep 1m
            - checkout
            - run:
                name: Install MySQL CLI; Import dummy data
                command: |
                        apt-get update && apt-get install -y mysql-client
                        mysql -h 127.0.0.1 -u root --password="" db < test-data/setup.sql

orbs:
  crystal: manastech/[email protected]
version: 2.1

注意

pre-steps 中的显式 checkout 是为了让 test-data/setup.sql 文件可用。

缓存

使用作业 crystal/test 时,默认情况下会启用缓存,因为内部使用命令 with-shards-cache