

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Uso CodeArtifact con Swift
<a name="using-swift"></a>

En estos temas se describe cómo utilizar el Swift Package Manager CodeArtifact para instalar y publicar paquetes Swift.

**nota**  
CodeArtifact es compatible con Swift 5.8 y versiones posteriores y con Xcode 14.3 y versiones posteriores.  
CodeArtifact recomienda Swift 5.9 y versiones posteriores y Xcode 15 y versiones posteriores.

**Topics**
+ [Configura Swift con CodeArtifact](configure-swift.md)
+ [Consumir y publicar paquetes de Swift](swift-publish-consume.md)
+ [Normalización del nombre del paquete y del espacio de nombres de Swift](swift-name-normalization.md)
+ [Solución de problemas de Swift](swift-troubleshooting.md)

# Configure el Swift Package Manager con CodeArtifact
<a name="configure-swift"></a>

Para usar el Swift Package Manager para publicar o consumir paquetes AWS CodeArtifact, primero tendrás que configurar las credenciales para acceder a tu CodeArtifact repositorio. El método recomendado para configurar la CLI de Swift Package Manager con sus CodeArtifact credenciales y el punto final del repositorio es mediante el `aws codeartifact login` comando. También puede configurar Swift Package Manager manualmente.

## Configurar Swift con el comando login
<a name="configure-swift-login-command"></a>

Utilice el `aws codeartifact login` comando para configurar el Swift Package Manager con CodeArtifact.

**nota**  
Para usar el comando de inicio de sesión, se requiere Swift 5.8 o posterior y se recomienda Swift 5.9 o posterior.

El comando `aws codeartifact login` hará lo siguiente:

1. Obtenga un token de autenticación CodeArtifact y guárdelo en su entorno. La forma en que se almacenan las credenciales depende del sistema operativo del entorno:

   1. **macOS:** se crea una entrada en la aplicación MacOS Keychain.

   1. **Linux y Windows:** se crea una entrada en el archivo `~/.netrc`.

   En todos los sistemas operativos, si existe una entrada de credenciales, este comando la reemplaza por un nuevo token.

1. Busca la URL del punto final de tu CodeArtifact repositorio y agrégala a tu archivo de configuración de Swift. El comando añade la URL del punto de conexión del repositorio al archivo de configuración a nivel de proyecto ubicado en `/path/to/project/.swiftpm/configuration/registries.json`.

**nota**  
El comando `aws codeartifact login` llama a comandos `swift package-registry` que deben ejecutarse desde el directorio que contiene el archivo `Package.swift`. Por ello, debe ejecutarse el comando `aws codeartifact login` desde el proyecto Swift.

**Para configurar Swift con el comando login**

1. Navegue hasta el directorio del proyecto Swift que contiene el archivo `Package.swift` de su proyecto.

1. Ejecute el comando `aws codeartifact login` siguiente.

   Si va a acceder a un repositorio de un dominio de su propiedad, no tiene que incluir `--domain-owner`. Para obtener más información, consulte [Dominios entre cuentas](domain-overview.md#domain-overview-cross-account).

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

La `--namespace` opción configura la aplicación para que solo consuma paquetes de tu CodeArtifact repositorio si están en el espacio de nombres designado. CodeArtifact Los [espacios de nombres](codeartifact-concepts.md#welcome-concepts-package-namespace) son sinónimos de ámbitos y se utilizan para organizar el código en grupos lógicos y evitar las colisiones de nombres que pueden producirse cuando la base de código incluye varias bibliotecas.

El período de autorización predeterminado después de una llamada `login` es de 12 horas y `login` debe invocarse para actualizar periódicamente el token. Para obtener más información sobre el token de autorización creado con el comando `login`, consulte [Tokens creados con el comando `login`](tokens-authentication.md#auth-token-login).

## Configurar Swift sin el comando login
<a name="configure-swift-without-login-command"></a>

Si bien se recomienda [configurar Swift con el comando `aws codeartifact login`](#configure-swift-login-command), también puede configurar Swift Package Manager sin el comando login actualizando manualmente la configuración de Swift Package Manager.

En el siguiente procedimiento, utilizará el AWS CLI para hacer lo siguiente:

1. Obtenga un token de autenticación CodeArtifact y guárdelo en su entorno. La forma en que se almacenan las credenciales depende del sistema operativo del entorno:

   1. **macOS:** se crea una entrada en la aplicación MacOS Keychain.

   1. **Linux y Windows:** se crea una entrada en el archivo `~/.netrc`.

1. Obtenga la URL del punto final de su CodeArtifact repositorio.

1. En el archivo de configuración `~/.swiftpm/configuration/registries.json`, añada una entrada con la URL del punto de conexión del repositorio y el tipo de autenticación.

**Para configurar Swift sin el comando login**

1. En una línea de comandos, usa el siguiente comando para obtener un token de CodeArtifact autorización y almacenarlo en una variable de entorno.
   + *my\$1domain*Sustitúyalo por tu nombre CodeArtifact de dominio.
   + *111122223333*Sustitúyelo por el ID de AWS cuenta del propietario del dominio. Si va a acceder a un repositorio de un dominio de su propiedad, no tiene que incluir `--domain-owner`. Para obtener más información, consulte [Dominios entre cuentas](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 (mediante el intérprete de comandos predeterminado):

     ```
     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. Obtenga el punto final de su CodeArtifact repositorio ejecutando el siguiente comando. El punto de conexión de su repositorio se utiliza para dirigir Swift Package Manager a su repositorio para consumir o publicar paquetes.
   + *my\$1domain*Sustitúyalo por tu nombre de CodeArtifact dominio.
   + *111122223333*Sustitúyelo por el ID de AWS cuenta del propietario del dominio. Si va a acceder a un repositorio de un dominio de su propiedad, no tiene que incluir `--domain-owner`. Para obtener más información, consulte [Dominios entre cuentas](domain-overview.md#domain-overview-cross-account).
   + *my\$1repo*Sustitúyalo por el nombre de tu CodeArtifact repositorio.

------
#### [ 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 (mediante el intérprete de comandos predeterminado):

     ```
     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
     ```

------

   La siguiente URL es un punto de conexión de repositorio de ejemplo.

   ```
   https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/swift/my_repo/
   ```
**nota**  
Si quiere utilizar un punto de conexión de pila doble, use el punto de conexión `codeartifact.region.on.aws`.
**importante**  
Debe añadir `login` al final del punto de conexión de la URL del repositorio cuando se utilice para configurar Swift Package Manager. Esto se hace automáticamente en los comandos de este procedimiento.

1. Con estos dos valores almacenados en variables de entorno, páselos a Swift usando el comando `swift package-registry login` de la siguiente manera:

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

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

------
#### [ Windows ]
   + Windows (mediante el intérprete de comandos predeterminado):

     ```
     swift package-registry login %CODEARTIFACT_REPO%login --token %CODEARTIFACT_AUTH_TOKEN%
     ```
   + Ventanas PowerShell:

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

------

1. A continuación, actualice el registro de paquetes utilizado por la aplicación para que cualquier dependencia se extraiga del CodeArtifact repositorio. Este comando debe ejecutarse en el directorio del proyecto en el que intenta resolver la dependencia del paquete:

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

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

------
#### [ Windows ]
   + Windows (mediante el intérprete de comandos predeterminado):

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

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

------

   La `--scope` opción configura la aplicación para que solo consuma paquetes de tu CodeArtifact repositorio si están dentro del ámbito designado. Los ámbitos son sinónimos de [CodeArtifact espacios de nombres](codeartifact-concepts.md#welcome-concepts-package-namespace) y se utilizan para organizar el código en grupos lógicos y evitar las colisiones de nombres que pueden producirse cuando la base de código incluye varias bibliotecas.

1. Para confirmar que la configuración se ha configurado correctamente, consulte el contenido del archivo `.swiftpm/configuration/registries.json` a nivel de proyecto ejecutando el siguiente comando en el directorio del proyecto:

   ```
   $ 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
   }
   ```

Ahora que has configurado el Swift Package Manager con tu CodeArtifact repositorio, puedes usarlo para publicar y consumir paquetes Swift desde y hacia él. Para obtener más información, consulte [Consumir y publicar paquetes de Swift](swift-publish-consume.md).

# Consumir y publicar paquetes de Swift
<a name="swift-publish-consume"></a>

## Consumir paquetes Swift desde CodeArtifact
<a name="consume-swift-packages"></a>

Utilice el siguiente procedimiento para consumir paquetes Swift de un AWS CodeArtifact repositorio.

**Para consumir paquetes Swift de un CodeArtifact repositorio**

1. Si no lo has hecho, sigue los pasos que se indican [Configure el Swift Package Manager con CodeArtifact](configure-swift.md) a continuación para configurar el Swift Package Manager para que utilice tu CodeArtifact repositorio con las credenciales adecuadas.
**nota**  
El token de autorización generado es válido durante 12 horas. Deberá crear uno nuevo si han pasado 12 horas desde que se creó el token.

1. Edite el archivo `Package.swift` en la carpeta del proyecto de su aplicación para actualizar las dependencias del paquete que utilizará su proyecto.

   1. Si el archivo `Package.swift` no contiene una sección `dependencies`, añada una.

   1. En la sección `dependencies` del archivo `Package.swift`, añada el paquete que desee utilizar añadiendo su identificador de paquete. El identificador del paquete consiste en el ámbito y el nombre del paquete separados por un punto. Consulte el fragmento de código que sigue a un paso posterior para ver un ejemplo.
**sugerencia**  
Para encontrar el identificador del paquete, puedes usar la CodeArtifact consola. Busque la versión específica del paquete que desea utilizar y consulte las instrucciones de **acceso directo de instalación** en la página de la versión del paquete.

   1. Si el archivo `Package.swift` no contiene una sección `targets`, añada una.

   1. En la sección `targets`, añada los destinos que necesitarán usar la dependencia.

      El siguiente fragmento es un ejemplo de fragmento que muestra las secciones `dependencies` y `targets` configuradas en un archivo `Package.swift`:

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

1. Ahora que todo está configurado, usa el siguiente comando para descargar las dependencias del paquete. CodeArtifact

   ```
   swift package resolve
   ```

## Consumir paquetes de Swift desde CodeArtifact Xcode
<a name="consume-swift-packages-xcode"></a>

Utilice el siguiente procedimiento para consumir paquetes Swift de un CodeArtifact repositorio en Xcode.

**Para consumir paquetes Swift de un CodeArtifact repositorio en Xcode**

1. Si no lo has hecho, sigue los pasos que se indican [Configure el Swift Package Manager con CodeArtifact](configure-swift.md) a continuación para configurar el Swift Package Manager para que utilice tu CodeArtifact repositorio con las credenciales adecuadas.
**nota**  
El token de autorización generado es válido durante 12 horas. Deberá crear uno nuevo si han pasado 12 horas desde que se creó el token.

1. Agregue los paquetes como una dependencia en su proyecto en Xcode.

   1. Seleccione **Archivo > Añadir paquetes**.

   1. Busque su paquete usando la barra de búsqueda. Su búsqueda debe estar en la forma `package_scope.package_name`.

   1. Una vez encontrado, elija el paquete y elija **Añadir paquete**.

   1. Una vez que se verifique el paquete, elija los productos del paquete que desea agregar como dependencia y elija **Agregar paquete**.

Si tienes problemas al usar tu CodeArtifact repositorio con Xcode, consulta [Solución de problemas de Swift](swift-troubleshooting.md) los problemas más comunes y las posibles soluciones.

## Publicar paquetes de Swift en CodeArtifact
<a name="publish-swift-packages"></a>

CodeArtifact recomienda Swift 5.9 o posterior y usar el `swift package-registry publish` comando para publicar paquetes de Swift. Si utiliza una versión anterior, debe utilizar un comando Curl para publicar los paquetes de Swift en ella. CodeArtifact

### Publicar CodeArtifact paquetes con el comando `swift package-registry publish`
<a name="publish-swift-packages-publish-command"></a>

Utilice el siguiente procedimiento con Swift 5.9 o posterior para publicar paquetes de Swift en un CodeArtifact repositorio con Swift Package Manager.

1. Si no lo has hecho, sigue los pasos que se indican [Configure el Swift Package Manager con CodeArtifact](configure-swift.md) a continuación para configurar el Swift Package Manager para que utilice tu CodeArtifact repositorio con las credenciales adecuadas.
**nota**  
El token de autorización generado es válido durante 12 horas. Deberá crear uno nuevo si han pasado 12 horas desde su creación.

1. Navegue hasta el directorio del proyecto Swift que contiene el archivo `Package.swift` de su paquete.

1. Ejecute el comando `swift package-registry publish` siguiente para publicar el paquete. El comando crea un archivo fuente del paquete y lo publica en su CodeArtifact repositorio.

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

   Por ejemplo:

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

1. Puede confirmar que el paquete se publicó y existe en el repositorio comprobándolo en la consola o usando el comando `aws codeartifact list-packages` de la siguiente manera:

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

   Puede enumerar la versión única del paquete usando el comando `aws codeartifact list-package-versions` de la siguiente manera:

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

### Publicar CodeArtifact paquetes con Curl
<a name="publish-swift-packages-curl"></a>

Si bien se recomienda usar el `swift package-registry publish` comando que viene con Swift 5.9 o una versión posterior, también puedes usar Curl para publicar paquetes de Swift en él. CodeArtifact

Utilice el siguiente procedimiento para publicar paquetes de Swift en un AWS CodeArtifact repositorio con Curl.

1. Si no lo ha hecho, cree y actualice las variables de entorno `CODEARTIFACT_AUTH_TOKEN` y `CODEARTIFACT_REPO` siguiendo los pasos que se indican en [Configure el Swift Package Manager con CodeArtifact](configure-swift.md).
**nota**  
El token de autorización es válido durante 12 horas. Deberá actualizar la variable de entorno `CODEARTIFACT_AUTH_TOKEN` con nuevas credenciales si han pasado 12 horas desde su creación.

1. En primer lugar, si no tiene un paquete Swift creado, puede hacerlo ejecutando los siguientes comandos:

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

1. Usa el siguiente comando Curl para publicar tu paquete Swift en: 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. Puede confirmar que el paquete se publicó y existe en el repositorio comprobándolo en la consola o usando el comando `aws codeartifact list-packages` de la siguiente manera:

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

   Puede enumerar la versión única del paquete usando el comando `aws codeartifact list-package-versions` de la siguiente manera:

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

## Extraer paquetes de Swift GitHub y volver a publicarlos en CodeArtifact
<a name="publish-swift-packages-from-github"></a>

Utilice el siguiente procedimiento para obtener un paquete Swift de un repositorio GitHub y volver a publicarlo en él. CodeArtifact 

**Para obtener un paquete de Swift GitHub y volver a publicarlo en CodeArtifact**

1. Si no lo has hecho, sigue los pasos que se indican [Configure el Swift Package Manager con CodeArtifact](configure-swift.md) a continuación para configurar el Swift Package Manager para que utilice tu CodeArtifact repositorio con las credenciales adecuadas.
**nota**  
El token de autorización generado es válido durante 12 horas. Deberá crear uno nuevo si han pasado 12 horas desde que se creó el token.

1. Clone el repositorio git del paquete Swift que desea recuperar y volver a publicar con el comando `git clone` siguiente. Para obtener información sobre la clonación de GitHub repositorios, consulta Cómo [clonar un repositorio](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) en los documentos. GitHub 

   ```
   git clone repoURL
   ```

1. Navegue hasta el repositorio que acaba de clonar:

   ```
   cd repoName
   ```

1. Crea el paquete y publícalo en. CodeArtifact

   1. **Recomendado:** Si utilizas Swift 5.9 o una versión posterior, puedes usar el siguiente `swift package-registry publish` comando para crear el paquete y publicarlo en el CodeArtifact repositorio que hayas configurado.

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

      Por ejemplo:

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

   1. si utiliza una versión de Swift anterior a la 5.9, debe usar el comando `swift archive-source` para crear el paquete y luego usar un comando Curl para publicarlo.

      1. Si no ha configurado las variables de entorno `CODEARTIFACT_AUTH_TOKEN` y `CODEARTIFACT_REPO` o han pasado más de 12 horas desde que lo hizo, siga los pasos que se indican en [Configurar Swift sin el comando login](configure-swift.md#configure-swift-without-login-command).

      1. Cree el paquete Swift mediante el siguiente comando `swift package archive-source`:

         ```
         swift package archive-source
         ```

         Si tiene éxito, verá `Created package_name.zip` en la línea de comandos.

      1. Usa el siguiente comando Curl para publicar el paquete Swift en: 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. Puede confirmar que el paquete se publicó y existe en el repositorio comprobándolo en la consola o usando el comando `aws codeartifact list-packages` de la siguiente manera:

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

   Puede enumerar la versión única del paquete usando el comando `aws codeartifact list-package-versions` de la siguiente manera:

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

# Normalización del nombre del paquete y del espacio de nombres de Swift
<a name="swift-name-normalization"></a>

CodeArtifact normaliza los nombres y los espacios de nombres de los paquetes antes de almacenarlos, lo que significa que los nombres CodeArtifact pueden ser diferentes a los que se proporcionaron cuando se publicó el paquete.

**Normalización de nombres de paquetes y espacios de nombres:** CodeArtifact normaliza los nombres de paquetes y espacios de nombres de Swift convirtiendo todas las letras a minúsculas.

**Normalización de versiones de paquetes:** CodeArtifact no normaliza las versiones de paquetes de Swift. [Tenga en cuenta que CodeArtifact solo es compatible con los patrones de versión 2.0 de Semantic Versioning. Para obtener más información sobre el control de versiones semántico, consulte Semantic Versioning 2.0.0.](https://semver.org/spec/v2.0.0.html)

El nombre y el espacio de nombres del paquete no normalizados se pueden usar con las solicitudes de API y CLI porque CodeArtifact normalizan las entradas de esas solicitudes. Por ejemplo, las entradas de `--package myPackage` y `--namespace myScope` se normalizarían y devolverían un paquete con un nombre de paquete `mypackage` y un espacio de nombres de `myscope` normalizados.

**Debe utilizar nombres normalizados en, por ejemplo ARNs, en las políticas de IAM.**

Para buscar el nombre normalizado de un paquete, utilice el comando `aws codeartifact list-packages`. Para obtener más información, consulte [Mostrar nombres de paquetes](list-packages.md).

# Solución de problemas de Swift
<a name="swift-troubleshooting"></a>

La siguiente información puede ayudarle a solucionar problemas comunes con Swift y. CodeArtifact

## Recibo un error 401 en Xcode incluso después de configurar Swift Package Manager
<a name="swift-troubleshooting-xcode"></a>

**Problema:** Cuando intentas añadir un paquete de tu CodeArtifact repositorio como una dependencia a tu proyecto de Swift en Xcode, recibes un error 401 no autorizado incluso después de haber seguido las instrucciones para [conectar Swift](configure-swift.md) a. CodeArtifact

**Posibles soluciones:** esto puede deberse a un problema con la aplicación MacOS Keychain, donde se almacenan CodeArtifact las credenciales. Para solucionar este problema, te recomendamos abrir la aplicación Keychain y eliminar todas las CodeArtifact entradas y volver a configurar Swift Package Manager con tu CodeArtifact repositorio siguiendo las instrucciones que se indican en[Configure el Swift Package Manager con CodeArtifact](configure-swift.md).

## Xcode se bloquea en la máquina CI debido a que el llavero pide la contraseña
<a name="swift-troubleshooting-ci-machine"></a>

**Problema:** cuando intentas extraer paquetes de Swift CodeArtifact como parte de una versión de Xcode en un servidor de integración continua (CI), como Actions, la autenticación mediante GitHub Actions CodeArtifact puede bloquearse y, finalmente, fallar con un mensaje de error similar al siguiente:

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

**Soluciones posibles:** el problema se debe a que las credenciales no se guardan en el llavero de las máquinas CI y Xcode solo admite las credenciales guardadas en Keychain. Para solucionar este problema, recomendamos crear la entrada del llavero manualmente siguiendo estos pasos:

1. Prepare el llavero.

   ```
   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. Obtén un token de CodeArtifact autenticación y el punto final de tu repositorio.

   ```
   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. Cree manualmente la entrada de 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}"
   ```

Para obtener más información sobre este error y la solución, consulta [https://github.com/apple/swift-package-manager/issues/7236](https://github.com/apple/swift-package-manager/issues/7236).