おでーぶでおでーぶ

いろいろ書く。いろいろ。

CircleCI の特定ブランチの特定jobのアーティファクトをダウンロードする

はい

#!/usr/bin/env bash

set -o pipefail
set -eu

export PRODUCTION_BRANCH="release"
export JOB_NAME="build"

latest_artifacts() {
    local -r build_num=$(curl -u "$CIRCLECI_TOKEN:" "https://circleci.com/api/v1.1/project/github/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/tree/$PRODUCTION_BRANCH?filter=completed" | \
      ruby -rjson -e 'puts JSON.parse(STDIN.read).find { |j| j["build_parameters"]["CIRCLE_JOB"] == ENV.fetch("JOB_NAME") }["build_num"]')
    
    curl -u "$CIRCLECI_TOKEN:" "https://circleci.com/api/v1.1/project/github/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/$build_num/artifacts"
}

get_asset_url() {
    cat - | ruby -rjson -e 'puts JSON.parse(STDIN.read).select { |j| <a filter like `j["url"].include?(".apk")`> }.first["url"]'
}

download_asset() {
    local -r asset_url=$(latest_artifacts | get_asset_url)
    curl -o "$1" "$asset_url?circle-token=$CIRCLECI_TOKEN"
}

download_asset "$1"

GETでbranchを絞る方法はAPI Docになかったけれど、POSTの方法を参考にしたらちゃんとfilterされた。今後動かなくなるかもしれない。

https://circleci.com/docs/api/v1-reference/