

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Swift で CodeArtifact を使う
<a name="using-swift"></a>

以下のトピックでは、Swift パッケージマネージャーを CodeArtifact で使用して、Swift パッケージをインストールし公開する方法について説明します。

**注記**  
CodeArtifact は、Swift 5.8 以降、および Xcode 14.3 以降をサポートしています。  
CodeArtifact では、Swift 5.9 以降、および Xcode 15 以降の使用を推奨します。

**Topics**
+ [CodeArtifact で Swift を設定する](configure-swift.md)
+ [Swift パッケージの使用と公開](swift-publish-consume.md)
+ [Swift パッケージ名と名前空間の正規化](swift-name-normalization.md)
+ [Swift のトラブルシューティング](swift-troubleshooting.md)

# CodeArtifact での Swift パッケージマネージャーの設定
<a name="configure-swift"></a>

Swift Package Manager を使用して AWS CodeArtifact にパッケージを発行したり、CodeArtifact からパッケージを使用したりするには、まず CodeArtifact リポジトリにアクセスするための認証情報を設定する必要があります。CodeArtifact の認証情報とリポジトリエンドポイントに Swift パッケージマネージャー CLI を設定するには、`aws codeartifact login` コマンドの使用を推奨します。Swift パッケージマネージャーは、手動で設定することもできます。

## login コマンドを使用して Swift を設定する
<a name="configure-swift-login-command"></a>

`aws codeartifact login` コマンドを使用して、CodeArtifact で Swift パッケージマネージャーを設定します。

**注記**  
login コマンドを使用するには Swift 5.8 以降が必要で、Swift 5.9 以降の使用を推奨します。

`aws codeartifact login` コマンドは、次の操作を行います。

1. CodeArtifact から認証トークンを取得して、認証トークンを環境変数に保存します。認証情報の保存方法は、環境のオペレーティングシステムによって異なります。

   1. **macOS:** macOS キーチェーンアプリケーションにエントリが作成されます。

   1. **Linux および Windows:** `~/.netrc` ファイルにエントリが作成されます。

   どちらのオペレーティングシステムの場合でも、認証情報エントリが存在する場合、このコマンドは既存のエントリを新しいトークンに置き換えます。

1. CodeArtifact リポジトリのエンドポイント URL を取得し、Swift 設定ファイルに追加します。このコマンドは、リポジトリのエンドポイント URL を、`/path/to/project/.swiftpm/configuration/registries.json` にあるプロジェクトレベルの設定ファイルに追加します。

**注記**  
`aws codeartifact login` コマンドは、実行が必要な `swift package-registry` コマンドを、`Package.swift` ファイルを含むディレクトリから呼び出します。そのため、`aws codeartifact login` コマンドは Swift プロジェクト内から実行する必要があります。

**login コマンドを使用して Swift を設定するには**

1. プロジェクトの `Package.swift` ファイルが含まれている Swift プロジェクトディレクトリに移動します。

1. 次の `aws codeartifact login` コマンドを実行します。

   所有しているドメインのリポジトリにアクセスする場合、`--domain-owner`を含める必要はありません。詳細については、「[クロスアカウントドメイン](domain-overview.md#domain-overview-cross-account)」を参照してください。

   ```
   aws codeartifact login --tool swift --domain my_domain \
   --domain-owner 111122223333 --repository my_repo \
   [--namespace my_namespace]
   ```

`--namespace` オプションは、CodeArtifact リポジトリのパッケージが指定された名前空間にある場合にのみ、パッケージを使用するようにアプリケーションを設定します。[CodeArtifact の名前空間](codeartifact-concepts.md#welcome-concepts-package-namespace)はスコープと同義であり、コードを論理グループに整理したり、コードベースに複数のライブラリが含まれている場合に発生する可能性のある名前の競合を防ぐために使用されます。

`login` を呼び出した後のデフォルトの認可時間は 12 時間であり、トークンを定期的に更新するには、`login` を呼び出す必要があります。`login` コマンドで作成される認可トークンの詳細については、「[`login`コマンドで作成されたトークン](tokens-authentication.md#auth-token-login)」を参照してください。

## login コマンドを使用せずに Swift を設定する
<a name="configure-swift-without-login-command"></a>

[`aws codeartifact login` コマンドを使用して Swift を設定する](#configure-swift-login-command)ことを推奨しますが、Swift パッケージマネージャーの設定を手動で更新することで、login コマンドを使用せずに Swift パッケージマネージャーを設定することもできます。

次の手順では、 AWS CLI を使用して以下を実行します。

1. CodeArtifact から認証トークンを取得して、認証トークンを環境変数に保存します。認証情報の保存方法は、環境のオペレーティングシステムによって異なります。

   1. **macOS:** macOS キーチェーンアプリケーションにエントリが作成されます。

   1. **Linux および Windows:** `~/.netrc` ファイルにエントリが作成されます。

1. CodeArtifact リポジトリのエンドポイント URL を取得します。

1. `~/.swiftpm/configuration/registries.json` 設定ファイルに、リポジトリのエンドポイント URL と認証タイプを含むエントリを追加します。

**login コマンドを使用せずに Swift を設定するには**

1. コマンドラインで以下のコマンドを使用して、CodeArtifact 認可トークンを取得し、認可トークンを環境変数に保存します。
   + *my\$1domain* を CodeArtifact ドメイン名に置き換えます。
   + *111122223333* をドメイン所有者の AWS アカウント ID に置き換えます。所有しているドメインのリポジトリにアクセスする場合、`--domain-owner`を含める必要はありません。詳細については、「[クロスアカウントドメイン](domain-overview.md#domain-overview-cross-account)」を参照してください。

------
#### [ macOS and Linux ]

   ```
   export CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token --domain my_domain --domain-owner 111122223333 --query authorizationToken --output text`
   ```

------
#### [ Windows ]
   + Windows (デフォルトのコマンドシェルを使用):

     ```
     for /f %i in ('aws codeartifact get-authorization-token --domain my_domain --domain-owner 111122223333 --query authorizationToken --output text') do set CODEARTIFACT_AUTH_TOKEN=%i
     ```
   + Windows PowerShell：

     ```
     $env:CODEARTIFACT_AUTH_TOKEN = aws codeartifact get-authorization-token --domain my_domain --domain-owner 111122223333 --query authorizationToken --output text
     ```

------

1. 次のコマンドを実行して、CodeArtifact リポジトリのエンドポイントを取得します。リポジトリエンドポイントは、パッケージを使用または公開するリポジトリを Swift パッケージマネージャーに示すために使用されます。
   + *my\$1domain* を CodeArtifact ドメイン名に置き換えます。
   + *111122223333* をドメイン所有者の AWS アカウント ID に置き換えます。所有しているドメインのリポジトリにアクセスする場合、`--domain-owner`を含める必要はありません。詳細については、「[クロスアカウントドメイン](domain-overview.md#domain-overview-cross-account)」を参照してください。
   + *my\$1repo* を CodeArtifact リポジトリ名で置き換えます。

------
#### [ macOS and Linux ]

   ```
   export CODEARTIFACT_REPO=`aws codeartifact get-repository-endpoint --domain my_domain --domain-owner 111122223333 --repository my_repo --format swift --query repositoryEndpoint --output text`
   ```

------
#### [ Windows ]
   + Windows (デフォルトのコマンドシェルを使用):

     ```
     for /f %i in ('aws codeartifact get-repository-endpoint --domain my_domain --domain-owner 111122223333 --repository my_repo --format swift --query repositoryEndpoint --output text') do set CODEARTIFACT_REPO=%i
     ```
   + Windows PowerShell：

     ```
     $env:CODEARTIFACT_REPO = aws codeartifact get-repository-endpoint --domain my_domain --domain-owner 111122223333 --repository my_repo --format swift --query repositoryEndpoint --output text
     ```

------

   次の URL は、リポジトリエンドポイントの例です。

   ```
   https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/swift/my_repo/
   ```
**注記**  
デュアルスタックエンドポイントを使用するには、`codeartifact.region.on.aws` エンドポイントを使用してください。
**重要**  
Swift パッケージマネージャーの設定に使用する場合は、リポジトリの URL エンドポイントの末尾に `login` を追加する必要があります。これはこの手順のコマンドで自動的に行われます。

1. これら 2 つの値を環境変数に格納したら、以下のように `swift package-registry login` コマンドを使用して Swift に渡します。

------
#### [ macOS and Linux ]

   ```
   swift package-registry login ${CODEARTIFACT_REPO}login --token ${CODEARTIFACT_AUTH_TOKEN}
   ```

------
#### [ Windows ]
   + Windows (デフォルトのコマンドシェルを使用):

     ```
     swift package-registry login %CODEARTIFACT_REPO%login --token %CODEARTIFACT_AUTH_TOKEN%
     ```
   + Windows PowerShell：

     ```
     swift package-registry login $Env:CODEARTIFACT_REPO+"login" --token $Env:CODEARTIFACT_AUTH_TOKEN
     ```

------

1. 次に、アプリケーションが使用するパッケージレジストリを更新して、依存関係が CodeArtifact リポジトリから取得されるようにします。このコマンドは、パッケージの依存関係を解決しようとしているプロジェクトディレクトリで実行する必要があります。

------
#### [ macOS and Linux ]

   ```
   $ swift package-registry set ${CODEARTIFACT_REPO} [--scope my_scope]
   ```

------
#### [ Windows ]
   + Windows (デフォルトのコマンドシェルを使用):

     ```
     $ swift package-registry set %CODEARTIFACT_REPO% [--scope my_scope]
     ```
   + Windows PowerShell：

     ```
     $ swift package-registry set $Env:CODEARTIFACT_REPO [--scope my_scope]
     ```

------

   `--scope` オプションは、CodeArtifact リポジトリのパッケージが指定されたスコープにある場合にのみ、パッケージを使用するようにアプリケーションを設定します。スコープは [CodeArtifact の名前空間](codeartifact-concepts.md#welcome-concepts-package-namespace)と同義であり、コードを論理グループに整理したり、コードベースに複数のライブラリが含まれている場合に発生する可能性のある名前の競合を防ぐために使用されます。

1. プロジェクトディレクトリで以下のコマンドを実行しプロジェクトレベルの `.swiftpm/configuration/registries.json` ファイルの内容を表示することで、正しく設定されたことを確認できます。

   ```
   $ cat .swiftpm/configuration/registries.json
   {
     "authentication" : {
   
     },
     "registries" : {
       "[default]" : {
         "url" : "https://my-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/swift/my-repo/"
       }
     },
     "version" : 1
   }
   ```

CodeArtifact リポジトリでの Swift パッケージマネージャーの設定は以上です。これで Swift パッケージマネージャーを使用して Swift パッケージをリポジトリに公開したり、リポジトリから Swift パッケージを使用したりできるようになります。詳細については、「[Swift パッケージの使用と公開](swift-publish-consume.md)」を参照してください。

# Swift パッケージの使用と公開
<a name="swift-publish-consume"></a>

## CodeArtifact で Swift パッケージを使用する
<a name="consume-swift-packages"></a>

次の手順を使用して、 AWS CodeArtifact リポジトリから Swift パッケージを使用します。

**CodeArtifact リポジトリで Swift パッケージを使用するには**

1. まだ設定していない場合は、「[CodeArtifact での Swift パッケージマネージャーの設定](configure-swift.md)」の手順に従って、CodeArtifact リポジトリを使用するように適切な認証情報を使用して Swift パッケージマネージャーを設定します。
**注記**  
認可トークンの有効期限は 12 時間です。トークンの作成後 12 時間が経過した場合は、新しいトークンを作成する必要があります。

1. アプリケーションプロジェクトフォルダー内の `Package.swift` ファイルを編集して、プロジェクトで使用されるパッケージの依存関係を更新します。

   1. `Package.swift` ファイルに `dependencies` セクションが含まれていない場合は、セクションを追加してください。

   1. `Package.swift`ファイルの `dependencies` セクションにパッケージ ID を追加して、使用するパッケージを追加します。パッケージ ID は、スコープとパッケージ名をピリオドで区切ったものです。例については、後のステップのコードスニペットを参照してください。
**ヒント**  
パッケージ ID は、CodeArtifact コンソールで確認できます。使用する特定のパッケージバージョンを探して、パッケージバージョンページの **[インストールショートカット]** の指示を参照してください。

   1. `Package.swift` ファイルに `targets` セクションが含まれていない場合は、セクションを追加してください。

   1. `targets` セクションに、依存関係の使用に必要なターゲットを追加します。

      以下のスニペットは、`Package.swift` ファイル内の設定済みの `dependencies` セクションおよび `targets` セクションを示すスニペットの例です。

      ```
      ...
          ],
          dependencies: [
              .package(id: "my_scope.package_name", from: "1.0.0")
          ],
          targets: [
            .target(
               name: "MyApp",
               dependencies: ["package_name"]
            ),...
          ],
      ...
      ```

1. 設定が完了したので、次のコマンドを使用して CodeArtifact からパッケージの依存関係をダウンロードします。

   ```
   swift package resolve
   ```

## CodeArtifact の Swift パッケージを Xcode で使用する
<a name="consume-swift-packages-xcode"></a>

CodeArtifact リポジトリの Swift パッケージを Xcode で使用するには、次の手順に従います。

**CodeArtifact リポジトリの Swift パッケージを Xcode で使用するには**

1. まだ設定していない場合は、「[CodeArtifact での Swift パッケージマネージャーの設定](configure-swift.md)」の手順に従って、CodeArtifact リポジトリを使用するように適切な認証情報を使用して Swift パッケージマネージャーを設定します。
**注記**  
認可トークンの有効期限は 12 時間です。トークンの作成後 12 時間が経過した場合は、新しいトークンを作成する必要があります。

1. パッケージを Xcode のプロジェクトに依存関係として追加します。

   1. **[ファイル] > [パッケージを追加]** と選択します。

   1. 検索バーを使用してパッケージを検索します。検索では `package_scope.package_name` の形式を使用します。

   1. パッケージが見つかったら、パッケージを選択して、**[パッケージを追加]** を選択します。

   1. パッケージの確認後、依存関係として追加するパッケージを選択し、**[パッケージを追加]** を選択します。

CodeArtifact リポジトリを Xcode で使用する際に問題が発生した場合、「[Swift のトラブルシューティング](swift-troubleshooting.md)」を参照して一般的な問題と考えられる修正方法を確認してください。

## Swift パッケージを CodeArtifact に公開する
<a name="publish-swift-packages"></a>

Swift パッケージを公開するには、CodeArtifact で Swift 5.9 以降および `swift package-registry publish` コマンドの使用を推奨します。以前のバージョンを使用している場合、Swift パッケージを CodeArtifact に公開するには、Curl コマンドを使用する必要があります。

### `swift package-registry publish` コマンドを使用した CodeArtifact パッケージの公開
<a name="publish-swift-packages-publish-command"></a>

Swift 5.9 以降で以下の手順を実行し、Swift パッケージマネージャーを使用して Swift パッケージを CodeArtifact リポジトリに公開します。

1. まだ設定していない場合は、「[CodeArtifact での Swift パッケージマネージャーの設定](configure-swift.md)」の手順に従って、CodeArtifact リポジトリを使用するように適切な認証情報を使用して Swift パッケージマネージャーを設定します。
**注記**  
認可トークンの有効期限は 12 時間です。作成後 12 時間が経過した場合は、新しいトークンを作成する必要があります。

1. パッケージの `Package.swift` ファイルが含まれている Swift プロジェクトディレクトリに移動します。

1. 次の `swift package-registry publish` コマンドを実行して、パッケージを公開します。このコマンドはパッケージソースアーカイブを作成して、CodeArtifact リポジトリに公開します。

   ```
   swift package-registry publish packageScope.packageName packageVersion
   ```

   例えば、次のようになります。

   ```
   swift package-registry publish myScope.myPackage 1.0.0
   ```

1. パッケージが公開され、リポジトリに存在することを確認するには、コンソールにチェックインするか、以下のように `aws codeartifact list-packages` コマンドを使用します。

   ```
   aws codeartifact list-packages --domain my_domain --repository my_repo
   ```

   以下のように `aws codeartifact list-package-versions` コマンドを使用して、パッケージの単一バージョンを一覧表示できます。

   ```
   aws codeartifact list-package-versions --domain my_domain --repository my_repo \
   --format swift --namespace my_scope --package package_name
   ```

### Curl を使用した CodeArtifact パッケージの公開
<a name="publish-swift-packages-curl"></a>

Swift 5.9 以降で使用可能な `swift package-registry publish` コマンドの使用を推奨しますが、Curl を使用して Swift パッケージを CodeArtifact に公開することもできます。

Curl を使用して Swift パッケージを AWS CodeArtifact リポジトリに発行するには、次の手順に従います。

1. まだ行っていない場合は、「[CodeArtifact での Swift パッケージマネージャーの設定](configure-swift.md)」の手順に従って `CODEARTIFACT_AUTH_TOKEN` 環境変数および `CODEARTIFACT_REPO` 環境変数を作成して更新します。
**注記**  
認可トークンは 12 時間有効です。`CODEARTIFACT_AUTH_TOKEN` 環境変数が作成されてから 12 時間が経過した場合は、新しい認証情報で環境変数を更新する必要があります。

1. Swift パッケージを作成していない場合は、最初に以下のコマンドを実行してパッケージを作成します。

   ```
   mkdir testDir && cd testDir
   swift package init
   git init .
   swift package archive-source
   ```

1. 次の Curl コマンドを使用して、Swift パッケージを CodeArtifact に公開します。

------
#### [ macOS and Linux ]

   ```
   curl -X PUT  --user "aws:$CODEARTIFACT_AUTH_TOKEN" \
   -H "Accept: application/vnd.swift.registry.v1+json" \
   -F source-archive="@test_dir_package_name.zip" \
   "${CODEARTIFACT_REPO}my_scope/package_name/packageVersion"
   ```

------
#### [ Windows ]

   ```
   curl -X PUT  --user "aws:%CODEARTIFACT_AUTH_TOKEN%" \
   -H "Accept: application/vnd.swift.registry.v1+json" \
   -F source-archive="@test_dir_package_name.zip" \
   "%CODEARTIFACT_REPO%my_scope/package_name/packageVersion"
   ```

------

1. パッケージが公開され、リポジトリに存在することを確認するには、コンソールにチェックインするか、以下のように `aws codeartifact list-packages` コマンドを使用します。

   ```
   aws codeartifact list-packages --domain my_domain --repository my_repo
   ```

   以下のように `aws codeartifact list-package-versions` コマンドを使用して、パッケージの単一バージョンを一覧表示できます。

   ```
   aws codeartifact list-package-versions --domain my_domain --repository my_repo \
   --format swift --namespace my_scope --package package_name
   ```

## GitHub から Swift パッケージを取得して CodeArtifact に再度公開する
<a name="publish-swift-packages-from-github"></a>

以下の手順を使用して GitHub から Swift パッケージを取得し、CodeArtifact リポジトリに再度公開します。

**GitHub から Swift パッケージを取得して CodeArtifact に再度公開するには**

1. まだ設定していない場合は、「[CodeArtifact での Swift パッケージマネージャーの設定](configure-swift.md)」の手順に従って、CodeArtifact リポジトリを使用するように適切な認証情報を使用して Swift パッケージマネージャーを設定します。
**注記**  
認可トークンの有効期限は 12 時間です。トークンの作成後 12 時間が経過した場合は、新しいトークンを作成する必要があります。

1. 次の `git clone` コマンドを使用して、取得して再公開する Swift パッケージの git リポジトリを複製します。GitHub リポジトリの複製については、GitHub ドキュメントの「[Cloning a repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository)」を参照してください。

   ```
   git clone repoURL
   ```

1. 複製したリポジトリに移動します。

   ```
   cd repoName
   ```

1. パッケージを作成して、CodeArtifact に公開します。

   1. **推奨:** Swift 5.9 以降を使用している場合は、次の `swift package-registry publish` コマンドを使用してパッケージを作成し、設定した CodeArtifact リポジトリに公開できます。

      ```
      swift package-registry publish packageScope.packageName versionNumber
      ```

      例えば、次のようになります。

      ```
      swift package-registry publish myScope.myPackage 1.0.0
      ```

   1. 5.9 より前のバージョンの Swift を使用している場合は、`swift archive-source` コマンドを使用してパッケージを作成し、その後 Curl コマンドを使用してパッケージを公開する必要があります。

      1. `CODEARTIFACT_AUTH_TOKEN` 環境変数および `CODEARTIFACT_REPO` 環境変数を設定していない場合、または設定してから 12 時間以上経過している場合は、「[login コマンドを使用せずに Swift を設定する](configure-swift.md#configure-swift-without-login-command)」の手順に従います。

      1. `swift package archive-source` コマンドを使用して Swift パッケージを作成します。

         ```
         swift package archive-source
         ```

         正常に作成されたら、コマンドラインに `Created package_name.zip` が表示されます。

      1. 次の Curl コマンドを使用して、Swift パッケージを CodeArtifact に公開します。

------
#### [ macOS and Linux ]

         ```
         curl -X PUT  --user "aws:$CODEARTIFACT_AUTH_TOKEN" \
         -H "Accept: application/vnd.swift.registry.v1+json" \
         -F source-archive="@package_name.zip" \
         "${CODEARTIFACT_REPO}my_scope/package_name/packageVersion"
         ```

------
#### [ Windows ]

         ```
         curl -X PUT  --user "aws:%CODEARTIFACT_AUTH_TOKEN%" \
         -H "Accept: application/vnd.swift.registry.v1+json" \
         -F source-archive="@package_name.zip" \
         "%CODEARTIFACT_REPO%my_scope/package_name/packageVersion"
         ```

------

1. パッケージが公開され、リポジトリに存在することを確認するには、コンソールにチェックインするか、以下のように `aws codeartifact list-packages` コマンドを使用します。

   ```
   aws codeartifact list-packages --domain my_domain --repository my_repo
   ```

   以下のように `aws codeartifact list-package-versions` コマンドを使用して、パッケージの単一バージョンを一覧表示できます。

   ```
   aws codeartifact list-package-versions --domain my_domain --repository my_repo \
   --format swift --namespace my_scope --package package_name
   ```

# Swift パッケージ名と名前空間の正規化
<a name="swift-name-normalization"></a>

CodeArtifact は、パッケージ名と名前空間を保存する前に正規化します。つまり、CodeArtifact 内の名前は、パッケージが公開されたときに提供されたものとは異なる場合があります。

**パッケージ名と名前空間の正規化:** CodeArtifact は、すべての文字を小文字に変換することで Swift パッケージ名と名前空間を正規化します。

**パッケージバージョンの正規化: **CodeArtifact は Swift パッケージバージョンを正規化しません。CodeArtifact はセマンティックバージョニング 2.0 バージョンパターンのみをサポートしていることに注意してください。セマンティックバージョニングの詳細については、「[Semantic Versioning 2.0.0](https://semver.org/spec/v2.0.0.html)」を参照してください。

CodeArtifact はこれらのリクエストの入力を正規化するため、正規化されていないパッケージ名と名前空間は API および CLI リクエストで使用できます。例えば、`--package myPackage` および `--namespace myScope` の入力は正規化され、正規化されたパッケージ名 `mypackage` と名前空間 `myscope` が返されます。

**IAM ポリシーなどの ARN では正規化された名前を使用する必要があります。**

正規化されたパッケージ名を検索するには、`aws codeartifact list-packages` コマンドを使用します。詳細については、「[パッケージ名を一覧表示する](list-packages.md)」を参照してください。

# Swift のトラブルシューティング
<a name="swift-troubleshooting"></a>

以下の情報は、Swift および CodeArtifact での一般的な問題のトラブルシューティングに役立ちます。

## Swift パッケージマネージャーを設定した後も Xcode で 401 エラーが表示される
<a name="swift-troubleshooting-xcode"></a>

**問題:** CodeArtifact リポジトリから Xcode の Swift プロジェクトへの依存関係としてパッケージを追加しようとすると、[Swift を CodeArtifact に接続](configure-swift.md)するための指示に従った後でも、401 不正エラーが表示される。

**考えられる解決方法:** CodeArtifact の認証情報が保存されている macOS キーチェーンアプリケーションの問題が原因である可能性があります。この問題を解決するには、キーチェーンアプリケーションを開いて CodeArtifact のエントリをすべて削除し、「[CodeArtifact での Swift パッケージマネージャーの設定](configure-swift.md)」の手順に従って Swift パッケージマネージャーを CodeArtifact リポジトリで再度設定することをお勧めします。

## パスワードのキーチェーンプロンプトが原因で CI マシンで Xcode が ハングする
<a name="swift-troubleshooting-ci-machine"></a>

**問題:** GitHub Actions などの継続的インテグレーション (CI) サーバー上の Xcode ビルドの一部として CodeArtifact から Swift パッケージをプルしようとすると、CodeArtifact による認証がハングし、最終的に失敗して次のようなエラーメッセージが表示されることがあります。

`Failed to save credentials for \'https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com\' to keychain: status -60008`

**解決方法:** これは、認証情報が CI マシンのキーチェーンに保存されておらず、Xcode がキーチェーンに保存されている認証情報のみをサポートしていることが原因です。この問題を修正するには、次の手順を使用してキーチェーンエントリを手動で作成することをお勧めします。

1. キーチェーンを準備します。

   ```
   KEYCHAIN_PASSWORD=$(openssl rand -base64 20)
   KEYCHAIN_NAME=login.keychain
   SYSTEM_KEYCHAIN=/Library/Keychains/System.keychain
   
   if [ -f $HOME/Library/Keychains/"${KEYCHAIN_NAME}"-db ]; then
       echo "Deleting old ${KEYCHAIN_NAME} keychain"
       security delete-keychain "${KEYCHAIN_NAME}"
   fi
   echo "Create Keychain"
   security create-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"
   
   EXISTING_KEYCHAINS=( $( security list-keychains | sed -e 's/ *//' | tr '\n' ' ' | tr -d '"') )
   sudo security list-keychains -s "${KEYCHAIN_NAME}" "${EXISTING_KEYCHAINS[@]}"
   
   echo "New keychain search list :"
   security list-keychain 
   
   echo "Configure keychain : remove lock timeout"
   security unlock-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"
   security set-keychain-settings "${KEYCHAIN_NAME}"
   ```

1. CodeArtifact 認証トークンとリポジトリエンドポイントを取得します。

   ```
   export CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token \
                                       --region us-west-2 \
                                       --domain my_domain   \
                                       --domain-owner 111122223333   \
                                       --query authorizationToken  \
                                       --output text`
                                        
   export CODEARTIFACT_REPO=`aws codeartifact get-repository-endpoint  \
                                 --region us-west-2   \
                                 --domain my_domain   \
                                 --domain-owner 111122223333   \
                                 --format swift     \
                                 --repository my_repo    \
                                 --query repositoryEndpoint   \
                                 --output text`
   ```

1. Keychain エントリを手動で作成します。

   ```
   SERVER=$(echo $CODEARTIFACT_REPO | sed  's/https:\/\///g' | sed 's/.com.*$/.com/g')
   AUTHORIZATION=(-T /usr/bin/security -T /usr/bin/codesign -T /usr/bin/xcodebuild -T /usr/bin/swift \
                  -T /Applications/Xcode-15.2.app/Contents/Developer/usr/bin/xcodebuild)
   
   security delete-internet-password -a token -s $SERVER -r htps "${KEYCHAIN_NAME}"
   
   security add-internet-password -a token \
                                  -s $SERVER \
                                  -w $CODEARTIFACT_AUTH_TOKEN \
                                  -r htps \
                                  -U \
                                  "${AUTHORIZATION[@]}" \
                                  "${KEYCHAIN_NAME}"
   
   security set-internet-password-partition-list \
                -a token \
                -s $SERVER \
                -S "com.apple.swift-package,com.apple.security,com.apple.dt.Xcode,apple-tool:,apple:,codesign" \
                -k "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"
   
   security find-internet-password   "${KEYCHAIN_NAME}"
   ```

このエラーと解決方法の詳細については、[https://github.com/apple/swift-package-manager/issues/7236](https://github.com/apple/swift-package-manager/issues/7236) を参照してください。