GitLab CIで定期的にRailsのyarnの更新を確認する方法

Tips
2020年02月27日 10:00

概要

Railsのプロジェクトで、フロントエンド周りのライブラリ管理としてyarnを使用しています。

ここでは、私が使っているGitLabでyarnの更新を定期的に確認する方法を紹介します。

環境

  • Rails 6.0
  • GitLab 12.7

なぜ定期的に確認するのか

最近の開発では、ライブラリを使うことが一般的です。

そのため、ライブラリの脆弱性やバグなども一緒に取り込むことになります。

つまり、定期的にライブラリを更新して脆弱性やバグの解消を行なっていく必要があります。

ライブラリの更新があるかの確認は、手動で行うこともできますが忘れてしまったり、後回しになったりすることもあります。

そこで、定期的に更新があるかを確認して、プロジェクトのIssueに登録することで更新忘れをなくすようにします。

更新の確認

今回、GitLabで管理されているプロジェクトで使うことを想定しています。

そのため、更新の確認や定期的な実行にはGitLab CIを使用します。

更新の確認のために、.gitlab-ci.ymlに次の内容を記述します。

check-outdated-yarn-package:
  image: ruby:2
  only:
    - schedules
  script:
    - curl -sL https://deb.nodesource.com/setup_12.x | bash -
    - apt-get update
    - apt-get install -y nodejs
    - curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
    - echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
    - apt-get update
    - apt-get install -y yarn
    - yarn global add yarn-outdated-formatter
    - wget https://gitlab.com/snippets/xxx/raw -O check-outdated-yarn.rb
    - ruby check-outdated-yarn.rb
  variables:
    ACCESS_TOKEN: $ACCESS_TOKEN

更新の確認は、yarnのコマンドを使用しています。
また、Issueの登録の際にMarkdownで登録することを目的に、yarn-outdated-formatterを使用しています。

Issueへの登録には、GitLabのWebAPIを使用しています。

そのため、Issueを登録できるユーザが発行したACCESS_TOKENを設定する必要があります。

設定は、セキュリティのためにプロジェクトのSettings > Variablesで行います。

更新の確認やIssueへの登録はRubyのスクリプトで行っています。
その関係で、CIで使うイメージはRubyをベースとしたものに、Node.jsやyarnをインストールして使っています。

スクリプトは、GitLabのスニペットを使用しています。各自でスクリプトをダウンロードできるようにして、URLを変更してください。

スクリプトは次のものです。

require 'net/http'
require 'json'

project_id = ENV['CI_PROJECT_ID']
private_token = ENV['ACCESS_TOKEN']
title = "Outdated yarn packages #{`date`}"

result = `yarn outdated --json | format-yarn-outdated -f markdown`

uri = URI.parse("#{ENV['CI_SERVER_URL']}/api/v4/projects/#{project_id}/issues")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme === 'https'

params = { title: title, description: result }
headers = { 'PRIVATE-TOKEN' => private_token, 'Content-Type' => 'application/json' }
response = http.post(uri.path, params.to_json, headers)

これで、更新を確認してIssueに登録できるようになりました。

定期的な実行

定期的な実行では、GitLab CIのSchedulesという機能を使っています。

Schedulesは、プロジェクトのCI/CD > Schedulesで行います。

Scheduelsでは、時刻を設定してCIを実行するための機能です。

適当な時刻を設定して、CIを実行するようにしましょう。

私の場合は、月1で更新の確認をするようにしています。

これで、定期的にyarnのパッケージの更新の確認ができるようになりました。

さいごに

古いバージョンのライブラリを使っていると、脆弱性の原因となります。

なるべく最新のものを使用できるようにして、少しでもセキュリティリスクを減らしていけたらいいなと思います。