📚

CircleCI で orb を自作する

に公開

前回の記事では、再利用可能な設定項目を外部設定(orb)として呼び出し繰り返し再利用行うことでconfig.ymlの記載を短縮させ、すっきりとした構成にする方法を紹介しました。
https://zenn.dev/kameoncloud/articles/a4e252e5f3225e

OrbはRegistryのサイトで公開されており、よくあるもの(例えばAWS CLIの初期セットアップや各種言語の初期設定、など)は公式で作成されたものが公開されています。
https://circleci.com/developer/ja/orbs

公式が作成し公開しているorbとは別に、orbは自作することが可能です。それをパブリックに公開することも可能ですし、CircleCIの特定Organization向けにプライベートな状態で公開しておけば、自社用の初期設定を纏めておくことが可能です。今日はorbを自作する手順を纏めます。

さっそくやってみる

1. 事前準備

まずはCircleCIのProjectがGitHubレポジトリと連携している状態にします。例えば以下の記事を参考にしてください。
https://zenn.dev/kameoncloud/articles/641dbdd496a59d
Orbを自作する場合1点注意があります。接続を行うGitHubは単独アカウントではなくOrganizationでなければいけない、という制限があります。
CircleCIのOrganization Settingsで以下の通り接続先がOrganizationとなっている点に注意してください。

接続が完了したらOrganization IDをコピーしておきます。

次に左ペインのSecurityをクリックしAllow uncertified public orbsを有効化します。Privateのorbを作成する場合は、Allow private orbsも有効化します。

2. CLIのセットアップ

以下の記事に従いCircleCI CLIをセットアップします。
https://zenn.dev/kameoncloud/articles/707a448101e5c0

3. Orb の自作

まず以下のコマンドを実行して名前空間を作成します。

circleci namespace create testorb --org-id <your-organization-id>

<your-organization-id>は先ほど取得した値に置き換えます。
次に作成された名前空間にorbを作成します。

circleci orb create testorb/testorb

以下のファイルを作成します。

orb.yml
version: 2.1
description: A greeting command orb
commands:
    greet:
        description: Greet someone with a "hello".
        parameters:
            to:
                type: string
                default: World
        steps:
            - run: echo "Hello, << parameters.to >>"

orbとはworkflowが存在しないconfig.ymlのような物です。

以下を実行して作成されたorb.yml検証します。

circleci orb validate orb.yml

4. Orb の公開

ではこれから公開を行います。

circleci orb publish orb.yml testorb/testorb@dev:first

このコマンドによりorbは公開準備状態になります。公開するためには再度以下のコマンドを実行します。

circleci orb publish promote testorb/testorb@dev:first patch

firstの部分は開発チーム側で識別しやすいものであればなんでもOKです。例えば1.0.0でも大丈夫です。これで公開が行われました。以下のコマンドで一覧が確認可能です。

circleci orb list testorb
circleci orb list testorb                                 
Orbs found: 1. Showing only certified orbs.
Add --uncertified for a list of all orbs.

testorb/hello (0.0.1)

In order to see more details about each orb, type: `circleci orb info orb-namespace/orb-name`

Search, filter, and view sources for all Orbs online at https://circleci.com/developer/orbs/

バージョンは0.0.1から上書きされるたびに数字が増えていきます。ドキュメント上はこのバージョンを例えば1.0.0などにそろえるパラメータは存在しないようです

minor と major オプション

patchではなくminormajorを使うことで明示的にバージョンを指定できないものの、ある程度の操作が可能です。例えば以下を実行してみます。

circleci orb publish promote testorb/testorb@dev:first major

初回のmajorバージョン公開でtestorb/testorb (1.0.0)となります。次にminorを実行するとtestorb/testorb (1.1.0)となります。

5. テスト

作成されたorbであるtestorb/testorb (1.1.0)config.ymlから呼び出せます。

config.yml
version: 2.1

# orbの読み込み
orbs:
  greeting: testorb/testorb@1.1.0  # 実際のnamespaceとorb名に置き換えてください

# ワークフローの定義
workflows:
  test-greeting:
    jobs:
      - greet-job

# ジョブの定義
jobs:
  greet-job:
    docker:
      - image: cimg/base:stable
    steps:
      - greeting/greet:
          to: "CircleCI"  # パラメータを指定(省略可能、デフォルトは"World")

このようにorbを呼び出すとCircleCIがorb.ymlの<< parameters.to >>に引き渡されHello Worldが表示されます。

6. Nodeのインストール

ではorb.ymlの中身を以下に置き換えます。

orb.yml
version: 2.1
description: A greeting command orb with Node.js installation

commands:
    greet:
        description: Greet someone with a "hello" and install Node.js
        parameters:
            to:
                type: string
                default: World
            node_version:
                type: string
                default: "20"
                description: Node.js version to install
        steps:
            - run:
                name: Install Node.js
                command: |
                    # Node.jsのインストール(Ubuntu/Debian系)
                    curl -fsSL https://deb.nodesource.com/setup_<< parameters.node_version >>.x | sudo -E bash -
                    sudo apt-get install -y nodejs
                    
                    # インストール確認
                    echo "Node.js version: $(node --version)"
                    echo "npm version: $(npm --version)"
            - run:
                name: Greet with Node.js
                command: |
                    echo "Hello << parameters.to >>"
                    echo "Node.js << parameters.node_version >> is now installed!"
                    node --version

<< parameters.node_version >>で指定されたバージョンのNodeをインストールします。指定されない場合はデフォルトで20をインストールします。
ではこのorbを呼び出すconfig.ymlを以下に書き換えます。

config.yml
version: 2.1

# orbの読み込み
orbs:
  greeting: your-namespace/your-orb@1.0.0  # 実際のnamespaceとorb名に置き換えてください

# ワークフローの定義
workflows:
  test-greeting:
    jobs:
      - greet-job

# ジョブの定義
jobs:
  greet-job:
    docker:
      - image: cimg/base:stable
    steps:
      - greeting/greet:
          to: "CircleCI"  # パラメータを指定(省略可能、デフォルトは"World")
          node_version: "18"  # Node.jsバージョン指定(省略可能、デフォルトは"20")

こうすることでorb内部で指定されているNodeバージョンの20がconfig.ymlの18に上書きされます。

Discussion