🎉

Renderで動いているRailsでrake taskを定期実行したい

2024/08/10に公開

RenderでRailsのrake taskを定期実行をしたく、その時の実装メモ。(ちなみにDockerを使ってます)

Railsのrake taskをRender.comで定期実行する

順番に書いていく

ヘッダーメニューから「Cron Job」を選択する

『New +』を押下する。

『Cron Job』を押下する。

Cron Jobを設定したいリポジトリを選択する

以下の項目を設定する

  • Name: rake taskの名前
  • Region: Singapore
  • Branch: cron jobを使うブランチを選択
  • Runtime: 今回はDockerを選択
  • Schedule:タスクの実行時間をcron形式で入力

ちなみにRenderはデフォルトでUTC(協定世界時)を使用しているため、日本時間に変更する必要がある。

具体的にはUTC+9時間に設定すれば良い。
今回は毎日7時、11時、15時、19時に定期実行したかったので、Scheduleには0 22,2,6,10 * * *と設定した。

Docker Commandを設定する

次にrake taskの実行コマンドが書かれたshファイルのパスをDocker Commandに設定する。
hogehoge_task.shファイルを作って、以下のような記述をすればOK。

#!/bin/sh
set -e

bundle exec rake tasks:execute # 定期実行したいタスクを起動するコマンドを記述する

Dockerfileの修正

↑で作ったhogehoge_task.shファイルをDockerfileに記述する。
これをやっておかないとCron jobが定期実行されないので注意。

FROM ruby:3.1.3

ENV APP_ROOT /myapp

RUN mkdir $APP_ROOT

WORKDIR $APP_ROOT

COPY docker/deploy/production/entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh

COPY Gemfile $APP_ROOT/Gemfile
COPY Gemfile.lock $APP_ROOT/Gemfile.lock

RUN apt-get update -qq \
    && apt-get install -y build-essential libpq-dev \
    && bundle config set --local without 'development test' \
    && bundle install

COPY . $APP_ROOT
COPY hogehoge_task.sh $APP_ROOT/hogehoge_task.sh
RUN chmod +x $APP_ROOT/hogehoge_task.sh

ENTRYPOINT ["entrypoint.sh"]

EXPOSE 8080

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

Cron jobを作成する

『Create Cron Job』を押下する。

これでrake taskが定期実行されるようになるはず。

Discussion