Open4

GitHubのプライベートリポジトリにおいてある自作のfastlaneプラグインを読み込む

ころむにーころむにー

以下のように自作のfastlaneプラグインをGit参照により依存関係に追加する。

fastlane/Pluginfile
# Autogenerated by fastlane
#
# Ensure this file is checked in to source control!

# ...

+gem 'fastlane-plugin-my_plugin_name', git: 'https://github.com/owner/fastlane-plugin-my_plugin_name'

これがプライベートリポジトリだと、bundle install した時に以下のようなエラーが発生する。

% bundle install
Git error: command `git clone --bare --no-hardlinks --quiet -- https://github.com/owner/fastlane-plugin-my_plugin_name
/Users/ide/.rbenv/versions/3.3.4/lib/ruby/gems/3.3.0/cache/bundler/git/fastlane-plugin-my_plugin_name-3a9cc5d833042b0b3147a0c0d0126c19a98bf838` in directory /Users/user/work has
failed.

If this error persists you could try removing the cache directory '/Users/user/work
ころむにーころむにー

まずローカルで bundle install が成功するようにする。

以下のサイトを参考に、GitHub CLIをインストールし、Webブラウザーで認証する。

https://tech-book.precena.co.jp/software/backend/ruby-on-rails/how_to_refer_private_repository_from_gemfile

% gh auth login
? What account do you want to log into? GitHub.com
? What is your preferred protocol for Git operations on this host? HTTPS
? Authenticate Git with your GitHub credentials? Yes
? How would you like to authenticate GitHub CLI? Login with a web browser

! First copy your one-time code: xxxx-xxxx
Press Enter to open github.com in your browser... 
✓ Authentication complete.
- gh config set -h github.com git_protocol https
✓ Configured git protocol
✓ Logged in as user-name
ころむにーころむにー

GitHub Actions上で bundle install が成功するようにする。

オリジナルのGitHub Appsに、対象プラグインのリポジトリへのReadアクセス権を付与し、そのGitHub Appsのアクセストークンにより bundle install が実行されるようにする。

some-actions.yml
# ...
+      - name: Generate token
+        id: generate-token
+        uses: tibdex/github-app-token@v2
+        with:
+          app_id: ${{ secrets.MY_APP_ID }}
+          private_key: ${{ secrets.MY_APP_PRIVATE_KEY }}
      - name: Install Ruby, bundler, fastlane and other dependencies
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: ${{ steps.get-ruby-version.outputs.ruby-version }}
          bundler-cache: true
+        env:
+          BUNDLE_GITHUB__COM: x-access-token:${{ steps.generate-token.outputs.token }}
# ...
ころむにーころむにー

CircleCI上で bundle install が成功するようにする。

GitHub Actionsと同様にGitHub Appsのアクセストークンにより bundle install が実行されるようにする。

.circleci/config.yml
# ...
      - jq/install
      - run:
          name: Generate access token for GitHub App
          command: |
            github_app_installation_id="${MY_GITHUB_APP_INSTALLATION_ID}"
            github_app_id="${MY_GITHUB_APP_ID}"
            github_app_private_key_path="private-key.pem"
            github_app_private_key_pem_base64="${MY_GITHUB_APP_PRIVATE_KEY_PEM_BASE64}"
            github_app_access_token_output_env_name="GITHUB_APP_ACCESS_TOKEN"

            header=$(echo -n '{"alg":"RS256","typ":"JWT"}' | base64 | tr -d '\n')

            now=$(date "+%s")
            iat=$((${now} - 60))
            exp=$((${now} + (10 * 60)))
            payload=$(echo -n "{\"iat\":${iat},\"exp\":${exp},\"iss\":${github_app_id}}" | base64 | tr -d '\n')

            unsigned_token="${header}.${payload}"

            echo "${github_app_private_key_pem_base64}" | base64 --decode > "${github_app_private_key_path}"

            signed_token=$(echo -n "${unsigned_token}" | openssl dgst -binary -sha256 -sign "${github_app_private_key_path}" | base64 | tr -d '\n')
            jwt="${unsigned_token}.${signed_token}"

            generate_access_token_response=$(
              curl -s -X POST \
                -H "Authorization: Bearer ${jwt}" \
                -H "Accept: application/vnd.github.v3+json" \
                "https://api.github.com/app/installations/${github_app_installation_id}/access_tokens"
            )
            if [[ $? -ne 0 ]]; then
              echo "Failed to generate access token."
              echo "Response: ${generate_access_token_response}"
              exit 1
            fi

            echo "Succeeded to generate access token."

            access_token=$(echo "${generate_access_token_response}" | jq -r ".token")

            echo "${github_app_access_token_output_env_name}=${access_token}" >> $BASH_ENV
            echo "The access token has been set as an environment variable: ${github_app_access_token_output_env_name}"
      - run:
          name: Generate access info for Bundler
          command: echo "BUNDLE_GITHUB__COM=x-access-token:${GITHUB_APP_ACCESS_TOKEN}" >> $BASH_ENV
      - run:
          name: Install dependencies
          command: bundle install
          environment:
            BUNDLE_GITHUB__COM: $BUNDLE_GITHUB__COM
# ...

https://zenn.dev/gorohash/articles/e2c5f6ce50f4e6