Skip to main content

Enterprise Server 3.22 est actuellement disponible en tant que version candidate.

Migration à partir de Travis CI avec GitHub Actions Importer

Découvrez comment automatiser GitHub Actions Importer la migration de vos pipelines CI Travis vers GitHub Actions.

À propos de la migration à partir de Travis CI avec GitHub Actions Importer

Les instructions ci-dessous vous guident tout au long de la configuration de votre environnement à utiliser GitHub Actions Importer pour migrer des pipelines CI Travis vers GitHub Actions.

Prérequis

  • Un compte d’intégration continue Travis ou une organisation avec des pipelines et des travaux que vous souhaitez convertir en GitHub Actions flux de travail.
  • Accès pour créer un jeton d’accès d’API Travis CI pour votre compte ou organisation.
  • Un environnement dans lequel vous pouvez exécuter des conteneurs basés sur Linux et installer les outils nécessaires.

    Remarque

    Le conteneur GitHub Actions Importer et l’interface CLI n’ont pas besoin d’être installés sur le même serveur que votre plateforme CI.

Limites

Il existe certaines limitations lors de la migration à partir de pipelines CI Travis vers GitHub Actions .GitHub Actions Importer

Tâches manuelles

Certaines constructions Travis CI doivent être migrées manuellement. Il s’agit notamment des paramètres suivants :

  • Secrets
  • Propriétés de travail inconnues

Pour plus d’informations sur les migrations manuelles, consultez « Migration de Travis CI vers GitHub Actions ».

Langages de projet Travis CI

GitHub Actions Importer transforme les langages de projet Travis CI en ajoutant un ensemble d’outils de génération préconfigurés et un script de génération par défaut au flux de travail transformé. Si aucune langue n’est explicitement déclarée, GitHub Actions Importer suppose qu’un langage de projet est Ruby.

Pour obtenir la liste des langues de projet prises en charge par GitHub Actions Importer, consultez Langues de projet prises en charge.

Installation de l’extension GitHub Actions Importer CLI

  1. Installez l’extension CLI GitHub Actions Importer :

    Bash
    gh extension install github/gh-actions-importer
    
  2. Vérifiez que l’extension est installée :

    $ gh actions-importer -h
    Options:
      -?, -h, --help  Show help and usage information
    
    Commands:
      update     Update to the latest version of GitHub Actions Importer.
      version    Display the version of GitHub Actions Importer.
      configure  Start an interactive prompt to configure credentials used to authenticate with your CI server(s).
      audit      Plan your CI/CD migration by analyzing your current CI/CD footprint.
      forecast   Forecast GitHub Actions usage from historical pipeline utilization.
      dry-run    Convert a pipeline to a GitHub Actions workflow and output its yaml file.
      migrate    Convert a pipeline to a GitHub Actions workflow and open a pull request with the changes.
    

Configuration des informations d’identification

La configure commande CLI permet de définir les informations d’identification et les options requises pour GitHub Actions Importer l’utilisation de Travis CI et GitHub.

  1. Créer un GitHubpersonal access token (classic). Pour plus d’informations, consultez « Gestion de vos jetons d’accès personnels ».

    Votre jeton doit avoir l’étendue workflow.

    Après avoir créé le jeton, copiez-le et enregistrez-le en lieu sûr en vue de l’utiliser ultérieurement.

  2. Créez un jeton d’accès d’API Travis CI. Pour plus d’informations, consultez Obtenir votre jeton d’API Travis CI dans la documentation de Travis CI.

    Après avoir créé le jeton, copiez-le et enregistrez-le en lieu sûr en vue de l’utiliser ultérieurement.

  3. Dans votre terminal, exécutez la GitHub Actions Importerconfigure commande CLI :

    gh actions-importer configure
    

    La commande configure vous invite à entrer les informations suivantes :

    • Pour « Quels fournisseurs CI configurez-vous ? », utilisez les touches de direction pour sélectionner Travis CI, appuyez sur Space pour le sélectionner, puis appuyez sur Enter.
    • Pour «Personal access token pour GitHub », entrez la valeur du personal access token (classic) fichier que vous avez créé précédemment, puis appuyez sur Entrée.
    • Pour « URL de base de l’instance GitHub », entrez l’URL pour votre instance GitHub Enterprise Server, puis appuyez sur Entrée.
    • Pour «Personal access token pour Travis CI », entrez la valeur du jeton d’accès de l’API CI Travis que vous avez créé précédemment, puis appuyez sur Entrée.
    • Pour « URL de base de l’instance Travis CI », entrez l’URL de votre instance Travis CI, puis appuyez sur Entrée.
    • Pour « Nom de l’organisation Travis CI », entrez le nom de votre organisation Travis CI, puis appuyez sur Entrée.

    Voici un exemple de sortie de la commande configure.

    $ gh actions-importer configure
    ✔ Which CI providers are you configuring?: Travis CI
    Enter the following values (leave empty to omit):
    ✔ Personal access token for GitHub: ***************
    ✔ Base url of the GitHub instance: https://github.com
    ✔ Personal access token for Travis CI: ***************
    ✔ Base url of the Travis CI instance: https://travis-ci.com
    ✔ Travis CI organization name: actions-importer-labs
    Environment variables successfully updated.
    
  4. Dans votre terminal, exécutez la GitHub Actions Importerupdate commande CLI pour vous connecter et GitHub PackagesContainer registry vérifiez que l’image conteneur est mise à jour vers la dernière version :

    gh actions-importer update
    

    La sortie de la commande devrait ressembler à la sortie ci-dessous :

    Updating ghcr.io/actions-importer/cli:latest...
    ghcr.io/actions-importer/cli:latest up-to-date
    

Effectuer un audit de Travis CI

Vous pouvez utiliser la commande audit pour obtenir une vue d’ensemble de tous les pipelines d’un serveur Travis CI.

La commande audit effectue les étapes suivantes :

  1. Extrait tous les projets définis dans un serveur Travis CI.
  2. Convertit chaque pipeline en flux de travail équivalent GitHub Actions .
  3. Génère un rapport qui résume la façon dont l’exécution et la complexité d’une migration sont possibles avec GitHub Actions Importer.

Exécution de la commande d'audit

Pour effectuer un audit d’un serveur Travis CI, exécutez la commande suivante dans votre terminal :

gh actions-importer audit travis-ci --output-dir tmp/audit

Inspection des résultats de l’audit

Les fichiers dans le répertoire de sortie spécifié contiennent les résultats de l’audit. Consultez le fichier audit_summary.md pour obtenir un résumé des résultats de l’audit.

Le résumé de l’audit comporte les sections suivantes.

Pipelines

La section « Pipelines » contient des statistiques de haut niveau concernant le taux de conversion effectué par GitHub Actions Importer.

Vous trouverez ci-dessous quelques termes clés qui peuvent apparaître dans la section « Pipelines » :

  • Les pipelines réussis comportaient 100 % des composants du pipeline et des éléments individuels convertis automatiquement vers leur équivalent GitHub Actions.
  •           Les pipelines **partiellement convertis avec succès** ont vu toutes les constructions du pipeline converties, mais certains éléments individuels n'ont pas été convertis automatiquement vers leur équivalent GitHub Actions.
    
  • Les pipelines non pris en charge sont des types de définition qui ne sont pas pris en charge par GitHub Actions Importer.
  • Les pipelines ayant échoué sont ceux qui ont rencontré une erreur irrécupérable lors de la conversion. Cela peut se produire pour l’une des trois raisons suivantes :
    • Le pipeline a été mal configuré à l’origine et n’était pas valide.
    • GitHub Actions Importer a rencontré une erreur interne lors de sa conversion.
    • Une réponse réseau infructueuse a rendu le pipeline inaccessible, ce qui est souvent dû à des informations d’identification non valides.

Étapes de génération

La section « Étapes de génération » contient une vue d’ensemble des étapes de génération individuelles utilisées dans tous les pipelines, ainsi que le nombre d’étapes converties automatiquement par GitHub Actions Importer.

Vous trouverez ci-dessous quelques termes clés qui peuvent apparaître dans la section « Étapes de génération » :

  • Une étape de génération connue est une étape qui a été automatiquement convertie en action équivalente.
  • Une étape de génération inconnue est une étape qui n’a pas été automatiquement convertie en action équivalente.
  • Une étape de génération non prise en charge désigne une étape qui est soit :
    • Fondamentalement non pris en charge par GitHub Actions.
    • Configuré d’une manière incompatible avec GitHub Actions.
  • Une action est une liste des actions qui ont été utilisées dans les workflows convertis. Cela peut être important pour :
    • Si vous utilisez GitHub Enterprise Server, collecte de la liste des actions à synchroniser avec votre instance.
    • Définir une liste d’autorisation au niveau de l’organisation des actions utilisées. Cette liste d’actions est une liste complète d’actions que vos équipes de sécurité ou de conformité peuvent avoir besoin d’examiner.

Tâches manuelles

La section « Tâches manuelles » contient une vue d’ensemble des tâches qui GitHub Actions Importer ne sont pas en mesure de se terminer automatiquement et que vous devez effectuer manuellement.

Vous trouverez ci-dessous quelques termes clés qui peuvent apparaître dans la section « Tâches manuelles » :

  • Un secret est un secret défini au niveau du dépôt ou de l’organisation, utilisé dans les pipelines convertis. Ces secrets doivent être créés manuellement dans GitHub Actions pour que ces pipelines fonctionnent correctement. Pour plus d’informations, consultez « Utilisation de secrets dans GitHub Actions ».
  • Un exécuteur auto-hébergé désigne un libellé d'exécuteur référencé dans un pipeline converti qui ne correspond pas à un exécuteur hébergé par GitHub. Vous devez définir manuellement ces exécuteurs pour que ces pipelines fonctionnent correctement.

Fichiers

La dernière section du rapport d’audit fournit un manifeste de tous les fichiers qui ont été écrits sur le disque pendant l’audit.

À chaque fichier de pipeline correspond une série de fichiers inclus dans l’audit, notamment :

  • Le pipeline d’origine tel qu’il a été défini dans GitHub.
  • Toutes les réponses du réseau utilisées pour convertir le pipeline.
  • Le fichier de workflow converti.
  • Les traces de pile qui peuvent être utilisées pour résoudre les problèmes liés à une conversion de pipeline ayant échoué.

De plus, le fichier workflow_usage.csv contient une liste séparée par des virgules de l’ensemble des actions, secrets et exécuteurs qui sont utilisés par chaque pipeline converti avec succès. Cela peut être utile pour déterminer quels workflows utilisent quelles actions, quels secrets ou quels exécuteurs, et pour effectuer des révisions de sécurité.

Prévoir l’utilisation potentielle de l’exécuteur de génération

Vous pouvez utiliser la forecast commande pour prévoir l’utilisation potentielle GitHub Actions en calculant les métriques à partir des exécutions de pipeline terminées dans votre serveur CI Travis.

Exécution de la commande de prévisions

Pour effectuer une prévision de l’utilisation potentielle GitHub Actions , exécutez la commande suivante dans votre terminal. Par défaut, GitHub Actions Importer inclut les sept jours précédents dans le rapport de prévision.

gh actions-importer forecast travis-ci --output-dir tmp/forecast

Inspection du rapport de prévision

Le fichier forecast_report.md dans le répertoire de sortie spécifié contient les résultats de la prévision.

Voici quelques termes clés qui peuvent apparaître dans le rapport de prévision :

  • Le nombre de travaux correspond au nombre total de travaux terminés.
  • Le nombre de pipelines correspond au nombre de pipelines uniques utilisés.
  •           Le **temps d’exécution** décrit le temps passé par un exécuteur sur un travail. Cette métrique peut être utilisée pour planifier le coût des GitHubexécuteurs hébergés.
    
    • Cette métrique est liée au montant que vous devriez vous attendre à dépenser dans GitHub Actions. Cela varie en fonction du matériel utilisé pendant ces minutes. Vous pouvez utiliser la GitHub Actions calculatrice de prix pour estimer les coûts.
  • Les métriques de temps de file d’attente décrivent le temps passé par un travail à attendre qu’un exécuteur soit disponible pour l’exécuter.
  • Les métriques de travaux simultanés décrivent le nombre de travaux en cours d’exécution à un moment donné. Cette métrique peut être utilisée pour définir le nombre d’exécuteurs que vous devez configurer.

En outre, ces métriques sont définies pour chaque file d’attente d’exécuteurs dans Travis CI. C’est particulièrement utile s’il existe une combinaison d’exécuteurs hébergés ou auto-hébergés ou de machines à spécifications élevées ou faibles, afin que vous puissiez voir des métriques spécifiques à différents types d’exécuteurs.

Effectuer une migration test d’un pipeline Travis CI

Vous pouvez utiliser la dry-run commande pour convertir un pipeline Travis CI en flux de travail équivalent GitHub Actions . Une exécution test crée les fichiers de sortie dans un répertoire spécifié, mais n’ouvre pas de demande de tirage pour migrer le pipeline.

Pour effectuer une exécution sèche de la migration de vos pipelines CI Travis vers GitHub Actions, exécutez la commande suivante dans votre terminal, en my-travis-ci-repository remplaçant par le nom de votre référentiel CI Travis.

gh actions-importer dry-run travis-ci --travis-ci-repository my-travis-ci-repository --output-dir tmp/dry-run

Vous pouvez afficher les journaux du test et les fichiers de workflow convertis dans le répertoire de sortie spécifié.

S’il existe quelque chose qui GitHub Actions Importer n’a pas été en mesure de convertir automatiquement, comme les étapes de génération inconnues ou un pipeline partiellement réussi, vous pouvez créer des transformateurs personnalisés pour personnaliser davantage le processus de conversion. Pour plus d’informations, consultez « Extension de GitHub Actions Importer avec des transformateurs personnalisés ».

Effectuer une migration de production d’un pipeline Travis CI

Vous pouvez utiliser la migrate commande pour convertir un pipeline CI Travis et ouvrir une demande de tirage avec le flux de travail équivalent GitHub Actions .

Exécution de la commande "migrate"

Pour migrer un pipeline CI Travis vers GitHub Actions, exécutez la commande suivante dans votre terminal, en remplaçant la valeur par l’URL target-url de votre GitHub référentiel et my-travis-ci-repository par le nom de votre référentiel CI Travis.

gh actions-importer migrate travis-ci --target-url https://github.com/octo-org/octo-repo --output-dir tmp/migrate --travis-ci-repository my-travis-ci-repository

La sortie de la commande inclut l'URL du pull request qui ajoute le workflow converti à votre référentiel. Voici un exemple de sortie réussie :

$ gh actions-importer migrate travis-ci --target-url https://github.com/octo-org/octo-repo --output-dir tmp/migrate --travis-ci-repository my-travis-ci-repository
[2022-08-20 22:08:20] Logs: 'tmp/migrate/log/actions-importer-20220916-014033.log'
[2022-08-20 22:08:20] Pull request: 'https://github.com/octo-org/octo-repo/pull/1'

Inspection de la demande de tirage

La sortie d’une exécution réussie de la commande migrate contient un lien vers la nouvelle demande de tirage qui ajoute le workflow converti à votre dépôt.

Voici quelques éléments importants de la demande de tirage :

  • Dans la description de la demande de tirage, une section appelée Étapes manuelles, qui liste les étapes que vous devez effectuer manuellement avant de pouvoir terminer la migration de vos pipelines vers GitHub Actions. Par exemple, cette section peut vous indiquer de créer des secrets utilisés dans vos workflows.
  • Fichier de workflows converti. Sélectionnez l’onglet Fichiers changés dans la demande de tirage pour afficher le fichier de flux de travail à ajouter à votre référentiel GitHub.

Une fois que vous avez terminé d’inspecter la demande de tirage, vous pouvez la fusionner pour ajouter le flux de travail à votre référentiel GitHub.

Informations de référence

Cette section contient des informations de référence sur les variables d’environnement, les arguments facultatifs et la syntaxe prise en charge lors GitHub Actions Importer de la migration à partir de Travis CI.

Utilisation de variables d’environnement

GitHub Actions Importer utilise des variables d’environnement pour sa configuration d’authentification. Ces variables sont définies lors du processus de configuration au moyen de la commande configure. Pour plus d’informations, consultez la section Configuration des informations d’identification.

GitHub Actions Importer utilise les variables d’environnement suivantes pour se connecter à votre instance ci Travis :

  • GITHUB_ACCESS_TOKEN: Le personal access token (classic) utilisé pour créer des pull requests avec un workflow converti (nécessite l’autorisation workflow).
  • GITHUB_INSTANCE_URL: URL de l’instance cible GitHub (par exemple, https://github.com).
  • TRAVIS_CI_ACCESS_TOKEN : Jeton d’accès d’API Travis CI utilisé pour voir les ressources Travis CI.
  • TRAVIS_CI_ORGANIZATION : Nom d’organisation de votre instance Travis CI.
  • TRAVIS_CI_INSTANCE_URL : URL de l’instance Travis CI.
  • TRAVIS_CI_SOURCE_GITHUB_ACCESS_TOKEN: (Facultatif) Utilisé personal access token pour s’authentifier auprès de votre instance source GitHub. S’il n’est pas fourni, GITHUB_ACCESS_TOKEN est utilisé à la place.
  • TRAVIS_CI_SOURCE_GITHUB_INSTANCE_URL : (facultatif) URL de l’instance de GitHub source, telle que https://github.com. S’il n’est pas fourni, GITHUB_INSTANCE_URL est utilisé à la place.

Ces variables d’environnement peuvent être spécifiées dans un fichier .env.local qui est chargé par GitHub Actions Importer lors de son exécution.

Utilisation des arguments facultatifs

Vous pouvez utiliser des arguments facultatifs avec les sous-commandes GitHub Actions Importer pour personnaliser votre migration.

--source-file-path

Vous pouvez utiliser l’argument --source-file-path avec les sous-commandes forecast, dry-run ou migrate.

Par défaut, GitHub Actions Importer extrait le contenu du pipeline à partir du contrôle de code source. L’argument --source-file-path indique à GitHub Actions Importer d'utiliser à la place le chemin d’accès du fichier source spécifié.

Par exemple :

gh actions-importer dry-run travis-ci --output-dir ./path/to/output/ --travis-ci-repository my-travis-ci-repository --source-file-path ./path/to/.travis.yml

--allow-inactive-repositories

Vous pouvez utiliser cet argument pour spécifier s’il GitHub Actions Importer convient d’inclure des référentiels inactifs dans un audit. Si cette option n’est pas définie, les dépôts inactifs ne sont pas inclus dans les audits.

gh actions-importer dry-run travis-ci --output-dir ./path/to/output/ --travis-ci-repository my-travis-ci-repository --allow-inactive-repositories

--config-file-path

Vous pouvez utiliser l’argument --config-file-path avec les sous-commandes audit, dry-run et migrate.

Par défaut, GitHub Actions Importer extrait le contenu du pipeline à partir du contrôle de code source. L’argument --config-file-path indique à GitHub Actions Importer d’utiliser les fichiers sources spécifiés à la place.

Exemple d'Audit

Dans cet exemple, GitHub Actions Importer utilise le fichier de configuration YAML spécifié pour effectuer un audit.

gh actions-importer audit travis-ci --output-dir ./path/to/output/ --config-file-path ./path/to/travis-ci/config.yml

Pour auditer une instance Travis CI avec un fichier de configuration, celui-ci doit être au format suivant et chaque valeur repository_slug doit être unique :

source_files:
  - repository_slug: travis-org-name/travis-repo-name
    path: path/to/.travis.yml
  - repository_slug: travis-org-name/some-other-travis-repo-name
    path: path/to/.travis.yml
Exemple d’exécution test

Dans cet exemple, GitHub Actions Importer utilise le fichier de configuration YAML spécifié comme fichier source pour effectuer une exécution sèche.

Le pipeline est sélectionné en faisant correspondre le repository_slug dans le fichier de configuration à la valeur de l’option --travis-ci-repository. path est ensuite utilisé pour tirer (pull) le fichier source spécifié.

gh actions-importer dry-run travis-ci --travis-ci-repository travis-org-name/travis-repo-name --output-dir ./output/ --config-file-path ./path/to/travis-ci/config.yml

Langages de projet pris en charge

GitHub Actions Importer prend en charge la migration de projets Travis CI dans les langues suivantes.

  • android
  • bash
  • c
  • clojure
  • c++
  • crystal
  • c#
  • d
  • dart
  • elixir
  • erlang
  • generic
  • go
  • groovy
  • haskell
  • haxe
  • java
  • julia
  • matlab
  • minimal
  • nix
  • node_js
  • objective-c
  • perl
  • perl6
  • php
  • python
  • r
  • ruby
  • rust
  • scala
  • sh
  • shell
  • smalltalk
  • swift

Syntaxe prise en charge pour les pipelines Travis CI

Le tableau suivant montre le type de propriétés GitHub Actions Importer actuellement en mesure de convertir. Pour plus d’informations sur la façon dont la syntaxe de pipeline Travis CI s’aligne sur GitHub Actions, consultez Migration de Travis CI vers GitHub Actions.

Travis CIActions GitHubStatut
branches
  • on.<push>.<branches>
Prise en charge
build_pull_requests
  • on.<pull_request>
Prise en charge
env
  • env
  • jobs.<job_id>.env
  • jobs.<job_id>.steps.env
Prise en charge
si
  • jobs.<job_id>.if
Prise en charge
tâche
  • jobs.<job_id>
  • jobs.<job_id>.name
Prise en charge
matrice
  • jobs.<job_id>.strategy
  • jobs.<job_id>.strategy.fail-fast
  • jobs.<job_id>.strategy.matrix
Prise en charge
os &dist
  • runners
Prise en charge
Scripts
  • jobs.<job_id>.steps
Prise en charge
étapes
  • jobs
Prise en charge
env
  • on
Partiellement pris en charge
branches
  • on.<push>.<tags>
  • on.<push>.paths
Non pris en charge
build_pull_requests
  • on.<pull_request>.<branches>
  • on.<pull_request>.<tags>
  • on.<pull_request>.paths
Non pris en charge
déclencheurs cron
  • on.schedule
  • on.workflow_run
Non pris en charge
env
  • jobs.<job_id>.timeout-minutes
  • on.<event_name>.types
Non pris en charge
tâche
  • jobs.<job_id>.container
Non pris en charge
os &dist
  • self hosted runners
Non pris en charge

Pour plus d’informations sur les constructions Travis CI prises en charge, consultez le référentiel github/gh-actions-importer.

Syntaxe des variables d’environnement

GitHub Actions Importer utilise le mappage dans le tableau ci-dessous pour convertir les variables d’environnement Travis CI par défaut en équivalent le plus proche dans GitHub Actions.

Travis CIActions GitHub
$CONTINUOUS_INTEGRATION$CI
$USER${{ github.actor }}
$HOME

${{ github.workspace }}

| | $TRAVIS_BRANCH | ${{ github.ref }} | | $TRAVIS_BUILD_DIR | ${{ github.workspace }} | | $TRAVIS_BUILD_ID | ${{ github.run_number }} | | $TRAVIS_BUILD_NUMBER | ${{ github.run_id }} | | $TRAVIS_COMMIT | ${{ github.sha }} | | $TRAVIS_EVENT_TYPE | ${{ github.event_name }} | | $TRAVIS_PULL_REQUEST_BRANCH | ${{ github.base_ref }} | | $TRAVIS_PULL_REQUEST | ${{ github.event.number }} | | $TRAVIS_PULL_REQUEST_SHA | ${{ github.head.sha }} | | $TRAVIS_PULL_REQUEST_SLUG | ${{ github.repository }} | | $TRAVIS_TAG | ${{ github.ref }} | | $TRAVIS_OS_NAME | ${{ runner.os }} | | $TRAVIS_JOB_ID | ${{ github.job }} | | $TRAVIS_REPO_SLUG | ${{ github.repository_owner/github.repository }} | | $TRAVIS_BUILD_WEB_URL | ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} |

Certaines parties ont été adaptées à partir de https://github.com/github/gh-actions-importer/ sous la licence MIT :

MIT License

Copyright (c) 2022 GitHub

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.