CINXE.COM
GitHub Actions で Rails のテストを実行する | Basicinc Enjoy Hacking!
<!DOCTYPE html><html lang="ja" data-scope-path="layouts/application"><head prefix="og: http://ogp.me/ns# article: http://ogp.me/ns/article#"><link crossorigin="" href="https://www.google-analytics.com/analytics.js" rel="preconnect" /><link rel="preload" href="/fonts/noto-sans-jp-v24-japanese-regular.woff2" as="font" type="font/woff2" crossorigin="anonymous"><link rel="preload" href="/fonts/noto-sans-jp-v24-japanese-700.woff2" as="font" type="font/woff2" crossorigin="anonymous"><!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-25666851-3"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-25666851-3'); </script> <link rel="stylesheet" media="all" href="/assets/ress-d1ba3a251927ab1f2bcc841c9a810109355bcb4260a522a0f76452fdc2fe6095.css" /><link rel="stylesheet" media="all" href="/assets/scopes/layouts/application-dda4ec688c139c8f29c39a2a795bcf4af04c4326643549a37f5d8843fffaebab.css" /><link rel="stylesheet" media="all" href="/assets/scopes/articles/show-37905516c06229c8fde10714e660fc48bc7b6ce7881755707db8b0327ceb5bf1.css" /><link rel="stylesheet" media="all" href="/assets/scopes/partials/_viewer-3a78a10250bb498047a06b71271b62ea949e304d25b9781c4450cf998aa2640c.css" /><link rel="stylesheet" media="all" href="/assets/scopes/layouts/_header-db87b54171cc020758ab7d1494677f8f6c2e9c93b453e896af82e4814eaacc7c.css" /><link rel="stylesheet" media="all" href="/assets/scopes/layouts/_breadcrumbs-744a099ab0b9eb5c4bd45215617e267c7d7c404ddddce8810eead5335512e637.css" /><link rel="stylesheet" media="all" href="/assets/scopes/layouts/_footer-a06961717440c6d0183c582c7f21768011f334d368f51b614eabc87bb17b3bbf.css" /><script src="/packs/application-02365dbc4dc28919eee1.js" defer="defer"></script><link href="/icon.png" rel="icon" type="image/png" /><link href="/apple-touch-icon.png" rel="apple-touch-icon" type="image/png" /><link href="/feed" rel="alternate" title="RSS2.0" type="application/rss+xml" /><title>GitHub Actions で Rails のテストを実行する | Basicinc Enjoy Hacking!</title><meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="76GntU/lhRccw/W1aTYdqFyRqyDcVvPbW+69l1JwyovBUUjoldPapYF/S3I/Z/NLHFuShWnsG6MMxI/02O7lFw==" /><meta content="width=device-width,initial-scale=1" name="viewport" /><meta content="GitHub Actions で Rails のテストを実行する | Basicinc Enjoy Hacking!" property="og:title" /><meta content="article" property="og:type" /><meta content="2022-06-22T14:06:12+09:00" property="article:published_time" /><meta content="zaru" property="article:author" /><meta content="Technology" property="article:section" /><meta content="https://tech.basicinc.jp/articles/226" property="og:url" /><meta content="https://tech.basicinc.jp/uploads/7d621785ab371aae7a44c8ca6baeeea5.jpg" property="og:image" /><meta content="image/jpeg" property="og:image:type" /><meta content="1200" property="og:image:width" /><meta content="630" property="og:image:height" /><meta content="この手の記事が世界の至る所で書かれている気がしますが、シークレットキーを渡す方法を含めて最新の GitHub Actions 情報に対応したものを見つけることができなかったので書きます。 やりたいこと Rspec や Rubocop を GitHub Actions で動か..." property="og:description" /><meta content="ja_JP" property="og:locale" /><meta content="summary_large_image" name="twitter:card" /><meta content="@zaru" name="twitter:creator" /></head><body><header data-scope-path="layouts/_header"><div class="header-contents"><a class="root-link" href="/"><svg class="site-logo"><use xlink:href="/assets/icons-5bbe775037b55281ef0bc50d30a51f69c7c3914d399c7107e37f0702d98ae8a2.svg#logo"></use></svg><div class="site-title">Enjoy Hacking!</div></a><div class="site-desc">Basicinc エンジニアブログ</div></div></header><nav data-scope-path="layouts/_breadcrumbs"><ul class="breadcrumbs" itemscope="itemscope" itemtype="https://schema.org/BreadcrumbList"><span class="pretext">% cat </span> <li itemprop="itemListElement" itemscope="itemscope" itemtype="https://schema.org/ListItem"><a itemprop="item" href="/"><span itemprop="name">~</span></a><meta itemprop="position" content="1" /></li>/<li class="current" itemprop="itemListElement" itemscope="itemscope" itemtype="https://schema.org/ListItem"><span itemprop="name">GitHubActionsでRailsのテストを実行する.md</span><meta itemprop="item" content="https://tech.basicinc.jp/articles/226" /><meta itemprop="position" content="2" /></li></ul></nav><div data-scope-path="articles/show"><article class="article"><h1 class="article-title">GitHub Actions で Rails のテストを実行する</h1><div class="article-desc"><a class="article-author" href="/authors/1"><img class="article-author-avatar" src="https://tech.basicinc.jp/uploads/e868e5fb1e34b970ae7d8e04c454ff28.png" /><span class="article-author-name">zaru</span></a><div class="article-date-info"><time class="article-posted-date">Posted 2022-06-22</time></div></div><div class="article-body"><div data-scope-path="partials/_viewer"><p>この手の記事が世界の至る所で書かれている気がしますが、シークレットキーを渡す方法を含めて最新の GitHub Actions 情報に対応したものを見つけることができなかったので書きます。</p> <h2>やりたいこと</h2> <ul> <li>Rspec や Rubocop を GitHub Actions で動かしたい</li> <li>Rails の Environment Credentials を使っているので <code>RAILS_MASTER_KEY</code> を渡したい</li> <li>Dependabot が作成するプルリクにもシークレット <code>RAILS_MASTER_KEY</code> を渡したい</li> </ul> <h2>前提</h2> <ul> <li>Private repository</li> </ul> <h2>YAML ファイル</h2> <p>まずは GitHub Actions の設定 YAML ファイルです。PostgreSQL と Redis をサービスコンテナとして用意しています。Ruby の実行には <code>ruby/setup-ruby</code> を使っています。ここらへんは GitHub Actions が用意してくれている Rails テンプレートをそのまま使っています。</p> <pre lang="yaml" class="highlight highlight-yaml"><span class="na">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Ruby</span><span class="nv"> </span><span class="s">on</span><span class="nv"> </span><span class="s">Rails</span><span class="nv"> </span><span class="s">CI"</span> <span class="na">on</span><span class="pi">:</span> <span class="pi">-</span> <span class="s">push</span> <span class="pi">-</span> <span class="s">pull_request</span> <span class="na">env</span><span class="pi">:</span> <span class="na">RAILS_ENV</span><span class="pi">:</span> <span class="s">test</span> <span class="na">DATABASE_HOST</span><span class="pi">:</span> <span class="s">127.0.0.1</span> <span class="na">REDIS_URL</span><span class="pi">:</span> <span class="s">redis://127.0.0.1:6379/1</span> <span class="na">RAILS_MASTER_KEY</span><span class="pi">:</span> <span class="s">${{ secrets.RAILS_MASTER_KEY }}</span> <span class="na">jobs</span><span class="pi">:</span> <span class="na">test</span><span class="pi">:</span> <span class="na">runs-on</span><span class="pi">:</span> <span class="s">ubuntu-latest</span> <span class="na">services</span><span class="pi">:</span> <span class="na">postgres</span><span class="pi">:</span> <span class="na">image</span><span class="pi">:</span> <span class="s">postgres:12.6</span> <span class="na">options</span><span class="pi">:</span> <span class="s">--health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries </span><span class="m">5</span> <span class="na">env</span><span class="pi">:</span> <span class="na">POSTGRES_HOST_AUTH_METHOD</span><span class="pi">:</span> <span class="s1">'</span><span class="s">trust'</span> <span class="na">POSTGRES_USER</span><span class="pi">:</span> <span class="s">root</span> <span class="na">POSTGRES_PASSWORD</span><span class="pi">:</span> <span class="s">password</span> <span class="na">TZ</span><span class="pi">:</span> <span class="s">UTC</span> <span class="na">ports</span><span class="pi">:</span> <span class="pi">-</span> <span class="s">5432:5432</span> <span class="na">redis</span><span class="pi">:</span> <span class="na">image</span><span class="pi">:</span> <span class="s">redis:6</span> <span class="na">options</span><span class="pi">:</span> <span class="s">--health-cmd "redis-cli -h localhost ping" --health-interval 10s --health-timeout 5s --health-retries </span><span class="m">15</span> <span class="na">ports</span><span class="pi">:</span> <span class="pi">-</span> <span class="s">6379:6379</span> <span class="na">steps</span><span class="pi">:</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Checkout code</span> <span class="na">uses</span><span class="pi">:</span> <span class="s">actions/checkout@v3</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Install Ruby and gems</span> <span class="na">uses</span><span class="pi">:</span> <span class="s">ruby/setup-ruby@8029ebd6e5bd8f4e0d6f7623ea76a01ec5b1010d</span> <span class="c1"># v1.110</span> <span class="na">with</span><span class="pi">:</span> <span class="na">bundler-cache</span><span class="pi">:</span> <span class="no">true</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Set up database schema</span> <span class="na">run</span><span class="pi">:</span> <span class="s">bundle exec rails db:create db:schema:load db:seed</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Run yarn</span> <span class="na">run</span><span class="pi">:</span> <span class="s">yarn</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Run Rspec</span> <span class="na">run</span><span class="pi">:</span> <span class="s">bundle exec rspec</span> <span class="na">lint</span><span class="pi">:</span> <span class="na">runs-on</span><span class="pi">:</span> <span class="s">ubuntu-latest</span> <span class="na">steps</span><span class="pi">:</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Checkout code</span> <span class="na">uses</span><span class="pi">:</span> <span class="s">actions/checkout@v3</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Install Ruby and gems</span> <span class="na">uses</span><span class="pi">:</span> <span class="s">ruby/setup-ruby@8029ebd6e5bd8f4e0d6f7623ea76a01ec5b1010d</span> <span class="c1"># v1.110</span> <span class="na">with</span><span class="pi">:</span> <span class="na">bundler-cache</span><span class="pi">:</span> <span class="no">true</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Lint Ruby files</span> <span class="na">run</span><span class="pi">:</span> <span class="s">bundle exec rubocop --parallel</span> </pre> <h2>GitHub の設定</h2> <p>シークレットをフォーク先や Dependabot で読み取れるようにするには設定が必要です。</p> <h3>Organization 設定</h3> <ul> <li><a href="https://github.com/organizations/__Org_name__/settings/actions">https://github.com/organizations/__Org_name__/settings/actions</a></li> </ul> <p><img src="https://tech.basicinc.jp/uploads/14b8ccbda9fde747b804f1bf2643cbd9.jpg" alt="1-min.jpg"></p> <p><code>Fork pull request workflows in private repositories</code> という設定項目があるので、<code>Send secrets to workflows from fork pull requests.</code> にチェックを入れます。これでフォークしたリポジトリからのプルリクでも upstream リポジトリのシークレットを読み取ることができるようになります。</p> <h3>Dependabot 設定</h3> <p>Dependabot のプルリクだと上記の設定だけではシークレットが読み取れません。GitHub Actions のトリガーを <code>pull_request</code> から <code>pull_request_trigger</code> にするという解説もありますが、今はその必要ないです。</p> <p>実はリポジトリの設定に Dependabot 専用のシークレットを設定する箇所があります。</p> <ul> <li><a href="https://github.com/__Org_name__/__Repo_name__/settings/secrets/dependabot">https://github.com/__Org_name__/__Repo_name__/settings/secrets/dependabot</a></li> </ul> <p><img src="https://tech.basicinc.jp/uploads/47efe0ada2b111bc46bdafdd591331b1.jpg" alt="2-min.jpg"></p> <p>以上でシークレットを読み取って Rails を GitHub Actions で動かすことができるようになります。</p></div></div><div class="article-sns-share-buttons"><a rel="nofollow" target="_blank" class="pocket-share sns-share-button" href="http://getpocket.com/edit?title=GitHub+Actions+%E3%81%A7+Rails+%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B+by+zaru+%7C+Basicinc+Enjoy+Hacking%21&url=https%3A%2F%2Ftech.basicinc.jp%2Farticles%2F226"><svg class="sns-icon pocket-icon"><use xlink:href="/assets/icons-5bbe775037b55281ef0bc50d30a51f69c7c3914d399c7107e37f0702d98ae8a2.svg#pocket"></use></svg></a><a rel="nofollow" target="_blank" class="hatena-share sns-share-button" href="http://b.hatena.ne.jp/add?mode=confirm&title=GitHub+Actions+%E3%81%A7+Rails+%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B+by+zaru+%7C+Basicinc+Enjoy+Hacking%21&url=https%3A%2F%2Ftech.basicinc.jp%2Farticles%2F226"><svg class="sns-icon hatena-icon"><use xlink:href="/assets/icons-5bbe775037b55281ef0bc50d30a51f69c7c3914d399c7107e37f0702d98ae8a2.svg#hatena"></use></svg></a><a rel="nofollow" target="_blank" class="twitter-share sns-share-button" href="https://twitter.com/share?text=GitHub+Actions+%E3%81%A7+Rails+%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B+by+zaru+%7C+Basicinc+Enjoy+Hacking%21&url=https%3A%2F%2Ftech.basicinc.jp%2Farticles%2F226"><svg class="sns-icon twitter-icon"><use xlink:href="/assets/icons-5bbe775037b55281ef0bc50d30a51f69c7c3914d399c7107e37f0702d98ae8a2.svg#twitter"></use></svg></a><a rel="nofollow" target="_blank" class="facebook-share sns-share-button" href="http://www.facebook.com/share.php?u=https%3A%2F%2Ftech.basicinc.jp%2Farticles%2F226"><svg class="sns-icon facebook-icon"><use xlink:href="/assets/icons-5bbe775037b55281ef0bc50d30a51f69c7c3914d399c7107e37f0702d98ae8a2.svg#facebook"></use></svg></a></div></article></div><footer data-scope-path="layouts/_footer"><div class="footer-contents"><a class="root-link" href="/"><svg class="site-logo"><use xlink:href="/assets/icons-5bbe775037b55281ef0bc50d30a51f69c7c3914d399c7107e37f0702d98ae8a2.svg#logo"></use></svg><div class="site-title">Enjoy Hacking!</div></a><ul class="link-list"><li class="link-list-item"><a class="link" href="https://basicinc.jp/" rel="noopener" target="_blank">株式会社ベーシック</a></li><li class="link-list-item"><a class="link" href="https://basicinc.jp/enjoy-hacking" rel="noopener" target="_blank">エンジニア募集</a></li><li class="link-list-item"><a class="link" href="https://qiita.com/organizations/basicinc" rel="noopener" target="_blank">Qiita</a></li><li class="link-list-item"><a class="link" href="https://www.wantedly.com/companies/basicinc/projects" rel="noopener" target="_blank">Wantedly</a></li></ul></div></footer></body></html>