たんぶるぐりーふ

プログラミングなど。

CircleCIでGithub上のREADME.mdの更新を自動化する

はじめに

最近TIL(Today I Learned)という文化を知り、実践し始めました。

github.com

なるほど、ブログを書くより気軽に進捗や知識の貯蔵ができるのでこれは便利です。

どうせやるなら見た目をかっこよくしようと思いまして、

GitHub - jbranchaud/til: Today I Learned

のREADME.mdのようなものを置いてみたのですが、これを手動で更新するのは非常にめんどくさい。

ということでつい最近触り始めたCircleCIで自動更新することにしました。

README.mdの自動生成

shell scriptの作成

まずはshell scriptを作成しました。

generate_readme.sh

echo "# til" >README.md
echo "">>README.md
echo "> Today I Learned" >>README.md
echo "">>README.md
TIL_COUNT=`find . -type f -name "*.md" | wc -l`
echo "${TIL_COUNT##* } TILs and counting..." >>README.md
echo "">>README.md
echo "---">>README.md

function file_echo () {
  find $1 -maxdepth 1 -type f -name "*.md" | while read FILE ; do
    local FILE2=`echo "${FILE##*/}" | sed -e "s/\.md//"`
    local GITHUB_URL="https://github.com/pandorina1013/til/blob/master/"
    echo "- [$FILE2]($GITHUB_URL${FILE##*./})" >>README.md
  done
}

function folder_echo () {
  find $1 -maxdepth 1 -type d | grep -e "[^.].*" | while read DIR ; do
    if test "$DIR" != "$1" ; then
      local MD_FILE_LIST=`find $DIR -type f -name "*.md"`
      if test "$MD_FILE_LIST" == "" ; then
        continue
      fi
      local HEADING="##"
      if test $2 != 0 ; then
        for i in `seq 1 $2` ; do
          HEADING+="#"
        done
      else
        echo "" >>README.md
      fi
      echo "$HEADING ${DIR##*/}" >>README.md
      local MD_FILE_LIST2=`find $DIR -mindepth 1 -type f -name "*.md"`
      if test "$MD_FILE_LIST2" != "" ; then
        folder_echo "$DIR" `expr $2 + 1`
      fi
      local MD_FILE_LIST3=`find $DIR -maxdepth 1 -type f -name "*.md"`
      if test "$MD_FILE_LIST3" != "" ; then
        echo "" >>README.md
        file_echo "$DIR/"
      fi
    fi
  done
}

folder_echo . 0

最初はローカルで

sh generate_readme.sh

してからgit commitしていたのですがこれもめんどくさい。

そこでCricleCIでmaster branchの変更を検知して自動で走らせてもらうことにしました。

config.ymlの設定

CircleCIで自分のプロジェクトを対象に追加します。

tilリポジトリ.circleci というフォルダを追加し、その中に config.yml というファイルを作成します。

config.yml

version: 2
jobs:
  build:
    docker:
      - image: circleci/<使うやつ>
    steps:
      - checkout
      - run: bash generate-readme.sh
      - run: git config user.name "CircleCI"
      - run: git config user.email "circleci@gh.com"
      - run: git add README.md
      - run: git commit -m 'Update README.md [ci skip]'
      - run: git push origin master
workflows:
  version: 2
  build_and_test:
    jobs:
      - build

注意: commit commentの中に [ci skip] を入れないとCircleCIが自分自身の変更も検知して無限に作動し続けます。これで僕は冷や汗をかきました。

CircleCIの設定

https://circleci.com/gh/ にアクセスし、CircleCI側の設定を行います。

まずCircleCIを動作させるリポジトリ(ここではtil)を設定します。 Add Projects から選ぶことができます。

次に、githubSSH keyを取得する必要があります。 Settings -> <user> -> til -> Checkout SSH keys へと移動し, SSH keyの発行をします。

発行できたら準備完了です。こんな感じで動くようになります

おわりに

til続けていけたらなと思います。英語がガバガバなのは気にしないでください。頑張ります...