Uno de mis proyectos de pasatiempos (de código abierto) es una herramienta de copia de seguridad que realiza copias de seguridad fuera de línea de repositorios desde GitHub, Bitbucket, etc.
Llama a la API de los anfitriones para obtener una lista de repositorios, y luego usa Git / Mercurial / lo que sea para clonar / tire de los repositorios a la computadora local.
Así que tengo pruebas de integración donde llamo a la API de GitHub, con autenticación.
(y cuando finalice la función de clonación / extracción, probablemente habrá pruebas de los repositorios de clonación de GitHub y también deberá autenticarse)
Creé un usuario y una organización especialmente para usar en estas pruebas de integración.
Problema: no puedo codificar las contraseñas en algún lugar del código fuente porque es de código abierto y el código es público en GitHub.
Lo que estoy haciendo ahora
En las pruebas, obtengo todos los nombres de usuario, contraseñas y nombres de repositorio de variables de entorno.
Aquí hay un ejemplo :
config.Name = TestHelper.EnvVar("GithubApiTests_Name");
config.Password = TestHelper.EnvVar("GithubApiTests_PW");
( TestHelper.EnvVar
es un método auxiliar que obtiene el valor de una variable de entorno y genera una excepción cuando no existe)
Luego, tengo un archivo por lotes que establece esas variables de entorno.
El real ( environment-variables.bat
) se llama en mi script de compilación y antes de ejecutar las pruebas, pero se ignora en el control de origen, por lo que no está realmente en mi repositorio.
Lo que está en el control de origen es environment-variables.bat.sample
, que establece las mismas variables de entorno, pero con contraseñas falsas:
rem copy/rename this file to environment-variables.bat
echo Setting environment variables for integration tests...
set GithubApiTests_Name=scm-backup-testuser
set GithubApiTests_OrgName=scm-backup-testorg
set GithubApiTests_PW=not-the-real-password
set GithubApiTests_Repo=scm-backup
Entonces puedo clonar el repositorio en mi máquina, cambiar el nombre de este archivo environment-variables.bat
, reemplazar la contraseña falsa por la real y todas las pruebas de integración funcionarán.
Esto también funciona con la integración continua: estoy usando AppVeyor y allí puedo configurar estas variables de entorno en la interfaz de usuario web .
Lo que no me gusta de eso
Creo que no es una buena solución para un proyecto OSS, y especialmente no para este proyecto:
En teoría, un contribuyente a mi proyecto podría ejecutar las pruebas de integración en este momento:
- creando su propio usuario de prueba y organización de prueba en GitHub
- creando algunos repositorios de prueba
- creando su propia versión de
environment-variables.bat
con diferentes valores
El problema es que mi aplicación podrá hacer una copia de seguridad de múltiples proveedores de código fuente.
En este momento, solo admite GitHub, pero será fácil agregar soporte para más servidores agregando algunas clases que implementan las interfaces correctas.
Entonces, cuando implemente soporte para más hosts más tarde, la cantidad de variables de entorno crecerá.
Para poder ejecutar todas las pruebas de integración, un contribuyente potencial crearía sus propios usuarios, organizaciones y repositorios de prueba en GitHub, Bitbucket, GitLab, ... y quién sabe cuántos más, y los agregaría a su environment-variables.bat
versión.
¿Existe una mejor solución para hacer esto en un proyecto donde el código es público?
Sé que otros proyectos hacen algo similar a lo que estoy haciendo actualmente.
Octokit.net , por ejemplo, tiene un script para configurar variables de entorno para pruebas de integración que están llamando a la API de GitHub.
Pero solo necesitan un usuario y una organización, y yo necesitaré mucho más.
Tal vez no necesito una solución que permita a un contribuyente ejecutar realmente todas las pruebas de integración.
Por ejemplo, si alguien quisiera contribuir al soporte de GitHub de mi proyecto, solo necesitaría poder ejecutar las pruebas de integración de GitHub.
Entonces, tal vez solo necesito una forma sensata de poder dividir mis pruebas de integración en un número infinito de "grupos" (?) Y luego decir "y ahora ejecutar todas las pruebas que pertenecen al grupo 'Github'".
fuente