Precena Tech Book
コーポレートサイト採用サイト
  • はじめに
  • ソフトウェア開発
    • 開発環境構築
      • Homebrew
        • Homebrew用語の意味
      • ngrok
        • ngrokの導入
        • ngrokのアップグレード(v2 to v3)
      • Slack
        • Slackの/remind コマンドの形式
        • 対面での相談を気軽にするためのSlack設定
      • AWS CLI
      • Ruby
      • Scala
      • Prettier
      • zsh
        • zsh-completion
      • Mac
        • M1 Macでの開発環境構築(rosetta 無し)
    • バックエンド
      • OpenAPI
        • OpenAPI 定義ファイル分割のすゝめ
      • Ruby on Rails
        • ActiveRecordのfind_or_initialize_byメソッドにブロックを渡したときの挙動
        • Railsのアプリケーションサーバーのプロセス数とスレッド数の設定方法
        • Railsを6.1系から7.0系へアップグレードした時に調査したこと
        • schema.rbで差分が発生する事例とその復旧について
        • tmux + overmind を利用して、複数システムを1コマンドで起動できるよう設定する
        • Rails Migrationチートシート
        • GithubのプライベートリポジトリをGemfileで参照する方法
        • ActiveSupportのto_jsonメソッドの注意点
        • 危険なJSON出力を禁止するRuboCopカスタムルールの作成方法
      • Scala
        • Validated を直列に処理したい
      • DB
        • PostgreSQLにおける、削除行に対するロック獲得時の挙動
    • フロントエンド
      • React
        • Storybookを利用したビジュアルリグレッションテスト
  • インフラ開発
    • AWS
      • IAM
        • スイッチロールの設定手順
        • AWS CLIでのスイッチロールの設定手順
        • AWS Vaultを使ったスイッチロール設定手順
        • Github ActionsでIAMロールを利用してAWSリソースを操作する
      • ECS
      • SES
        • AWS SESメールボックスシミュレーターにて、カスタムヘッダや添付ファイル付きのテストEメールを送信する
      • CloudWatch
        • Amazon SNS + Slack Workflowを使って、CloudWatch Alarmの通知をSlackチャンネルへ投稿する
      • Lambda
        • lambrollでAWS Lambda関数をデプロイしたときのTips
    • Heroku
      • HerokuのStackの設定
      • Heroku Postgresの運用でよく使うコマンド集
  • セキュリティ
    • Web
      • Same Origin PolicyとCORS
      • 脆弱性診断 2社同時依頼実施記録
  • Mail
    • SPF、DKIM、DMARCを使用した迷惑メール対策
  • データ分析
    • データ分析プロセス
  • SaaS
    • Zendesk
      • 問い合わせフォームの項目をサービスごとに出し分け、各サービス担当者に自動で振り分けてメールで通知する
  • イベント
    • RubyKaigi
      • RubyKaigi 2023 に現地参加しました
    • EMConf
      • EMConfJP2025_参加レポート
  • やってみた
    • IoT
      • Raspberry Pi + PaSoRi + Python で、勤怠打刻マシンを作ってみた
  • Precena Tech Book 管理
    • コンテンツ執筆時のルール
  • 関連リンク
    • プレセナエンジニア公式Twitter
GitBook提供
このページ内
  • 背景
  • Personal Access Tokenを使う方法について
  • ローカル端末の場合
  • Github CLIを使う方法
  • git configを使う方法
  • CI/CD環境の場合
  • Github Appsの作成
  • 作成したGithub Appのリポジトリへの導入
  • Github Actions
  • AWS CodeBuild

役に立ちましたか?

PDFとしてエクスポート
  1. ソフトウェア開発
  2. バックエンド
  3. Ruby on Rails

GithubのプライベートリポジトリをGemfileで参照する方法

前へRails Migrationチートシート次へActiveSupportのto_jsonメソッドの注意点

最終更新 1 年前

役に立ちましたか?

背景

当社では、社内で共通に使いたい機能をgemに切り出し、機能の利用側のGemfileでプライベートリポジトリを参照しています。

gem "some_internal_library", git: "https://github.com/precena-dev/some_internal_library.git", tag: "v1.0.0"

ローカル端末でのみ利用する場合はgitのURLはgit@ やssh@ で始まるURLを使えば問題なくbundle installできます。しかしCI/CD環境でもbundle installするため、httpsで始まるURLで登録しています。

このプライベートリポジトリをbundle install時に参照する方法について記載します。

Personal Access Tokenを使う方法について

に記載があるように、BUNDLE_GITBHUB__COM の環境変数にgithubのPersonal Access Token(PAT)を登録することでbundle install時にプライベートリポジトリを参照する方法があります。しかし、GithubはPATの利用を推奨していません。に非推奨の「GitHub recommends that you use fine-grained personal access tokens instead」といった言及がされています。したがって、当記事ではPAT以外を利用した方法について記載します。

ローカル端末の場合

Github CLIを使う方法

まずCLIをインストールしておきます。Macの場合はbrewコマンドでインストールできます。

% brew install gh

次に以下のコマンドを実行するとブラウザが開きますので、Githubの認可を行います。

% gh auth login

これで、bundle installが成功します。

git configを使う方法

% git config url.git@github.com:.insteadOf https://github.com/

そうすると、sshで参照するようになるためbundle installが成功します。

CI/CD環境の場合

github actionsやAWS codebuildなどのCI/CD環境について記載します。

Github Appsの作成

パーミッションについては、プライベートリポジトリを参照してbundle installするだけであれば、「Contents:Read-only」を選択するだけで良いでしょう。

作成後にPrivate Keyを作れるようになりますので、ひとつ作成して秘密鍵をダウンロードしておきます。

画面上部に表示されているAppIDを控えます

作成したGithub Appのリポジトリへの導入

Github App 左メニューのInstall Appを選択し、歯車アイコンをクリックします。

必要なリポジトリを選択し、Saveします。

Github Actions

控えておいたGITHUB_APP_IDおよびGITHUB_APP_PRIVATE_KEYを、下図のようにActionのsecretsに、登録しておきます。

Github App経由でtokenを取得します。その値を、環境変数BUNDLE_GITHUB__COMに設定します。以下にGithub Actionsの設定例を掲載します。

    steps:
      - name: Generate github token
        id: generate_token
        uses: tibdex/github-app-token@v1
        with:
          app_id: ${{ secrets.APP_ID }}
          private_key: ${{ secrets.PRIVATE_KEY }}
      - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f
   ・・・中略・・・
      - name: Set up Ruby
        env:
          BUNDLE_GITHUB__COM: x-access-token:${{ steps.generate_token.outputs.token }}
        # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
        # change this to (see https://github.com/ruby/setup-ruby#versioning):
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: ${{ matrix.ruby-version }}
          bundler-cache: true # runs 'bundle install' and caches installed gems automatically

AWS CodeBuild

Github Actionsとやっていることは同じです。Github Appsを用意し、GITHUB_APP_IDとGITHUB_APP_PRIVATE_KEYを使って、Access Tokenを取得します。ただしgithub actionsのように公開された再利用可能ワークフローがないため、自前でスクリプトを実行してtokenを取得します。

以下が、buildspec.ymlから呼ぶスクリプトです。

# buildspec.ymlから呼ぶscript.
# github app経由でtokenを取得する
npm install axios jsonwebtoken
node ./get_github_token.js > $BUNDLE_GITHUB__COM
// github app経由でtokenを取得するスクリプト
// 成果物のtokenは標準出力に出す
// https://dev.classmethod.jp/articles/register-github-app-and-get-access-token/ を改変

const jwt = require("jsonwebtoken")
const axios = require("axios")

const githubAppId = process.env.GITHUB_APP_ID;
const githubAppPrivateKey = process.env.GITHUB_APP_PRIVATE_KEY;
const githubAppInstallationId = process.env.GITHUB_APP_INSTALLATION_ID;

const payload = {
  exp: Math.floor(Date.now() / 1000) + 60,  // JWT expiration time
  // ちょっとだけ時間を手前にしておくとアクセストークンの発行に失敗し辛いらしい。
  // https://qiita.com/icoxfog417/items/fe411b94b8e7ae229e3e#github-apps%E3%81%AE%E8%AA%8D%E8%A8%BC
  iat: Math.floor(Date.now() / 1000) - 10,       // Issued at time
  iss: githubAppId
}

const cert = githubAppPrivateKey;
const token = jwt.sign(payload, cert, { algorithm: 'RS256'});

axios.default.post(`https://api.github.com/app/installations/${githubAppInstallationId}/access_tokens`, null, {
  headers: {
    Authorization: "Bearer " + token,
    Accept: "application/vnd.github.machine-man-preview+json"
  }
})
  .then(res => {
    // 標準出力に出たものをシェルスクリプトでリダイレクトして使う想定
    console.log(`x-access-token:${res.data.token}`);
  })
  .catch(res => {
    console.error('error');
    console.error(res);
    throw new Error(res.data);
  })

以下のコマンドを実行します。

まず、 から、Github Appsを作ります。組織内でのみ利用したいため、「Where can this GitHub App be installed?」の項目は「Only on this account」にチェックしておきます。

GITHUB_APP_ID, GITHUB_APP_PRIVATE_KEYに加え、GITHUB_APP_INSTALLATION_IDをActionのsecretsに登録しておきます。installation idは各リポジトリのSettingsメニューの下部Github Appsを選択し、Github Appsの一覧のConfigureボタンを押した先のURLに含まれています。<installation_id> の形式です。このinstallation_idを控えてください。

get_github_token.jsの内容は以下のとおりです。クラスメソッドさんのより流用、改変しています。

本サイトの更新情報は、で発信しています。ご確認ください。

こちらのドキュメント
ドキュメント
参考
https://github.com/organizations/<your_organization_name>/settings/apps/new
https://github.com/organizations/<organization_name>/settings/installations/
ブログ記事
X(旧Twitter)の株式会社プレセナ・ストラテジック・パートナーズエンジニア公式