wercker で docker コンテナを使って jekyll を build, deploy する

  • 18 Jan 2021

先日、Jekyll をコンテナで build する構成に変更したので、wercker.yml もそれに合わせて変更しました。

概要

wercker.yml で docker コンテナを利用して Jekyll をビルドし、それをデプロイする方法を解説します。あとちょいちょいエラーではまったのでそのあたりはエラーメッセージとともに補足します。

結論(wercker.yml)

wercker.yml はこんな感じ。

build と deploy で使う box を分けています。 build は jekyll/jekyll で deploy は alpine を利用しています。 ビルド用で デプロイ

build:
  box:
    id: jekyll/jekyll
    username: $DOCKER_USERNAME
    password: $DOCKER_PASSWORD

  steps:
    - script:
        name: preparation
        code: |
          mkdir _site
          mkdir .jekyll-cache
          jekyll build --trace
deploy:
  box: 
    id: alpine
    username: $DOCKER_USERNAME
    password: $DOCKER_PASSWORD

  steps:
    - script:
        name: preparation
        code: |
          apk add openssh
          apk add rsync
          mkdir ~/.ssh/
          touch /etc/ssh/ssh_known_hosts 
          chmod 644 /etc/ssh/ssh_known_hosts 
       
    - mktemp:
        envvar: PRIVATEKEY_PATH

    - create-file:
        name: write key
        filename: $PRIVATEKEY_PATH
        content: $VPS_KEY_PRIVATE
        overwrite: true
        hide-from-log: true

    - script:
        name: transfer application
        code: |
          pwd
          ls -la
          ls _site
          rsync -avzr -e "ssh -i $PRIVATEKEY_PATH -o StrictHostKeyChecking=no -o UserKnownHostsFile=no" $WERCKER_ROOT/_site/* youruser@hostname:/path/your/site_dir/

ハマりどころ

docker コンテナへのリクエストが多すぎると怒られる

fetch failed to pull image ruby-node: API error (500): {"message":"toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit"}

docker のコンテナを利用するにあたって docker hub のユーザーIDやパスワードを指定しない場合、上記のエラーにひっかかります(dockerhub は未ログインユーザーの APIアクセスレートは IP で判断している模様)。そこで box で docker のユーザーIDとパスワードを指定します。

  box:
    id: jekyll/jekyll
    username: $DOCKER_USERNAME
    password: $DOCKER_PASSWORD

$DOCKER_USERNAME$DOCKER_PASSWORD は wercker の Environment タグから設定しておいてください。

変数の設定

build 時にディレクトリ作成権限がないといわれる

build を実行すると .jekyll-cache_site の作成権限がないといわれます。

 `mkdir': Permission denied @ dir_s_mkdir - /pipeline/source/.jekyll-cache (Errno::EACCES)

wercker.yml を通して事前に作っておけば問題ないです。

  steps:
    - script:
        name: preparation
        code: |
          mkdir _site
          mkdir .jekyll-cache
          jekyll build --trace

alpine での rsync について

alpine はほぼ何も入っていないので ssh client からインストールする必要があります。

/root/.ssh does not exists, creating it
failed: /etc/ssh does not exist. Cause: ssh-client software probably not installed.

とか

/root/.ssh does not exists, creating it
/etc/ssh/ssh_known_hosts does not exists, touching it and chmod it to 644

とかのエラーメッセージですね。

これも事前に準備してしまいましょう。

    - script:
        name: preparation
        code: |
          apk add openssh
          apk add rsync
          mkdir ~/.ssh/
          touch /etc/ssh/ssh_known_hosts 
          chmod 600 /etc/ssh/ssh_known_hosts 

ってここまで書きましたが、近いうちに bitbucket pipline に移行します。

参考