drone.io からansible playbookを流し込む
この記事は drone.io Advent Calendar 2017 - Adventar の10日目の記事です。
drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。
昨日の記事で他のホストにsshする方法をご紹介しましたが、 応用技でansible playbookを流し込んでみようと思います。
好きなイメージでsshする
droneからsshする場合は SSH | Plugins | Drone を利用する方法がありますが、この場合すきなイメージを指定することができません。 droneからansible playbookを流し込みたいと思った場合、ansibleが入ったイメージを利用しなければなりません。そこで
まずは前回の記事を参照して公開鍵と秘密鍵を設定しましょう。
次に利用するイメージですが 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)環境です。
droneはテストを走らせるのが主な機能ですが、簡易的ではありますがデプロイを行うこともできます。
drone-ssh plugin
まずはデプロイ用の鍵を作成します。パスフレーズ入れられないので、パスフレーズなしで作成してください。
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
公開鍵はデプロイ先に仕込んでください。秘密鍵はdroneに設定します。
リポジトリの画面から「Secrets」を開いてSecret Name
に ssh_key、 Secret Value
に秘密鍵をコピペして保存してください。
さて 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)環境です。
くさったビルドキューをお掃除する
みなさんは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)環境です。
利用者をリストしたい
複数の利用者に開放してるとメンテナンス等で利用者の一覧が欲しくなることがあります。 利用者のリストを取得する方法をご紹介しましょう
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 Enterprise上でのビルドステータスが更新されない問題
drone v0.8を使うとなぜかテストが終わってもpendingステータスのまま更新されなくなりました。
その場合は起動時の環境変数 DRONE_HOST を見直してみましょう
environment: - DRONE_OPEN=true - DRONE_HOST=drone.example.com
もし上のように書いてしまっていた場合は schema を追加しましょう
environment: - DRONE_OPEN=true - DRONE_HOST=https://drone.example.com
きっと直るかも!?
drone.io テストが通ってないプルリクエストのマージを禁止したい
この記事は drone.io Advent Calendar 2017 - Adventar の5日目の記事です。
drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。
テストが通ってないプルリクエストのマージを禁止したい
Github Entepriseと連携しているとプルリクエストにビルドの状態も表示され便利です。
しかしこのままだとビルドが通っていなくてもマージできてしまいます。
Protected branches を利用する
GitHub Enterprise には「Protected branches」と呼ばれる機能があり、特定のブランチへのマージ、プッシュを制限することができます。リポジトリのSettings
から設定できます。
今回はmasterをデフォルトブランチとして設定した場合の例をご紹介します。
Require status checks to pass before merging
にチェックを入れるとテストが通った場合のみマージできるようになります。
Include administrators
にもチェックを入れておけば管理者を含め全員にこの制約を強制することができます。
drone.io 手元でテストしたい
この記事は drone.io Advent Calendar 2017 - Adventar の4日目の記事です。
drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。
さてdroneはコンテナ環境でのテスト実行なので、手元とは異なる挙動を示すことがあります。特にイメージを自分でビルドする場合など、何度もトライアンドエラーをしたい場合に毎回コミット&プッシュをするのは非常に手間になります。
実はdrone.ioにはコマンドラインツールが用意されており、手元で同じようにテストを実行する事ができます。
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]