Descargar el script ../scripts/docker/DocuDocker.groovy
05 March 2018
A continuación se describe el caso de uso que vamos a desarrollar: Un cliente nos traslada la necesidad de crear una biblioteca de documentos, donde colgar manuales o notas informativas para sus empleados. Esta información cambia de manera mensual, tanto el contenido como la estructura de directorios. Además debe de correr en cualquier sistema operativo ya que al trabajar con varios clientes cada uno cuenta con el suyo propio.
Nuestra solución se basará en una imagen Docker con un servidor web de contenido estático, donde habremos copiado los documentos proporcionados por el cliente generando un image versionada con esta información.
Así pues nuestro sistema debe de realizar los siguientes pasos:
En este enlace @jagedn explica paso a paso como crear una biblioteca con docker y jbake utilizando el proyecto static-documents.
Dentro de este proyecto podemos encontrar el fichero Dockerfile que contiene la "receta" para generar nuestra imagen docker de la biblioteca:
FROM httpd:2.4 EXPOSE 80 COPY . /usr/local/apache2/htdocs/
Este Dockerfile parte de la imagen de docker httpd:2.4 y copia el contenido que tenemos en la ruta actual dentro de su servidor apache. Por lo tanto a la hora de actualizar los documentos debemos centrarnos en este paso. En el ejemplo sobre el que vamos a trabajar tiene la estructura: un directorio RRHH (que contiene Convenio_Actual.pdf) y otro Administración (que contiene Cierre_mensual.pdf)
La herramientas que utiliza este proyecto es gradle y para la creación del entorno web estático es JBake.
Para la creación de nuestra biblioteca debemos ejecutar los siguientes pasos:
Bajarnos en el servidor que deseamos crear la biblioteca el proyecto static-documents para posteriormente realizar las tareas de gradle:
git clone https://gitlab.com/jorge.aguilera/static-documents.git
Con el proyecto bajado debemos copiar dentro del proyecto en el directorio src/documents/
la estructura
de directorios(en nuestro caso RRHH y Administración ) que deseamos encontrarnos en nuestra biblioteca ,
así como la información dentro de cada directorio.
Cuando tengamos recopilada toda la información, ejecutar las tareas de gradle para generar la imagen docker. Utilizaremos sshoogr ya que en este caso que vamos a ver la información estará en un servidor remoto.
A continuación vamos a pasar a describir el script encargado de realizar cada una de las funciones descritas anteriormente:
Estas son las que vamos a necesitar:
@Grab('com.aestasit.infrastructure.sshoogr:sshoogr:0.9.25')
@GrabConfig(systemClassLoader=true)
import static com.aestasit.infrastructure.ssh.DefaultSsh.*
options.trustUnknownHosts = true //(1)
Desactivación de la comprobación estricta de la clave del host
El primer paso es eliminar del fichero build.gradle
del proyecto los campos version
y tagVersion
para impedir
que en la creación de nuestra imagen tomen estas referencias a la hora de crear nuestra biblioteca. Nuestro script
creará un fichero gradle.properties con la versión que hemos recibo por parametro y que será el tag de la imagen.
Utilizamos la función updateVersion que recibe por parámetro el servidor donde se encuentra el proyecto y la ruta del fichero gradle.properties que será actualizado.
remoteSession("user:password@$server:22"){
remoteFile("$orig/gradle.properties").text = "version=$version"
}
Para este paso utilizaremos la función scpDocuments, a la cual le debemos indicar la ruta donde se encuentra la documentación por parámetro y la ruta en el servidor destino
remoteSession("user:password@$server:22") {
scp{
from { localDir orig}
into { remoteDir dest}
}
}
Ya solo nos queda ejecutar las tareas gradle build y pushDockerRegistry (para subirla a nuestro repositorio). Para ello realizaremos:
remoteSession("user:password@$server:22") { exec "cd $src; ./gradlew build" exec "cd $src; ./gradlew pushDockerRegistry" }
En este punto una nueva imagen etiquetada se encuentra en nuestro repositorio y puede ser descargada por los clientes para ver la última versión de los documentos
@Grab('com.aestasit.infrastructure.sshoogr:sshoogr:0.9.25')
@GrabConfig(systemClassLoader=true)
import static com.aestasit.infrastructure.ssh.DefaultSsh.*
options.trustUnknownHosts = true
String server = "src_server"
def cli = new CliBuilder(usage: 'groovy CliBuilder.groovy -[husc]')
cli.with { (1)
h(longOpt: 'help ','Usage Information \n', required: false)
u(longOpt: 'Actualización ','-u version servidor ruta -> Ejemplo: -u v1 localhost', required: false)
s(longOpt: 'Copiado de ficheros','-s servidor origen destino -> Ejemplo: -s localhost /tmp /home/docu', required: false)
c(longOpt: 'Crear Imagen ','-c servidor ruta -> Ejemplo: -c ruta', required: false)
}
def options = cli.parse(args)
if (!options) {
return
}
if (options.h) {
cli.usage()
return
}
if (options.u) {
if (options.arguments().size() < 3) {
cli.usage()
return
}
updateVersion(options.arguments()[0],options.arguments()[1],options.arguments()[2])
}
if (options.s) {
if (options.arguments().size() < 3) {
cli.usage()
return
}
scpDocuments(options.arguments()[0],options.arguments()[1],options.arguments()[2])
}
if (options.c) {
if (options.arguments().size() < 3) {
cli.usage()
return
}
createImage(options.arguments()[0],options.arguments()[1])
}
def updateVersion(version,server,orig){
//tag::version[]
remoteSession("user:password@$server:22"){
remoteFile("$orig/gradle.properties").text = "version=$version"
}
//end::version[]
}
def createImage(server,src){
//tag::create[]
remoteSession("user:password@$server:22") {
exec "cd $src; ./gradlew build"
exec "cd $src; ./gradlew pushDockerRegistry"
}
//end::create[]
}
def scpDocuments(server,orig,dest){
//tag::put_dir[]
remoteSession("user:password@$server:22") {
scp{
from { localDir orig}
into { remoteDir dest}
}
}
//end::put_dir[]
}