semantic-release を使って GitLab パッケージレジストリに npm パッケージを公開します。

このガイドでは、semantic-release を使って npm パッケージをGitLab パッケージレジストリに自動的に公開する方法を説明します。

サンプルの完全なソースを表示したりフォークしたりすることもできます。

モジュールの初期化

  1. ターミナルを開き、プロジェクトのリポジトリに移動します。
  2. npm init を実行します。パッケージレジストリの命名規則に従って、モジュールに名前を付けます。たとえば、プロジェクトのパスがgitlab-examples/semantic-release-npm の場合、モジュール名を@gitlab-examples/semantic-release-npmとします。

  3. 以下の npm パッケージをインストールします:

    npm install semantic-release @semantic-release/git @semantic-release/gitlab @semantic-release/npm --save-dev
    
  4. モジュールのpackage.json に以下のプロパティを追加します:

    {
      "scripts": {
        "semantic-release": "semantic-release"
      },
      "publishConfig": {
        "access": "public"
      },
      "files": [ <path(s) to files here> ]
    }
    
  5. files 公開モジュールに含まれるべきすべてのファイルを選択するグロブパターンのキーを files更新します。files 詳細は files npm のドキュメントを参照してください。

  6. node_modules をコミットしないように、.gitignore ファイルをプロジェクトに追加します:

    node_modules
    

パイプラインの設定

以下の内容で.gitlab-ci.yml を作成してください:

default:
  image: node:latest
  before_script:
    - npm ci --cache .npm --prefer-offline
    - |
      {
        echo "@${CI_PROJECT_ROOT_NAMESPACE}:registry=${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/npm/"
        echo "${CI_API_V4_URL#https?}/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=\${CI_JOB_TOKEN}"
      } | tee -a .npmrc
  cache:
    key: ${CI_COMMIT_REF_SLUG}
    paths:
      - .npm/

workflow:
  rules:
    - if: $CI_COMMIT_BRANCH

variables:
  NPM_TOKEN: ${CI_JOB_TOKEN}

stages:
  - release

publish:
  stage: release
  script:
    - npm run semantic-release
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

この例では、publish という単一のジョブでパイプラインを設定し、semantic-release を実行しています。semantic-releaseライブラリは、npmパッケージの新しいバージョンを公開し、新しいGitLabリリースを作成します(必要な場合)。

デフォルトのbefore_script は、publish のジョブ中にパッケージレジストリへの認証に使われる一時的な.npmrc を生成します。

CI/CD変数の設定

パッケージのパブリッシュの一環として、semantic-release はpackage.json のバージョン番号を増やします。semantic-release がこの変更をコミットして GitLab にプッシュするために、パイプラインはGITLAB_TOKEN という名前のカスタム CI/CD 変数を必要とします。この変数を作成するには

  1. 左のサイドバーで、自分のアバターを選択してください。
  2. 環境設定 > アクセストークン を選択します。
  3. トークン名]ボックスに、トークン名を入力します。
  4. select scopesでapiチェックボックスを選択します。
  5. プロジェクトアクセストークンの作成」を選択します。
  6. 値をコピーします。
  7. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  8. Settings > CI/CDを選択します。
  9. 変数]を展開します。
  10. 変数の追加を選択します。
  11. キーボックスに、GITLAB_TOKENと入力します。
  12. Value] ボックスにトークンを貼り付けます。
  13. 変数のマスクチェックボックスを選択します。
  14. 変数の追加を選択します。

semantic-releaseの設定

semantic-releaseは設定情報を.releaserc.json プロジェクト内のファイルから .releaserc.json取得します。リポジトリのルートに.releaserc.json ファイルを作成 .releaserc.jsonします:

{
  "branches": ["master"],
  "plugins": [
    "@semantic-release/commit-analyzer",
    "@semantic-release/release-notes-generator",
    "@semantic-release/gitlab",
    "@semantic-release/npm",
    [
      "@semantic-release/git",
      {
        "assets": ["package.json"],
        "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
      }
    ]
  ]
}

リリースの公開開始

パイプラインをテストするには、以下のようなメッセージでコミットを作成します:

fix: testing patch releases

コミットをデフォルトブランチにプッシュします。パイプラインはプロジェクトのリリースページに新しいリリース (v1.0.0) を作成し、パッケージの新しいバージョンをプロジェクトのパッケージレジストリページに公開します。

マイナーリリースを作成するには、次のようなコミットメッセージを使用します:

feat: testing minor releases

あるいは、ブレークチェンジの場合は

feat: testing major releases

BREAKING CHANGE: This is a breaking change.

コミットメッセージがどのようにリリースにマップされるかについての詳細は、semantic-releasesのドキュメントを参照してください。

プロジェクトでモジュールを使う

公開されたモジュールを使うには、そのモジュールに依存するプロジェクトに.npmrc ファイルを追加します。たとえば、サンプルプロジェクトのモジュールを使うには、次のようにします:

@gitlab-examples:registry=https://gitlab.com/api/v4/packages/npm/

次に、モジュールをインストールします:

npm install --save @gitlab-examples/semantic-release-npm

トラブルシューティング

削除した Git タグが再び現れます

リポジトリから削除されたGitタグはsemantic-release GitLab Runnerがリポジトリのキャッシュバージョンを使う semantic-releaseことで再作成されることがあります。semantic-release タグが残っているキャッシュリポジトリを持つ Runner でジョブが実行されると、 semantic-releaseメインリポジトリにタグが再作成されます。

この挙動を避けるには、以下のどちらかを行います: