drone.io からansible playbookを流し込む

この記事は drone.io Advent Calendar 2017 - Adventar の10日目の記事です。

drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。

github.com

昨日の記事で他のホストにsshする方法をご紹介しましたが、 応用技でansible playbookを流し込んでみようと思います。

好きなイメージでsshする

droneからsshする場合は SSH | Plugins | Drone を利用する方法がありますが、この場合すきなイメージを指定することができません。 droneからansible playbookを流し込みたいと思った場合、ansibleが入ったイメージを利用しなければなりません。そこで

まずは前回の記事を参照して公開鍵と秘密鍵を設定しましょう。

ashphy.hateblo.jp

次に利用するイメージですが williamyeh/ansible を利用します。各OSごとのイメージも利用されており、改造もしやすいと思います。

.drone.yml は以下のようになります。

pipeline:
  ansible:
    image: williamyeh/ansible:alpine3
    secrets: [ ssh_key ]
    environment:
      - ANSIBLE_HOST_KEY_CHECKING=False
    commands:
      - echo "$SSH_KEY" > deploy_key && chmod 600 deploy_key
      - "ansible-playbook -i hosts playbook.yml --private-key=deploy_key"

まずは secrets を指定することで公開鍵が環境変数 $SSH_KEY に展開されます。これをファイルに書き足して、ansible-playbookに食わせてあげます。 $SSH_KEY を ""で囲うのと、パーミッションの変更を忘れないようにしましょう。

イメージをそのまま利用する場合はHost Key Checkingで弾かれてしまうので、上記のように無効化するか、焼いたイメージを作るかします。

環境変数を経由して鍵を設定する方法はなんにでも使えるので、各種deployに応用が効くはずです。

drone.io でsshしてあれやこれやする

この記事は drone.io Advent Calendar 2017 - Adventar の9日目の記事です。

drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。

github.com

droneはテストを走らせるのが主な機能ですが、簡易的ではありますがデプロイを行うこともできます。

drone-ssh plugin

まずはデプロイ用の鍵を作成します。パスフレーズ入れられないので、パスフレーズなしで作成してください。

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

公開鍵はデプロイ先に仕込んでください。秘密鍵はdroneに設定します。 リポジトリの画面から「Secrets」を開いてSecret Namessh_key、 Secret Value秘密鍵をコピペして保存してください。

f:id:ashphy22:20171206233734p:plain

さて SSH | Plugins | Drone の設定を.drone.ymlに追加しましょう。

pipeline
  deploy:
    image: appleboy/drone-ssh
    host: example.com
    username: 'root'
    port: 22
    secrets: [ ssh_key ]
    script:
      - echo hello
    when:
      branch: master

secrets: [ ssh_key ]秘密鍵を指定します。 scriptには実行したいコマンドを書きますが、複数行書けるのであとはなんでもできます。

whenでmasterブランチへの変更時にのみに設定すればプルリクエストをマージしたときに自動でデプロイをする設定も実現できます。

drone.io でくさってしまったビルドキューをお掃除する

この記事は drone.io Advent Calendar 2017 - Adventar の8日目の記事です。

drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。

github.com

くさったビルドキューをお掃除する

みなさんはdroneのビルドキューのモニタリング/監視をしていますか? drone を複数の利用者に開放していると実行中、実行待ちのビルドを計測しておくと実行ノード数が足りているか知ることができます。 またたまにビルドが実行状態になったままずっと進まなくなることがあり、監視を入れておくとなにかあった場合に気付くことができます。

さてそのような場合にdroneを再起動したりするのですが、running 状態のままagentでも処理されないビルドがたまったままとなることがあります。

DBを直接いじって直す方法をご紹介します。drone v0.8でsqlite3利用の場合です。

くさったビルドを表示

SELECT repo_owner, repo_name, repo_private, build_branch, datetime(build_enqueued, 'unixepoch') FROM builds b, repos r WHERE b.build_repo_id = r.repo_id AND b.build_status = "running" AND b.build_enqueued < strftime('%s', 'now', '-1 day');

くさったビルドを失敗させます

UPDATE builds SET build_status = "error" where build_status = "running" AND build_enqueued < strftime('%s', 'now', '-1 day');

-1 day のところはタイムアウト値に応じて適時調節してください。

drone.io で利用者をリストしたい

この記事は drone.io Advent Calendar 2017 - Adventar の7日目の記事です。

drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。

github.com

利用者をリストしたい

複数の利用者に開放してるとメンテナンス等で利用者の一覧が欲しくなることがあります。 利用者のリストを取得する方法をご紹介しましょう

CLIツールを利用する

まずはAPIアクセス用のトークンを https://drone.example.com/account/token から取得します。もちろん管理者のアカウントで。

$ DRONE_SERVER=http://drone.example.com DRONE_TOKEN=hogehoge... drone user ls

formatを指定すればメールアドレスも取れます。

$ drone user ls --format="{{ .Login }} <{{ .Email }}>"
DBを直接のぞく

CLIツール入れるのメンドイよって場合もあると思うんでSQL置いていておきます。

$ sqlite3 drone.sqlite 'select user_login, user_email from users;'

drone.io v0.8でGithub Enterprise上でのビルドステータスが更新されない問題を直す

この記事は drone.io Advent Calendar 2017 - Adventar の6日目の記事です。

drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。

github.com

Github Enterprise上でのビルドステータスが更新されない問題

drone v0.8を使うとなぜかテストが終わってもpendingステータスのまま更新されなくなりました。

f:id:ashphy22:20171205215157p:plain

その場合は起動時の環境変数 DRONE_HOST を見直してみましょう

environment:
  - DRONE_OPEN=true
  - DRONE_HOST=drone.example.com

もし上のように書いてしまっていた場合は schema を追加しましょう

environment:
  - DRONE_OPEN=true
  - DRONE_HOST=https://drone.example.com

f:id:ashphy22:20171205220458p:plain

きっと直るかも!?

drone.io テストが通ってないプルリクエストのマージを禁止したい

この記事は drone.io Advent Calendar 2017 - Adventar の5日目の記事です。

drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。

github.com

テストが通ってないプルリクエストのマージを禁止したい

Github Entepriseと連携しているとプルリクエストにビルドの状態も表示され便利です。

f:id:ashphy22:20171204224401p:plain

しかしこのままだとビルドが通っていなくてもマージできてしまいます。

Protected branches を利用する

GitHub Enterprise には「Protected branches」と呼ばれる機能があり、特定のブランチへのマージ、プッシュを制限することができます。リポジトリSettingsから設定できます。

f:id:ashphy22:20171204224745p:plain

今回はmasterをデフォルトブランチとして設定した場合の例をご紹介します。

f:id:ashphy22:20171204224954p:plain

Require status checks to pass before merging にチェックを入れるとテストが通った場合のみマージできるようになります。 Include administrators にもチェックを入れておけば管理者を含め全員にこの制約を強制することができます。

drone.io 手元でテストしたい

この記事は drone.io Advent Calendar 2017 - Adventar の4日目の記事です。

drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。

github.com

さてdroneはコンテナ環境でのテスト実行なので、手元とは異なる挙動を示すことがあります。特にイメージを自分でビルドする場合など、何度もトライアンドエラーをしたい場合に毎回コミット&プッシュをするのは非常に手間になります。

実はdrone.ioにはコマンドラインツールが用意されており、手元で同じようにテストを実行する事ができます。

CLI Installation

brew tapに置いてあるやつは古いので新しいdroneで使う場合はバイナリを落としましょう。 droneのバージョンによって結構挙動が変わってくるので、サーバ側のバージョンと合わせておくのをおすすめします。

基本的にリポジトリのあるディレクトリでdrone execをすればよいですが、 いくつかのオプションを設定することができます。

$ ~/Downloads/drone exec -h
NAME:
   drone exec - execute a local build

USAGE:
   drone exec [command options] [arguments...]

OPTIONS:
   --local                            build from local directory [$DRONE_LOCAL]
   --timeout value                    build timeout (default: 1h0m0s) [$DRONE_TIMEOUT]
   --volumes value                    build volumes [$DRONE_VOLUMES]
   --network value                    external networks [$DRONE_NETWORKS]
   --privileged value                 privileged plugins (default: "plugins/docker", "plugins/gcr", "plugins/ecr")
   --workspace-base value             (default: "/pipeline") [$DRONE_WORKSPACE_BASE]
   --workspace-path value             (default: "src") [$DRONE_WORKSPACE_PATH]
   --netrc-username value              [$DRONE_NETRC_USERNAME]
   --netrc-password value              [$DRONE_NETRC_PASSWORD]
   --netrc-machine value               [$DRONE_NETRC_MACHINE]
   --system-arch value                (default: "linux/amd64") [$DRONE_SYSTEM_ARCH]
   --system-name value                (default: "pipec") [$DRONE_SYSTEM_NAME]
   --system-link value                (default: "https://github.com/cncd/pipec") [$DRONE_SYSTEM_LINK]
   --repo-name value                   [$DRONE_REPO_NAME]
   --repo-link value                   [$DRONE_REPO_LINK]
   --repo-remote-url value             [$DRONE_REPO_REMOTE]
   --repo-private value                [$DRONE_REPO_PRIVATE]
   --build-number value               (default: 0) [$DRONE_BUILD_NUMBER]
   --parent-build-number value        (default: 0) [$DRONE_PARENT_BUILD_NUMBER]
   --build-created value              (default: 0) [$DRONE_BUILD_CREATED]
   --build-started value              (default: 0) [$DRONE_BUILD_STARTED]
   --build-finished value             (default: 0) [$DRONE_BUILD_FINISHED]
   --build-status value                [$DRONE_BUILD_STATUS]
   --build-event value                 [$DRONE_BUILD_EVENT]
   --build-link value                  [$DRONE_BUILD_LINK]
   --build-target value                [$DRONE_BUILD_TARGET]
   --commit-sha value                  [$DRONE_COMMIT_SHA]
   --commit-ref value                  [$DRONE_COMMIT_REF]
   --commit-refspec value              [$DRONE_COMMIT_REFSPEC]
   --commit-branch value               [$DRONE_COMMIT_BRANCH]
   --commit-message value              [$DRONE_COMMIT_MESSAGE]
   --commit-author-name value          [$DRONE_COMMIT_AUTHOR_NAME]
   --commit-author-avatar value        [$DRONE_COMMIT_AUTHOR_AVATAR]
   --commit-author-email value         [$DRONE_COMMIT_AUTHOR_EMAIL]
   --prev-build-number value          (default: 0) [$DRONE_PREV_BUILD_NUMBER]
   --prev-build-created value         (default: 0) [$DRONE_PREV_BUILD_CREATED]
   --prev-build-started value         (default: 0) [$DRONE_PREV_BUILD_STARTED]
   --prev-build-finished value        (default: 0) [$DRONE_PREV_BUILD_FINISHED]
   --prev-build-status value           [$DRONE_PREV_BUILD_STATUS]
   --prev-build-event value            [$DRONE_PREV_BUILD_EVENT]
   --prev-build-link value             [$DRONE_PREV_BUILD_LINK]
   --prev-commit-sha value             [$DRONE_PREV_COMMIT_SHA]
   --prev-commit-ref value             [$DRONE_PREV_COMMIT_REF]
   --prev-commit-refspec value         [$DRONE_PREV_COMMIT_REFSPEC]
   --prev-commit-branch value          [$DRONE_PREV_COMMIT_BRANCH]
   --prev-commit-message value         [$DRONE_PREV_COMMIT_MESSAGE]
   --prev-commit-author-name value     [$DRONE_PREV_COMMIT_AUTHOR_NAME]
   --prev-commit-author-avatar value   [$DRONE_PREV_COMMIT_AUTHOR_AVATAR]
   --prev-commit-author-email value    [$DRONE_PREV_COMMIT_AUTHOR_EMAIL]
   --job-number value                 (default: 0) [$DRONE_JOB_NUMBER]