Qiitaの記事をGitHubで管理してTravisCI経由で自動投稿する


Qiitaの記事はいつもローカルのテキストエディタで書いてコピペして投稿していました。

これがちょっとめんどくさい。

Qiitaの記事もGitで管理できた方が楽だよなーという思いもあって、
GitHubへのpushをトリガーにTravisCIを起動して、
Qiitaの記事を自動で投稿&更新できるようにしました。

今回の記事を作成するにあたり、以下の記事を大いに参考にさせていただいています。

この記事との違いはdeployスクリプトをrubyにしている点と、
自分が使いやすいように細かい部分を変えています。

環境イメージ

Qiita個人用アクセストークン取得

まずはQiita APIを使用するため、Qiitaの個人用アクセストークンを取得してメモしておきます。

Qiitaに投稿するスクリプトを作成

今回はRubyのQiita APIライブラリを使用しました。
必要なライブラリをGemfileに書いておきます。

Gemfile
gem 'qiita', '1.3.5'
gem 'json', '2.1.0'

デプロイ用のスクリプトも準備します。

deploy/deploy.rb
require "rubygems"
require "bundler/setup"
require "qiita"
require "json"

PARAMS_FILE_PATH = 'item/params.json'
ITEM_ID_FILE_PATH = 'item/ITEM_ID'
BODY_FILE_PATH = 'item/README.md'

client = Qiita:: Client.new(access_token: ENV['QIITA_TOKEN'])

params = File.open(PARAMS_FILE_PATH) do |file|
  JSON.load(file)
end
headers = {'Content-Type' => 'application/json'}

body = File.open(BODY_FILE_PATH) do |file|
  file.read
end

params['body'] = body

if File.exist?(ITEM_ID_FILE_PATH) then
  item_id = File.open(ITEM_ID_FILE_PATH) do |file|
    file.read
  end
  p client.update_item(item_id, params, headers)
else
  p client.create_item(params, headers)
end

タイトルやタグはitem/params.jsonで定義します。

item/params.json
{
    "title": "Qiitaの記事をGitHubで管理してTravisCI経由で自動投稿する",
    "tags": [
        {
            "name": "GitHub",
            "versions": []
        },
        {
            "name": "TravisCI",
            "versions": []
        }
    ],
    "coediting": false,
    "gist": false,
    "private": false,
    "tweet": false
}

item/ITEM_IDに更新したい記事のIDを保存しておくと、
そのIDの記事を更新するようにします。

item/ITEM_ID
2d76435434ac632fc6d4

デプロイ用のスクリプトでは以下の環境変数を使用しています。

  • QIITA_TOKEN - 個人用アクセストークン

そのため、メモしておいたQiitaの個人用アクセストークンを環境変数としてQIITA_TOKENに設定すれば、
ローカル環境からitem/README.mdの記事を投稿できるようになります。

# 環境変数の設定
$ export QIITA_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
# デプロイ用スクリプトの実行
$ bundle exec ruby deploy/deploy.rb

次はTravisCIを利用して自動投稿できるようにしましょう。

.travis.ymlの作成

travis init.travis.ymlの初期作成とTravis CIを有効化しましょう。

$ travis init
Main programming language used: |Ruby|
.travis.yml file created!
rednes/github2qiita: enabled :)

Qiitaの個人用アクセストークンは暗号化して.travis.ymlに追加します。

$ travis encrypt QIITA_TOKEN=XXXXXX --add

先ほど作成したデプロイスクリプトが自動で動くように記述します。
ついでにプルリクの時は動かないようにしておきます。

script:
  - 'if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then bundle exec ruby deploy/deploy.rb; fi'

ライブラリのインストールも記述しておきましょう。
何度もライブラリインストールするのも時間がかかるのでキャッシュを残すようにしておきます。

install: bundle install
cache:
  directories: vendor/bundle

masterブランチ以外のコミットでは動かないようにしておきます。

branches:
  only:
    - master

.travis.ymlを全部書くとこんな感じになります。

.travis.yml
language: ruby
rvm: 2.4.1
branches:
  only:
    - master
install: bundle install
cache:
  directories: vendor/bundle
script:
  - 'if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then bundle exec ruby deploy/deploy.rb; fi'
env:
  global:
    - secure: XXXXXX

最後にGitHubからTravisCI経由でQiitaに投稿される流れを確認しましょう。

GitHubからTravisCI経由での投稿

item/README.mdに記事が書けたらまとめてコミットしてgit pushします。

$ git add -A
$ git commit -m "Qiitaの記事をGitHubで管理してTravisCi経由で自動投稿する作成"
$ git push

GitHubへのgit pushをトリガーにTravisCIが動きます。

ビルドが終わるとQiitaに記事が投稿され、Qiitaへの自動投稿ができるようになりました。

今回の記事は以下のGitHubリポジトリから自動投稿しています。
興味のある方はこちらもどうぞ。