Yarnでパッケージを公開

Yarn 1 (Classic)Yarn 2+でパッケージを公開することができます。

デプロイコンテナで使用されている Yarn のバージョンを調べるには、yarn publish** を呼び出す CI スクリプトジョブブロックのscript ブロックでyarn –version` を実行します。パイプラインの出力にYarnのバージョンが表示されます。

Yarnパッケージのビルド方法はこちらをご覧ください。

YarnClassicや Yarn 2+を使い始めるにはYarnのドキュメントをご利用ください。

GitLab パッケージレジストリへの公開

Yarnを使ってGitLabパッケージレジストリに公開することができます。

パッケージレジストリへの認証

パッケージを公開するにはトークンが必要です。実現しようとしていることに応じて、さまざまなトークンが利用可能です。詳しくはトークンに関するガイダンスをレビューしてください。

  • 組織で二要素認証(2FA)を使用している場合は、スコープをapi に設定した個人アクセストークンを使用する必要があります。
  • CI/CD パイプライン経由でパッケージを公開する場合、非公開 Runner で CI ジョブトークンを使用するか、共有 Runner 用に変数を登録することができます。

公開設定

公開するには、.yarnrc.yml に以下の設定をします。このファイルは、package.json があるパッケージプロジェクトのソースのルートディレクトリに置く必要があります。

npmScopes:
  <my-org>:
    npmPublishRegistry: 'https://<your_domain>/api/v4/projects/<your_project_id>/packages/npm/'
    npmAlwaysAuth: true
    npmAuthToken: '<your_token>'

この設定では

  • <my-org> を組織スコープに置き換え、@ シンボルを除外します。
  • <your_domain> をドメイン名に置き換えてください。
  • <your_project_id> をプロジェクトのIDに置き換えてください。プロジェクトのIDは、プロジェクトのホームページに記載されています。
  • <your_token> をデプロイトークン、グループ アクセストークン、プロジェクト アクセストークン、または個人アクセストークンに置き換えてください。

このイシューに基づき、Yarn Classicのpackage.json ファイルでは、スコープされたレジストリが機能しません。そのため、publishConfig の下にはregistry を記述し、Yarn Classic では@scope:registry を記述してはいけません。コマンドラインやCI/CDパイプラインを使ってGitLabパッケージレジストリに公開することができます。

コマンドラインでの発行 - 手動発行

# Yarn 1 (Classic)
yarn publish

# Yarn 2+
yarn npm publish

これでパッケージがパッケージレジストリに公開されます。

CI/CD パイプライン経由での公開 - 自動公開

この方法を使用する場合、パイプライン変数を使用できます。

共有 Runner (Default)または非公開 Runner(Advanced) を使用できます。

共有ランナー

共有ランナーでオペレーションを行う場合、node:latestnode:current などのサードパーティイメージは、CI_JOB_TOKEN に直接アクセスできません。認証トークンを設定するか、非公開ランナーを使用する必要があります。

プロジェクトまたはグループの認証トークンを作成するには、以下の手順に従います:

  1. 左側のサイドバーで、「検索」を選択するか、または「移動」を選択して、プロジェクトまたはグループを見つけます。
  2. 左サイドバーで、[設定] > [リポジトリ] > [デプロイトークン]を選択します。
  3. read_package_registry およびwrite_package_registry スコープを持つデプロイトークンを作成し、生成されたトークンをコピーします。
  4. 左サイドバーで、[Settings] > [CI/CD] > [Variables] を選択します。
  5. Add variable を選択し、以下の設定を使用します:
項目
キーNPM_AUTH_TOKEN
<DEPLOY-TOKEN-FROM-STEP-3>
タイプ変数
プロテクト変数CHECKED
マスク変数CHECKED
変数の展開CHECKED

保護された変数を使用します:

  1. Yarnパッケージのソースコードを含むリポジトリに移動します。
  2. 左側のサイドバーで、設定 > リポジトリ を選択します。
    • タグのあるブランチからビルドする場合は、保護タグを選択し、セマンティックバージョン管理のためにv* (ワイルドカード) を追加します。
    • タグのないブランチからビルドする場合は、保護されたブランチを選択してください。

そして、package.json があるパッケージプロジェクトのルートディレクトリの.yarnrc.yml 設定に、上記で作成したNPM_AUTH_TOKEN を追加します:

npmScopes:
  esp-code:
    npmPublishRegistry: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/npm/"
    npmAlwaysAuth: true
    npmAuthToken: "${NPM_AUTH_TOKEN}"

非公開ランナー

package.json があるパッケージプロジェクトのルートディレクトリの.yarnrc.yml 設定にCI_JOB_TOKEN を追加します:

npmScopes:
  esp-code:
    npmPublishRegistry: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/npm/"
    npmAlwaysAuth: true
    npmAuthToken: "${CI_JOB_TOKEN}"

CI/CD パイプラインを使用してパッケージを公開するには、yarnrc.yml を格納する GitLab プロジェクトで、.gitlab-ci.yml ファイルを編集または作成します。例えば、タグがプッシュされた時だけトリガーするようにします:

# Yarn 1
image: node:lts

stages:
  - deploy

rules:
- if: $CI_COMMIT_TAG

deploy:
  stage: deploy
  script:
    - yarn publish
# Yarn 2+
image: node:lts

stages:
  - deploy

rules:
  - if: $CI_COMMIT_TAG

deploy:
  stage: deploy
  before_script:
    - corepack enable
    - yarn set version stable
  script:
    - yarn npm publish

これで、パイプラインの実行時にパッケージがパッケージレジストリに公開されるようになります。

パッケージのインストール

note
複数のパッケージが同じ名前・同じバージョンである場合、パッケージをインストールする際に最も新しく公開されたパッケージが取得されます。

パッケージのインストールには、2つのAPIエンドポイントのいずれかを使用できます:

  • インスタンスレベル:インスタンスレベル: 組織スコープで多数のパッケージを扱う場合に最適です。

  • インスタンスレベルでパッケージをインストールする場合は、スコープを付けてパッケージ名を付ける必要があります。スコープ付きパッケージは@ で始まり、@owner/package-name の形式を持ちます。パッケージのスコープは.yarnrc.yml ファイルとpackage.jsonpublishConfig オプションで設定できます。

  • @scope に使われる値は、パッケージをホストする組織のルート (トップレベルプロジェクト)...com/my-org (@my-org)であり、パッケージのソースコードを含むプロジェクトのルートではありません。
  • スコープは常に小文字です。
  • パッケージ名は何でもかまいません@my-org/any-name

  • プロジェクトレベル:単発のパッケージの場合。

プロジェクトレベルでパッケージをインストールする場合、命名規則に従う必要はありません。

プロジェクトの URLパッケージ・レジストリ組織範囲パッケージ名
https://gitlab.com/<my-org>/<group-name>/<package-name-example>パッケージ名例@my-org@my-org/package-name
https://gitlab.com/<example-org>/<group-name>/<project-name>プロジェクト名@example-org@example-org/project-name

インスタンスレベルからインストールすることも、プロジェクトレベルからインストールすることもできます。

.yarnrc.yml の設定は、package.json があるプロジェクト・ルートを消費するパッケージごとに追加することもできますし、システム・ユーザーのホーム・ディレクトリにあるグローバル設定を使用することもできます。

インスタンスレベルからのインストール

.yarnrc.yml ファイルのグローバル設定には、以下の手順を使用します:

  1. 組織のスコープを設定します。
  2. レジストリを設定します。

組織スコープの設定

npmScopes:
 <my-org>:
   npmRegistryServer: "https://<your_domain_name>/api/v4/packages/npm"
  • <my-org> を、@ シンボルを除いたパッケージにインストールするプロジェクトのルートレベルグループに置き換えてください。
  • <your_domain_name> はドメイン名に置き換えてください。例えば、gitlab.com.

レジストリを設定します。

パッケージが非公開でなく公開されている場合は、このステップをスキップしてください。

  npmRegistries:
    //<your_domain_name>/api/v4/packages/npm:
      npmAlwaysAuth: true
      npmAuthToken: "<your_token>"
  • <your_domain_name> はドメイン名に置き換えてください。例えば、gitlab.com.
  • <your_token> をデプロイトークン(推奨)、グループアクセストークン、プロジェクトアクセストークン、または個人アクセストークンに置き換えてください。

プロジェクトレベルからのインストール

.yarnrc.yml ファイル内の各プロジェクトに対して、以下の手順を使用します:

  1. プロジェクトスコープを設定します。
  2. レジストリを設定します。

プロジェクトスコープの設定

npmScopes:
  <my-org>:
    npmRegistryServer: "https://<your_domain_name>/api/v4/projects/<your_project_id>/packages/npm"
  • <my-org> を、@ シンボルを除いたパッケージにインストールするプロジェクトのルートレベルグループに置き換えてください。
  • <your_domain_name> はドメイン名に置き換えてください。例えば、gitlab.com.
  • <your_project_id> は、プロジェクトのホームページにあるプロジェクトIDに置き換えてください。

レジストリの設定 (プロジェクトレベル)

パッケージが非公開でなく公開されている場合は、このステップをスキップしてください。

npmRegistries:
  //<your_domain_name>/api/v4/projects/<your_project_id>/packages/npm:
    npmAlwaysAuth: true
    npmAuthToken: "<your_token>"
  • <your_domain_name> はドメイン名に置き換えてください。例えば、gitlab.com.
  • <your_token> をデプロイトークン(推奨)、グループアクセストークン、プロジェクトアクセストークン、または個人アクセストークンに置き換えてください。
  • <your_project_id> は、プロジェクトのホームページにあるプロジェクトIDに置き換えてください。

パッケージのインストール

Yarn 2+ では、yarn add をコマンドラインまたは CI/CD パイプラインで使用してパッケージをインストールします:

yarn add @scope/my-package

Yarn Classicの場合

Yarn Classicのセットアップには、イシューで述べたように、.npmrc.yarnrc の両方のファイルが必要です:

  • クレデンシャルは.npmrc
  • スコープされたレジストリを.yarnrc ファイルに置きます。
# .npmrc
//<your_domain_name>/api/v4/projects/<your_project_id>/packages/npm/:_authToken="<your_token>"

# .yarnrc
"@scope:registry" "https://<your_domain_name>/api/v4/projects/<your_project_id>/packages/npm/"

それからyarn add を使ってパッケージをインストールできます。

トラブルシューティング

npmレジストリ用のパッケージレジストリでYarnを実行するとエラーが発生します。

npm レジストリでYarnを使用している場合、次のようなエラーメッセージが表示されることがあります:

yarn install v1.15.2
warning package.json: No license field
info No lockfile found.
warning XXX: No license field
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
error An unexpected error occurred: "https://gitlab.example.com/api/v4/projects/XXX/packages/npm/XXX/XXX/-/XXX/XXX-X.X.X.tgz: Request failed \"404 Not Found\"".
info If you think this is a bug, please open a bug report with the information provided in "/Users/XXX/gitlab-migration/module-util/yarn-error.log".
info Visit https://classic.yarnpkg.com/en/docs/cli/install for documentation about this command

この場合、次のコマンドはカレントディレクトリに.yarnrc というファイルを作成します。グローバル設定の場合はユーザーのホームディレクトリに、プロジェクト単位の設定の場合はプロジェクトのルートにあることを確認してください:

yarn config set '//gitlab.example.com/api/v4/projects/<your_project_id>/packages/npm/:_authToken' "<your_token>"
yarn config set '//gitlab.example.com/api/v4/packages/npm/:_authToken' "<your_token>"