2012-07-18 12 views
11

Estoy ejecutando Jenkins y lo tengo trabajando con éxito con mi cuenta de Github, pero no puedo hacerlo funcionar correctamente con Amazon S3.Jenkins Integración continua con Amazon S3: ¿todo está subiendo a la raíz?

Instalé el complemento S3 y cuando ejecuto una compilación, la carga correctamente en el depósito S3 que especifico, pero todos los archivos cargados terminan en la raíz del depósito. Tengo un montón de carpetas (como/css/js, etc.), pero todos los archivos en esas carpetas de hithub terminan en la raíz de mi cuenta S3.

¿Es posible obtener el complemento S3 para cargar y conservar la estructura de carpetas?

Respuesta

15

Parece que esto no es posible. En cambio, estoy usando s3cmd para hacer esto. Primero debe instalar en su servidor, y luego en uno de los scripts bash dentro de un trabajo Jenkins se pueden utilizar:

s3cmd sync -r -P $WORKSPACE/ s3://YOUR_BUCKET_NAME 

que copiará todos los archivos a su cuenta S3 mantener la estructura de carpetas. El -P mantiene los permisos de lectura para todos (es necesario si está utilizando su depósito como servidor web). Esta es una gran solución que utiliza la función de sincronización, ya que compara todos los archivos locales con el depósito S3 y solo copia los archivos que han cambiado (al comparar el tamaño de los archivos y las sumas de comprobación).

+1

Yo sugeriría usar t él JClouds Enchufe ahora. – Aron

+0

JClouds tampoco es genial; sigue fallando con un error oscuro sobre la transmisión. Tener que recurrir a una herramienta CLI para esto es ridículo ... – aendrew

+0

s3cmd no es óptimo, ya que requiere una tienda separada para las credenciales de aws. El uso de s3 de los perfiles s3 para la autenticación tiene sus méritos. De acuerdo en que preservar la jerarquía de artefactos sería preferible al comportamiento actual. –

3

Nunca he trabajado con el plugin S3 para Jenkins (pero ahora que sé que existe, podría intentarlo), sin embargo, mirando el código, parece que solo puedes hacer lo que quieras usando una solución alternativa .

Aquí es lo que el código del plugin real no (tomado de github) --que eliminado las partes del código que no son relevantes para facilitar la lectura:

clase hudson.plugins.s3.S3Profile, método upload:

final Destination dest = new Destination(bucketName,filePath.getName()); 
getClient().putObject(dest.bucketName, dest.objectName, filePath.read(), metadata); 

Ahora bien, si se echa un vistazo a JavaDoc hudson.FilePath.getName() 's:

Obtiene sólo la parte de nombre de archivo sin directorios.

Ahora, echar un vistazo a la hudson.plugins.s3.Destination 's constructor:

public Destination(final String userBucketName, final String fileName) { 

    if (userBucketName == null || fileName == null) 
     throw new IllegalArgumentException("Not defined for null parameters: "+userBucketName+","+fileName); 

    final String[] bucketNameArray = userBucketName.split("/", 2); 
    bucketName = bucketNameArray[0]; 
    if (bucketNameArray.length > 1) { 
     objectName = bucketNameArray[1] + "/" + fileName; 
    } else { 
     objectName = fileName; 
    } 
} 

el Javadoc Destination clase dice:

La convención implementado aquí es que un/en un nombre de depósito es usado para construir una estructura en el nombre del objeto. Es decir, un archivo de .txt al nombre del paquete de "mybucket/v1" hará que se cree el objeto "v1/file.txt" en mybucket.

Conclusión: los filePath.getName() tiras de llamada con el prefijo (S3 no tiene ningún directorio, sino más bien prefijos, ver this y this hilos para más información) se añaden al archivo. Si realmente necesita poner sus archivos en una "carpeta" (es decir, tener un prefijo específico que contiene una barra inclinada (/)), le sugiero que agregue este prefijo al final de su nombre de depósito, como se explicita en la clase JavaDoc Destination .

1

Sí, esto es posible.

Parece que para cada destino de la carpeta, necesitará una instancia separada del complemento S3.

"Fuente" es el archivo que está cargando.

"Cubo de destino" es donde coloca su ruta.

+0

No es completamente recursivo, pero puede cargarlo en un subdirectorio dentro del segmento s3. –

1

Usando Jenkins 1.532.2 y S3 Publisher Plug-In 0.5, la pantalla de trabajo de configuración de UI rechaza las entradas de publicación de S3 adicionales. También habría un importante beneficio de mantenimiento para nosotros si el complemento recreara la estructura del directorio del espacio de trabajo, ya que tendremos muchos directorios para crear.

+1

ese plugin no está peor intentándolo! está bien para cargar un archivo pero no mantiene la estructura del directorio. – mohamnag

1
  1. Configure su plugin git.

enter image description here

  1. Establecer la secuencia de comandos Bash

enter image description here

  1. Todo en su carpeta marcada como "*" irá al cubo