Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-11-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
[GUIA] Usando Jenkins con Delphi

Que es Jenkins? Jenkis es un sistema de integracion continua (CI() . Basicamente lo que hace es automatizar tareas como testing, compilacion y distribucion de nuestros proyectos; pasado a limpio, compila automaticamente por nosotros

Que ventajas tiene esto?

- Incrementar la productividad: Automatizar tareas siempre es bueno para incrementar la productividad. Cuando uno tiene mas y mas proyectos se vuelve algo tedioso el tener que compilar todo y ponerlo "en linea"; ademas, con los modelos de software de hoy en dia y el auge de los repositorios en la nube (git, subversion, etc) los cambios en los proyectos son permanentes. La "ultima version" ya es vieja

Se pueden hacer infinitas cosas con Jenkins: enviar mails, subir archivos por FTP, ejecutar comandos bat, ejecutar shell script, etc

- Facilita el testing: Los tester no siempre tienen que tener acceso al codigo fuente para poder compilar. Los testers no siempre tienen que saber como se hace "todo eso" para poder testear. Ellos necesitan la ultima version para probarla

- Facilita el soporte/mesa de ayuda: Llaman por telefono o mandan un mail a soporte: "Hola, como hago para xxx". Este tipo de cosas, requiere que en soporte siempre tengan instalado nuestros programas y que sea siempre la ultima version (en realidad lo mejor es tener TODAS las versiones para asi poder usar la de nuestro usuario). Para los desarrolladores, es muy engorroso tener que dejar una computadora actualizada siempre "a lo ultimo"

- Disponibilidad: No hace falta alguien capacitado para poder obtener la ultima version; asi, la gente que se encarga de vender, de marketing y de mantener la web o las redes sociales bien "chulas" con lo ultimo de lo ultimo, siempre tienen acceso a "lo ultimo de lo ultimo". No hace falta llamar al licenciado para que le de F9 desde el IDE .

- Los errores se encuentran antes: Debido a que continuamente se esta actualizando el software, continuamente se esta testeando; mas testeo = mas errores encontrados antes de liberar una nueva version

- Posiblidad de ofrecer versiones "release-candidate" de forma automatica. Basicamente le podemos decir a Jenkis que ejecute un pull de Git, compile el proyecto y luego lo suba a un FTP/Dropbox/haga lo que sea que haga falta

En fin..

Hace unos años se decia que, incluso aunque seamos una sola persona, es una muy buena idea usar un SCM (gestion de codigo fuente, como Mercurial, entre otros)

Hoy se dice lo mismo pero de CI. En esta ocasion voy a presentar a Jenkins que se integra perfectamente bien con Delphi

----



Primero, descargamos el paquete para Windows en la pagina oficial de Jenkins

La instalación basicamente nos preguntará en que directorio queremos instalar Jenkins, nada más. Increiblemente sencillo

Apenas terminada la instalacion, se nos abrira un browser apuntando a localhost:8080; Jenkins se administra en su totalidad desde un browser, lo cual lo hace bastante practico, podríamos acceder desde "afuera" sin tener que andar instalando nada

El punto fuerte de Jenkins es que esta preparado para ser extendido facilmente utilizando un sistema de plugins. Para administrar plugins simplemente debemos irnos a < Administrar Jenkins > / < Administrar Plugins >.

Tambien es posible acceder mediante URL, http://localhost:8080/pluginManager/

En esta ventana podremos actualizar, eliminar o agregar nuevos plugins. Es realmente sencillo.

Lo primero que hago yo es actualizar lo que sea necesario (es una costumbre que tengo, me gusta tener todo al dia)

A nosotros nos interesa un plugin que se va a encargar de compilar los proyectos Delphi: RAD Studio Plugin. Para instalarlo simplemente hay que dirijirse a la pestaña < Todos los plugins >, y en el edit que nos sale arriba podemos filtrar y buscar el plugin que querramos

Luego marcamos el checkbox, y le damos al boton < Descargar ahora e instalar despues de reiniciar >

Para reiniciar Jenkins, hay que ingresar esta URL en el browser: http://localhost:8080/restart

Notar que esto es un reinicio "forzoso", si Jenkins en ese momento estaba ejecutando alguna tarea sera interrumpido/

Para un reinicio seguro (esperar a que terminen todas las tareas, y luego reiniciar) se usa: http://localhost:8080/safeRestart

Ahora debemos configurar el plugin para que detecte nuestras instalaciones de Delphi; asi que desde Home (http://localhost:8080/), vamos a < Administrar Jenkins > / < Configurar sistema >.

Siguiendo, buscamos la seccion RAD Studio y hacemos click en < Añadir RAD Studio >

Esta es una de las partes que tiene "truco", ya que este plugin lamentablemente no cuenta con documentacion de ningun tipo

El el edit "Name", ingresamos un nombre para identificar una instalacion de Delphi. Por ejemplo, yo como voy a usar Delphi 2010, simplemente le puse de nombre
"Delphi 2010".

En el edit "Home (BDS)" debemos ingresar la ruta donde esta instalado el Delphi en cuestion. En mi caso:

Código:
C:\Program Files (x86)\Embarcadero\RAD Studio\7.0\
En este momento ya estamos en condiciones de poder crear una nueva tarea para compilar nuestros proyectos Delphi. Asi que nos dirijimos a Home

En el menu de la izquierda tendremos la opcion < Nueva tarea >. Pulsamos y se nos solicitara un nombre y tipo de tarea. En el tipo seleccionamos la primer opcion "Crear un proyecto de estilo libre"

Algo muy bueno Jenkins es la ayuda que tiene incorporada. En esta ventana casi todos los puntos que se nos solicita, tiene a su derecha un icono de ayuda (con el signo ?). Al hacer click se expande la ayuda para ese objeto, la cual es muy precisa y en muchos casos hasta provee ejemplos

Es interesante ver que Jenkins se integra perfectamente con los sistemas de gestion de codigo fuente, como Git, Subversion, etc. Volveremos mas adelante sobre esto/

Para este ejemplo sencillo que vamos a crear, a nosotros nos interesan dos puntos:

a. Disparadores de ejecuciones: Cuando se va a ejecutar esta tarea?

En este caso voy a hacer algo bastante inutil, que es compilar cada 15 minutos. Para ello debemos ingresar:

Código:
H/15 * * * *
Para este caso en particular la ayuda lo es todo

Veremos mas adelante que se pueden hacer cosas mas interesantes, por ejemplo, cuando se pushea a nuestro repositorio Git, Mercurial, etc, Jenkins recibe la notificacion y compila. Muy poderoso

b. Ejecutar: Al dispararse esta tarea, que debe hacerse?

Clickeamos en el combo < Añadir un nuevo paso >
Seleccionamos < Build a RAD Studio project or project group >
En el combo "RAD Studio" elegimos que Delphi queremos usar. Aca nos van a aparecer todos los que vayamos cargando. Podemos tener distintas instalaciones de Delphi sin ningun problema
En el edit "Project file" ingresamos la ruta de nuestro projecto. Puede ser un grupo (.groupproj), un .dpr (Delphi < 2007) o .dproj (Delphi >= 2007)
En Switches yo nunca pongo nada; supongo que son argumentos para el compilador (dcc32)

Listo! Damos en guardar y ya esta.

Ahora nos devuelve a la pantalla principal del proyecto que acabamos de crear. Desde aca podemos ver el Changelog, la historia de builds, el workspace (espacio de trabajo). Para probar que todo este correcto damos, en el menu de la izquierda, click en "Construir ahora".

En este punto quiza sea interesante activar la opcion, arriba a la derecha, de auto-refrescado

Entonces veremos como se encola un nuevo trabajo y Jenkis ejecuta lo que programamos. Si todo va bien, deberiamos tener un punto azul. Si hubo algun problema, el punto sera de color rojo. Podemos ver en tiempo real, o cuando querramos, la salida a consola; de esta manera podemos ver que hizo Jenkins, y si hubo algun problema, poder ver cual es el fallo para poder solucionarlo

Lo normal es que en este punto nos de error, y si revisamos la salida a consola, veamos que no encuentra las unidades basicas de Delphi; por ejemplo, la "System.pas" o el .DCU equivalente

Esto es porque Jenkins por defecto se instala como un servicio de Windows que corre en la cuenta del sistema local. Y parece ser que algunos plugins (el de Delphi, el de Git) necesitan que los ejecute un usuario "comun" de Windows. Solucionarlo es, por suerte, muy sencillo.

Vamos a inicio -> ejecutar (o usamos la combinacion de teclas, CTRL + R) y escribimos services.msc

En Windows 7 o superior, podemos ir al administrador de tareas, pestaña servicios, y luego hacer click en el boton "Servicios"

En la lista de servicios, buscamos Jenkins. hacemos doble click y en el cuadro de propiedades, vamos a la pestaña de inicio de sesion.
Veremos que esta seleccionada la opcion "Cuenta del sistema local". Debemos seleccionar la otra opcion, "Esta cuenta"

Si no queremos problemas, lo que hacemos es asignarle nuestra cuenta de usuario
Si queremos asignarle una cuenta que solamente va a usar Jenkins (lo cual es buena idea), debemos tomar una medida adicional:

Si la cuenta en cuestion la creamos despues de instalar Delphi, o bien, cuando instalamos Delphi no seleccionamos la opcion "All users" o "Todos los usuarios", nos faltaran algunos archivos que el compilador busca en el espacio de usuario y no podra compilar. Asi que abrimos el explorador de Windows y nos vamos a:

- En Windows XP: C:\Documents and Settings\<Usuario>\Datos de programa
- En Windows 7 o superior: C:\Users\<Usuario>\AppData\Roaming

Sepan disculpar que en este caso haya puesto una ruta en español y la otra en ingles, lamentablemente nuestro server Win 2003 viene en español,
en tanto mi Windows 10 esta en ingles


Quien es "<Usuario>"?.

<Usuario> debe ser la cuenta que seleccionamos para instalarle Delphi. Dicho de otra forma, si iniciamos sesion con esa cuenta, y desde la linea de comandos ejecutamos dcc32 deberia salirnos la ayuda del compilador de Delphi.

Si nos indica que no reconoce el comando dcc32 entonces Jenkins no podrá compilar, al menos no si se ejecuta desde esa cuenta

Una ves estemos dentro de ese directorio, debemos copiar las carpetas de Delphi. Ahora esta parte tambien tiene truco ya que depende de nuestra version de Delphi, son distintas carpetas. Por ejemplo, para Delphi 2010 la carpeta es "CodeGear"; supongo que para las versiones mas antiguas debe haber una "Borland", y las mas nuevas una "Embarcadero". De todos modos, si algo que sobra no pasa nada.

Y donde lo copiamos? En la misma ruta pero de la cuenta que asignamos a Jenkins. Ahora si, se deberia poder ejecutar la tarea sin ningun problema


Ahora veremos como podemos agregar un SCM a la formula y que se ejecute el build cuando se pushea
Responder Con Cita
  #2  
Antiguo 16-11-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Veamos como integrar un SCM en Jenkins.

En este caso voy a utilizar Git como SCM; y GitLab como host del repositorio Git

Lo primero que debemos hacer es volver a la parte de Administrar Plugins en Jenkins:

http://localhost:8080/pluginManager/

E instalaremos

GIT Plugin
GitLab Plugin .

Luego reiniciamos Jenkins

Si queremos recibir notificaciones de GitLab cuando se pushea al repositorio, tendremos que tomar una medida adicional. Sino, podemos seguir con la estrategia de cada determinado lapso de tiempo, compilar; solo que en este caso, al estar el repositorio de por medio, Jenkins va a ejecutar un pull y bajar los ultimos cambios automaticamente.

Para recibir notificaciones de GitLab:

Necesitaremos nuestro ip externo, lo ideal es contar con un DNS.
Vamos a la configuracion del sistema Jenkins: http://localhost:8080/configure
Bajamos hasta "Jenkins Location". Veremos que hay un aviso en amarillo que nos indica que en lugar de localhost:8080 pongamos un nombre "correcto"

Aca introducimos nuestro ip externo o DNS, respetando la sintaxis (el puerto 8080)

Para verificar que todo esta bien, probamos ingresar a Jenkins usando nuestro ip o dns desde el navegador. Es necesario que el puerto este habilitado tanto en el router y firewall de Windows

Ahora lo que hacemos es volver al proyecto que creamos antes (o creamos uno nuevo, como quieran) y seleccionamso "Configurar" en el menu de la izuiqerda

Volvemos a la misma pagina donde configuramos el proyecto inicialmente. En este caso vamos a modificar en la seccion "Configurar el origen del código fuente"

Ahora que instalamos el GIT plugin, deberia aparecer la opcion "Git", la seleccionamos

Se nos solicitaran dos cosas: (la ayuda en este caso es realmente detallada, recomiendo revisarla)

- URL repositorio: es la misma que usamos para clonar
- Credenciales: de ser necesarios, obviamente

Antes estabamos compilando cada 15 minutos.. algo bastante inutil. Ahora vamos a configurar Jenkins para que reciba una notificacion cuando se pushea al repositorio; Jenkins la va a recibir, va a ejecutar un comando pull (va a bajar los ultimos cambios) y compilar

Vamos a la seccion de "Disparadores de ejecuciones"

Tildamos la opcion: Build when a change is pushed to GitLab. GitLab CI Service URL: http://<IP/DNS/localhost>:8080/project/XXX

Es importante la direccion que nos informa en "GitLab CI Service URL"; esta dependera de la configuracion de Jenkins. Queire decir que en esa direccion es en donde Jenkins estará escuchando las notificaciones de GitLab. Obviamente, que en localhost nunca va a poder recibir nada, de alli la importancia del paso anterior

Copiamos la direccion en cuestion al portapapeles

En este punto podemos guardar los cambios en Jenkins y nos vamos para GitLab.

Una ves en GitLab, buscamos el proyecto, y nos dirijimos a "Settings"

https://gitlab.com/<usuario o grupo>/<proyecto>/edit

Luego entramos en "Web Hooks"

https://gitlab.com/<usuario o grupo>/<proyecto>/hooks

Y ahora es cuestion de ingresar la direccion que teniamos en el portapapeles y marcar en que momento nos interesa que nos mande una notificacion.
Podemos probar facilmente que este todo bien, haciendo click en el boton "Test Hook" Al hacerlo, aparecera el mensaje "Hook successfully executed." arriba
Si volvemos a Jenkins deberiamos ver como se ejecuta nuestra tarea, Jenkins en ese momento va a comenzar a clonar el repositorio

Es interesante que cuando una tarea se ejecuta nos indica quien la disparo. Hasta ahora solo teniamos "annonymous", ya que eramos nosotros mismo dandole a Build desde el browser. En este caso por ejemplo yo obtuve:

"Started ​by ​GitLab ​push ​by ​Agustin ​Ortu"

Esto nos permite obtener un mayor control sobre quien y cuando hace las cosas

Jenkins utiliza los llamados "workspace" para almacenar todo lo que necesita para trabajar con nuestro proyecto. La carpeta principal que contiene todos los workspace esta en el directorio de instalacion de Jenkins\workspace; por ejemplo, al clonar el repositorio git, deberia habernos creado una carpeta

\workspace\<proyecto>\

Y ahi mismo deberia estar el contenido del repositorio.

El workspace esta disponible desde el browser, podemos ver el contenido haciendo click en la opcion "Espacio de trabajo" del menu lateral de la izquierda.

El workspace es un concepto bastante interesante ya que es el directorio activo al momento de ejecutarse la tarea; esto nos vale para una ultima modificacion: asi que volvemos a la parte de configuracion del proyecto

Anteriormente, habiamos configurado el RAD Studio Plugin para que compile en una determinada ruta cierto proyecto. Vamos a configurarlo ahora para que utilice siempre la copia del workspace, ya que es la que va a estar actualizando constantemente gracias a la integracion con GitLab.

Simplemente, hay que quitar la ruta y dejar solo el nombre del archivo, ya que como dije antes, el directorio activo es el workspace, y dentro del workspace deberia estar nuestro proyecto; mejor dicho, es la ruta relativa de nuestro proyecto Delphi dentro del repositorio Git, evidentemente si esta dentro de otra carpeta deberiamos incluirlo en la ruta. Pero por lo genral los .groupproj o los .dproj estan en la raiz
Responder Con Cita
  #3  
Antiguo 16-11-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Gracias por compartirlo.
¿Qué tipo de licencia tiene?
Responder Con Cita
  #4  
Antiguo 16-11-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Gracias por compartirlo.
¿Qué tipo de licencia tiene?
La licencia MIT

Código:
Jenkins is distributed under the MIT License.
https://wiki.jenkins-ci.org/display/...S/Meet+Jenkins
Responder Con Cita
  #5  
Antiguo 16-11-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Estupendo
Responder Con Cita
  #6  
Antiguo 16-11-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Vaya, resulta que uno aprende hasta cuando enseña

Como comentaba, en mi pc de desarrollo voy con Windows 10, en este caso, los workspace de cada proyecto se almacenan en:

Código:
C:\Program Files (x86)\Jenkins\workspace\proyecto_1
C:\Program Files (x86)\Jenkins\workspace\proyecto_2
...
Luego esta este otro directorio:

Código:
C:\Program Files (x86)\Jenkins\jobs
Que tambien contiene una carpeta por proyecto, dentro de la cual esta la configuracion de la tarea Jenkins y toda la historia que se ve desde el browser.

Bueno, a medida que arme la guia fui instalando todo en el servidor de desarrollo, que corre en Windows Server 2003.

En este caso, hay algunas diferencias:

1. No existe el directorio "C:\Program Files (x86)\Jenkins\workspace"
2. Cada workspace esta dentro de la carpeta Jobs\Proyecto\workspace

Para tener en cuenta...

Saludos
Responder Con Cita
  #7  
Antiguo 16-11-2015
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
En las nuevas versiones viene incluido https://www.finalbuilder.com/finalbuilder. Esa fue la primera herramienta de automatizacion de builds que use, y es muy facil de manejar.

P.D: Para evitar los problemas que las rutas, en este tipo de herramienta se usan variables o llamadas a API para obtener lo necesario dinamicamente.

Ademas, es IDEAL si esto se ejecuta contra un control de codigo fuente como mercurial/git, como dice el tutorial. La idea general es:

1- Obtener una copia fresca de la rama de produccion del CVS
2- Hacer la compilacion/bundling de los archivos necesarios
3- Generar los archivos para las pruebas (ej: Generar una BD de forma automatica)
4- Ejecutar los tests
5- Correr el instalador (como Inno Setup)
6- Desplegar los archivos (ej: Subir instalador o subir sitio web)
6a- Si es un sitio web, hacer los test en produccion (o mejor, tener un servidor de stagging)
7- De ser el caso, notificar a los interesados

Si esto se hace bien, con un click se debe poder correr todo el proceso sin problemas (a menos que los test fallen )
__________________
El malabarista.
Responder Con Cita
  #8  
Antiguo 17-11-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Otra posibilidad es ejecutar directamente comandos batch de Windows en lugar de usar el "RAD Studio Plugin". En algunos casos puede dar cierta flexibilidad, sobre todo si se maneja bien este aspecto

Jenkins permite ejecutar directamente archivos .bat; como siempre, lo mas indicado es que el susodicho este en nuestro workspace y asi es posible referenciarlo directamente.

En este ejemplo voy a crear dos archivos bat:

CLEAN.bat -- borra los .dcu, .exe, __history, y similares
BUILD.bat -- ejecuta CLEAN y luego compila

CLEAN.bat

Código:
@echo off
echo Cleaning...
del /f /q /s *.exe
del /f /q /s *.bak
del /f /q /s *.dcu
del /f /q /s *.ddp
del /f /q /s *.~*
del /f /q /s *.local
del /f /q /s *.identcache
del /f /q /s *.tvsconfig

del /f /q /s *.bpl
del /f /q /s *.cbk
del /f /q /s *.dcp
del /f /q /s *.dsk
del /f /q /s *.o
del /f /q /s *.rsm
del /f /q /s *.skincfg

for /f "tokens=* delims=" %%i in ('dir /s /b /a:d __history') do (
  rd /s /q "%%i"
)
if "%1"=="" goto :eof
En realidad este script es tomado prestado del framework Spring4D http://spring4d.org/. Dicho sea de paso aprovecho para decir que es genial y que pegen un vistazo, algun dia me armaré de valor y hare un post sobre esto

Y este es mi BUILD.bat:

Código:
call CLEAN.bat
echo Start Build...

call "C:\Program Files (x86)\Embarcadero\RAD Studio\7.0\bin\rsvars.bat"

msbuild /verbosity:detailed Proyecto.dproj
El truco esta en llamar al rsvars.bat correcto de acuerdo a nuestra instalacion de Delphi. Lo correcto seria usar alguna llamada API o variables de entorno para obtener la ruta tal y como menciona mamcx y no hacerlo de forma chapucera a como lo hice yo, pero lo dejo como ejercicio para el lector

La configuracion en Jenkins es simplemente, en la seccion de Ejecutar, seleccionar "Execute Windows batch command" y en los argumentos simplemente ingresamos la ruta a BUILD.bat

En mi caso como lo tengo en la raiz del workspace simplemente deje "BUILD.bat" y listo

Saludos
Responder Con Cita
  #9  
Antiguo 19-11-2015
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Excelente aporte, muchas gracias AgustinOrtu, en cuanto el POST de "Spring for Delphi", creeme que lo espero con ansias, apuesto que será igual o mejor que el que acabas de hacer. Gracias, muy útil.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #10  
Antiguo 28-05-2019
darkone2k4 darkone2k4 is offline
Miembro
 
Registrado: abr 2008
Posts: 89
Poder: 17
darkone2k4 Va por buen camino
Ci/cd

Hola amigos.

Buscando el tema de integración continua con Delphi, llegué a este post, el cual es muy claro de entender.
Pero como ando buscando información de CI/CD para Borland Delphi 7, sabrán si es posible hacerlo?
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Guia del Programador Delphi For PHP SSoft Internet 0 24-03-2008 18:43:17
Guia de Buenas Maneras en Delphi Rabata Varios 1 09-11-2006 13:31:33
Guia De Delphi Con Paradox En Red Dalmine Tablas planas 5 26-08-2006 15:08:51
Guia de estilo exclusiva para Delphi??? burasu Varios 7 19-09-2005 17:19:07
Guia estilo delphi neon Varios 4 27-07-2004 20:02:05


La franja horaria es GMT +2. Ahora son las 00:51:00.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi