CI BuildKite で GitHub からリポジトリをクローンして内部の hello.sh を実行する
Tags: ci, buildkite, pipeline
Published: 2022-10-20 15:29:00


## why

パイプラインに強くなりたい
インフラ強くなりたい

---

## BuildKite とは？

https://buildkite.com/

クラウド上で動く実行環境。
時間指定で実行できる。

主に定期的にビルドしてデプロイするために使われるらしい。

自動テストの定期実行や、定期的な取り込み処理にも使える。

---

## パイプラインとは？

BuildKite でのプロジェクトのひとまとまり。

---

## Agent とは？

https://buildkite.com/docs/agent/v3

ローカルにインストールして、CUI でパイプラインを動かすためのものらしい。

---

## パイプラインのガワの作成

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yuy8j34dx40y8x4bfceg.png)

サインアップしてパイプラインを作成する


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gc0nb2q8x3b2vuri30fx.png)


Git リポジトリとの連携を求められるので
hello.sh が入っている sh のリポジトリ

https://github.com/kaede0902/sh

を連携した

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0pqs1rpi89dr595n3n5t.png)

同時に最初のステップも作成できる。
ステップとラベルだけ入力しておく。

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7t5mdcjacw84q01z8oz5.png)

これでパイプラインと、中身のステップとラベルができた。

Yaml で編集するボタンを押して

```bash
steps:
  - command: ./hello.sh
    label: "print hello.sh"
```

リポジトリ内部の hello.sh を実行する処理を書いた。

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5z9fyi9fdtlllqzklaok.png)

これを動かすためには Agent をローカルにインストールして
Agent からパイプラインを一度叩く必要が有る。

---

## Agent のインストールと有効化

https://buildkite.com/docs/agent/v3/ubuntu

BuildKite の GPG key? Public Key? を import してきて
keysaver に送ったりする。

k8s, k3d のインストールに似ている。

```php
❯ sudo apt-get update && sudo apt-get install -y buildkite-agent   

Setting up buildkite-agent (3.39.1-4608) ...
 _           _ _     _ _    _ _                                _
| |         (_) |   | | |  (_) |                              | |
| |__  _   _ _| | __| | | ___| |_ ___    __ _  __ _  ___ _ __ | |_
| '_ \| | | | | |/ _` | |/ / | __/ _ \  / _` |/ _` |/ _ \ '_ \| __|
| |_) | |_| | | | (_| |   <| | ||  __/ | (_| | (_| |  __/ | | | |_
|_.__/ \__,_|_|_|\__,_|_|\_\_|\__\___|  \__,_|\__, |\___|_| |_|\__|
                                               __/ |
                                              |___/

You now need to add your agent token to "/etc/buildkite-agent/buildkite-agent.cfg"
```

GPG key を登録したら、apt-get で
buildkite-agent をインストールする

```php
❯ sudo sed -i "s/xxx/YOUR_AGENT_TOKEN/g" /etc/buildkite-agent/buildkite-agent.cfg         
```

configure する設定のファイルに、エージェントトークンを書き込む

API リクエストするときの BearToken とは別のトークン。

```php
sudo systemctl enable buildkite-agent && sudo systemctl start buildkite-agent
```

そして buildkite-agent を有効化すると

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/87dsxvnxqyxiqxt9iojy.png)

サイトで通知される。
紙吹雪が vercel みたいだ...

---

## パイプラインを curl で実行する

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wuiv2lf20xia3ktrdnk5.png)

buildkite-agent のインストールと有効化が終わり
パイプラインの管理画面に戻ると

curl をたたけと言われる。

```php
curl -H "Authorization: Bearer $TOKEN" "https://api.buildkite.com/v2/organizations/kaede-dot-dev/pipelines/test-sh/builds" \
  -X "POST" \
  -F "commit=HEAD" \
  -F "branch=master" \
  -F "message=First build :rocket:"
```

ここに buildkite のエージェントのトークンを入れて
リクエストするらしい。

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/799uo48sbiy2kp49krwc.png)

Slack と同じように、用途を絞って API トークンを発行する。

これを入れて さっきの curl リクエストすると

JSON でパイプラインの情報が返ってくる。

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v6dz7mfsbsoxd9y6pwgn.png)

パイプラインを見ると起動されているのがわかる。
しかし、ssh の設定をしていないので、
GitHub からリポジトリが clone できていない。

---

## buildkite での実行環境の公開鍵を GitHub に登録する

https://buildkite.com/docs/agent/v3/ssh-keys#creating-a-single-ssh-key

buildkite-agent ローカルのターミナルで動かすと、
パイプラインが実際実行されるリモートの Ubuntu のマシンにアクセスできる
そこで Public key の登録とかをできると推測。

```php
sudo su buildkite-agent
```

buildkite-agent で sh に入って

```php
mkdir -p ~/.ssh && cd ~/.ssh
ssh-keygen -t rsa -b 4096 -C "dev+build@myorg.com"
```

> Generating public/private rsa key pair.

dev+build というメアドで rsa キーを生成する

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yi2i0tyqbkeds6igjs4i.png)

このキーを GitHub の pubkey 置き場に登録する

これで GitHub から SSH で Clone できるようになった。

---

## パイプラインを GUI と CUI で実行する

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y2fcrxbffmgduf7hj3hn.png)

GUI での Build Now ボタンでも実行できるし

```bash
curl -v -H "Authorization: Bearer yourApiToken" "https://api.buildkite.com/v2/organizations/your/pipelines/test-sh/builds" \
  -X "POST" \
  -F "commit=HEAD" \
  -F "branch=master" \
  -F "message=curl build request"
```

curl でのそのパイプラインのエンドポイントへの POST でも

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4ockjactq1639qnsrug0.png)

BuildKite のパイプラインを実行することができた。

---

## 定期実行

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oz8quyvv5h0cqws66yie.png)

パイプラインの schedule タブから設定できる。
Jenkins と違って cron だけでなく, daily, hourly, midnight などとわかりやすいタグで頻度をつけられる。

---

## まとめ

Buildkite でパイプラインを作成し、その中で連携された GitHub リポジトリの中身のシェルを実行するには

1. GitHub と連携してパイプラインを作り
2. 公開鍵の設定をして buildkite が GitHub リポジトリを clone できるようにして
3. GitHub リポジトリの中身のシェルを実行するパイプラインのステップを yaml で書いて 
4. ローカルに BuildKiteAgent をインストールして、パイプラインを有効化するリクエストを投げて
5. パイプラインのボタンか curl リクエストでパイプラインのビルドを行わせる。または定期実行の設定をする。

以上。