ansible で private な GitHub Releases からファイルをダウンロードする方法

GitHub の private リポジトリで開発を進めている Golang プロジェクトがあります。CiecleCI 上でビルドを行ってバイナリファイルを GitHub Releases にアップロードしているものがあります。 これまでは「手動で最新版ファイルをダウンロードして ansible でデプロイする」といった方法を取っていました。都度行うには手間なので ansible の playbook 1発で実行させたくなりました。 実行したい処理 特定の GitHub Releases から最新版のファイルをダウンロード ansible 実行対象サーバのファイルと差し替え GitHub Releases の各バージョンには 1 ファイルのみ アップロードされている状態 準備 GitHub の API にアクセスする必要があるため Personal Access Token を取得します。管理画面 から新しいトークンの作成ができます。権限は 1 番上の repo にチェックを入れるだけです。 取得したトークンを環境変数に設定します。(実際には direnv を使っています) $ export GITHUB_TOKEN=YOUR-GITHUB-TOKEN 参考 playbook - name: private な github releases からファイルをダウンロードする hosts: all vars: github: user: 'USER-NAME' # 対象リポジトリのユーザ名 repos: 'REPOSITORY-NAME' # 対象リポジトリ名 token: "{{ lookup('env', 'GITHUB_TOKEN') }}" # 環境変数 GITHUB_TOKEN をロード dest: '/path/to/savepath' # DL したファイルの保存先パス tasks: - name: '{{ github.user }}/{{ github.repos }} 最新版情報取得' uri: url: 'https://api.github.com/repos/{{ github.user }}/{{ github.repos }}/releases/latest' HEADER_Authorization: 'token {{ github.token }}' return_content: yes body_format: json register: response # 最新版の情報を取得 - name: GitHub API からダウンロード用 URL 取得 uri: url: '{{ response.json.assets[0].url }}' HEADER_Authorization: 'token {{ github.token }}' HEADER_Accept: 'application/octet-stream' follow_redirects: no return_content: yes body_format: json status_code: 302 register: response # DL 対象ファイルの URL を取得 - name: '{{ github.user }}/{{ github.repos }} からファイルをダウンロード' get_url: url: '{{ response.location }}' dest: '{{ github.dest }}' force: yes owner: root group: root mode: 0500 become: True 処理手順 uri モジュールを使って最新版リリース情報を取得 レスポンス: Get the latest release 取得したいファイルは 1 つだけなので, assets の 0 番の URL が処理対象 uri モジュールで 1 で取得した JSON を使って DL 対象の URL にアクセス レスポンス: Get a single release asset status: 302 が返り, レスポンスヘッダの Location に DL 用 URL が書かれている 2 のレスポンスヘッダ Location に記載されている URL にアクセスしファイル取得 本来なら 1 のデータ取得後に get_url モジュールで 2 へアクセスすればファイルが落とせそうな気がします。しかし get_url が HTTP Status: 302 Found のリダイレクトにエラーを吐くので, 直接レスポンスの Location を見て DL しています。 ...

2016/12/01 · Yuya MATSUSHIMA

middleman-vcs-time で正確な sitemap.xml を出力する

Middleman で Web サイトを作る場合, sitemap.xml の lastmod はビルドされ出力される時刻に統一されてしまいます。 sitemap.xml の仕様を考えると可能な限り lastmod は正しい時刻が望ましいです。現在開発中サービスの都合もあり「どうすれば正確な時刻を出力できるか?」と思い悩んでしばらく時間が経ってしまいました。 Twitter で rubygems middleman で検索して眺めていたところ, この問題を解決してくれそうな拡張機能がひっそりリリースされていることに気づきました。 middleman-vcs-time | RubyGems.org middleman-vcs-time 概要 README によると, Provides means to look up the last-modified times of Middleman sitemap resources according to version control. Supports Git with a fallback to filesystem metadata. README.md: https://github.com/AndrewKvalheim/middleman-vcs-time/blob/master/README.md とのことで, VCS (Git など) の最終変更時刻をベースに Middleman の sitemap リソースを書き替えてくれるようです。現状では Git をサポートし, フォールバックとしてファイルのメタデータを参照します。とのことで。 sitemap リソースについて sitemap リソースはドキュメントでいうと サイトマップ のことです。 Middleman は Web サイトデータを出力する前にビルド対象のファイルを収集し, sitemap リソースというデータを用意してからファイル出力を行います。この sitemap リソースは各ページのタイトル, 元ファイルパス, 出力先ファイルパスやら何やらのデータを持っています。この sitemap まわりは拡張機能の開発や凝ったサイト構成にならないと関わらない部分なので難しいです。 ...

2016/11/29 · Yuya MATSUSHIMA

Hugo でブログ始めました

過去に e2esound.com 業務日誌 や 技術ブログ | e2esound.com を書いてきました。諸事情重なった上に検討したところ「事業とは別でブログを用意しておいた方が良さそう」という結論に至ったので新しいブログを始めました。 このブログの開始に伴って 2 つのブログは更新を停止しています。 このサイトの技術構成 今のところではありますが, 現状では次の構成です。 Golang 製静的サイトジェネレータ Hugo デザインは hugo-zen をベースに syntax highlight を Pygments ベースに変更 リポジトリ github の private repos デプロイ CircleCI で github の master ブランチを awscli で処理 サーバ AWS S3 AWS CloudFront AWS CertificateManager AWS Route53 最近増えているらしい静的サイトベースのブログサイトで, とりあえず一通り自動化してる。といった構成になっています。 なぜ Hugo なのか いつもであれば静的サイトジェネレータには Middleman を採用していますが, 今回は Go 言語ベースの Hugo にしました。 Hugo は Golang ベースで作られているため Win, Mac 環境問わず動作し, 尚且つ処理が高速らしい噂を耳にして Middleman のユーザとしては気になる存在でした。 今回は私個人のブログサイトなので更新時に一緒に作業する人の学習コストを無視でき, このところ Go 言語を書いている都合 Go のプロダクトをいじっておきたいという気持ちもありました。 ...

2016/11/22 · Yuya MATSUSHIMA