CircleCIのREST APIを使って少し便利にCircleCIライフを送る

  • 5
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

本当はシークレットファイルのことを書こうと思ってたんですが
ネタが被ってしまったのでどうしようかと悩んだ結果
CircleCI用にシェルスクリプトに定義した関数を晒そうと思います。

かなり適当に書いたものなので、その筋の人が見たらマサカリ投げられそう((((゜゜))))

環境

OSXのEl Capitanで
zshで動かしてます
jqとpecoを使ってます。

CircleCIのSettingに行きAPI Tokenを作成しておきましょう

project一覧を取得してブラウザで開く

#!/bin/sh

CIRCLE_TOKEN="..."
CIRCLE_HOST="https://circleci.com/api/v1"

_circle_token="&circle-token=$CIRCLE_TOKEN"
open=$(which open)

function circle_projects() {
    url="$CIRCLE_HOST/projects?${_circle_token}"
    curl -s -H "Accept: application/json" $url | jq '.[] | "\(.username)/\(.reponame)"' | perl -nle '/^"(.+)"$/ and print $1'
}

function circle_open_project() {
    path=$(circle_projects | peco | awk '{print $1}')
    url="https://circleci.com/gh/$path"
    echo "open: $url"
    $open $url
}

CIRCLE_TOKENに作成したTokenを入れてください。

circle_open_projectを叩けばプロジェクト一覧が取得されそれをpecoを使って検索できます。

地味に便利で重宝してます。

環境変数の操作

function circle_env() {
    project=$1
    name=$2
    value=$3
    if [ ! -n "$project" ]; then
        echo "not project" > /dev/stderr
        return 1
    fi

    url="$CIRCLE_HOST/project/$project/envvar?${_circle_token}"

    if [ -n "$value" ]; then
        body="{\"name\":\"$name\",\"value\":\"$value\"}"
        curl -s -H "Accept: application/json" -H "Content-Type: application/json" -d $body $url > /dev/null
        echo ok
        return 0
    fi

    if [ -n "$name" ]; then
        method="GET"
        if [ "${name:0:1}" = ":" ]; then
            method="DELETE"
            name=${name:1:${#name}}
        fi

        url="$CIRCLE_HOST/project/$project/envvar/$name?${_circle_token}"
        res=$(curl -X $method -s -H "Accept: application/json" $url)
        if [ $method = "DELETE" ]; then
            echo ok
        else
            echo $res | jq .value | perl -nle '/^"(.+)"$/ and print $1'
        fi
        return 0
    fi

    curl -s -H "Accept: application/json" $url | jq '.[] | "\(.name) \(.value)"' | perl -nle '/^"(.+)"$/ and print $1'
}

使い方は第一引数にuser/repoの組み合わせを指定し

一覧を見るときは circle_env user/repo
値をセットするときは circle_env user/repo FOO bar
値を削除するときはKeyの先頭にコロンをつけて circle_env user/repo :FOO

という感じです。

隠したいファイルは
circle_env k2wanko/gtoken SECRET_FILE $(base64 ./secret_file)
で値をセットでき
circle.ymlに
echo $SECRET_FILE | base64 -D > ./secret_file
を追加すればデコードできます。

まとめ

ファイル全体はgistに上げました
https://gist.github.com/k2wanko/a4ad5c3b903f68f194b1

まだ無料版しか試せてないのでこんなぐらいですが
CircleCIはプライベートリポジトリとか関係なく利用できるし
ハイスペックなマシンで実行されるしSSHも繋がるのでポートフォワーディングすれば
httpサーバーにもアクセスできるので最高のCIサービスだと思います。