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:latest
やnode:current
などのサードパーティイメージは、CI_JOB_TOKEN
に直接アクセスできません。認証トークンを設定するか、非公開ランナーを使用する必要があります。
プロジェクトまたはグループの認証トークンを作成するには、以下の手順に従います:
- 左側のサイドバーで、「検索」を選択するか、または「移動」を選択して、プロジェクトまたはグループを見つけます。
- 左サイドバーで、[設定] > [リポジトリ] > [デプロイトークン]を選択します。
-
read_package_registry
およびwrite_package_registry
スコープを持つデプロイトークンを作成し、生成されたトークンをコピーします。 - 左サイドバーで、[Settings] > [CI/CD] > [Variables] を選択します。
-
Add variable
を選択し、以下の設定を使用します:
項目 | 値 |
---|---|
キー | NPM_AUTH_TOKEN |
値 | <DEPLOY-TOKEN-FROM-STEP-3> |
タイプ | 変数 |
プロテクト変数 | CHECKED |
マスク変数 | CHECKED |
変数の展開 | CHECKED |
保護された変数を使用します:
- Yarnパッケージのソースコードを含むリポジトリに移動します。
- 左側のサイドバーで、設定 > リポジトリ を選択します。
- タグのあるブランチからビルドする場合は、保護タグを選択し、セマンティックバージョン管理のために
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
これで、パイプラインの実行時にパッケージがパッケージレジストリに公開されるようになります。
パッケージのインストール
パッケージのインストールには、2つのAPIエンドポイントのいずれかを使用できます:
-
インスタンスレベル:インスタンスレベル: 組織スコープで多数のパッケージを扱う場合に最適です。
-
インスタンスレベルでパッケージをインストールする場合は、スコープを付けてパッケージ名を付ける必要があります。スコープ付きパッケージは
@
で始まり、@owner/package-name
の形式を持ちます。パッケージのスコープは.yarnrc.yml
ファイルとpackage.json
のpublishConfig
オプションで設定できます。 -
@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
ファイルのグローバル設定には、以下の手順を使用します:
- 組織のスコープを設定します。
- レジストリを設定します。
組織スコープの設定
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
ファイル内の各プロジェクトに対して、以下の手順を使用します:
- プロジェクトスコープを設定します。
- レジストリを設定します。
プロジェクトスコープの設定
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>"