跳至內容

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/crystal@1.0
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/crystal@1.0
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/crystal@1.0
version: 2.1

安裝 shard 套件

您無需擔心,因為 crystal/test 工作會執行 crystal/shard-install orb 命令。

安裝二進制相依性

我們的應用程式或某些 shard 可能需要函式庫和套件。這些二進制相依性可以使用 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/crystal@1.0
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/crystal@1.0
version: 2.1

注意

pre-steps 中的明確 checkout 是為了讓 test-data/setup.sql 檔案可用。

快取

當使用工作 crystal/test 時,預設會啟用快取,因為它在內部使用 with-shards-cache 命令