Integración Continua / Entrega Continua (CI/CD) es una metodología de desarrollo de software. Estoy tomando el término y aplicándolo a datos, no software, específicamente datos que cambian sin cesar con el tiempo y que necesitas integrar en tus sistemas de registro, ¡bueno, continuamente!
Siempre dispuesto a lanzarme al agua profunda, mi ejemplo es tomar un feed de posiciones de vehículos de transporte público (accedido vía una REST API) que se actualiza cada 30 segundos y enviar los datos a un servicio de entidades alojado en un portal ArcGIS Enterprise y también a una tabla habilitada espacialmente en Snowflake. Usaré una herramienta web para el procesamiento ya que la alta disponibilidad es obviamente recomendable.
Aquí están las posiciones de autobuses, trenes y ferris hace unos momentos (temprano sábado hora local) en Auckland, NZ.
Posiciones de autobús, tren y ferry en Auckland
Probablemente estoy trabajando en el extremo más alto de la frecuencia continua de integración masiva de datos, espero que la gran mayoría de las integraciones se realicen en intervalos de horas o días, pero al menos sabrás lo que se puede lograr.
Tén paciencia mientras me divierto con mi escenario de integración 😉.
Dígamos que trabajo en Fako (un nombre ficticio), que ha resuelto el problema del primer kilómetro/último kilómetro del comercio electrónico. Fako ha identificado que las redes de transporte son muy eficientes para reunir personas y bienes minoristas, comprando o vendiendo, cuando los pasajeros son compradores y vendedores. En asociación con los operadores de transporte eliminamos algunas filas de asientos en cada vehículo, ambos lados del pasillo, y los reemplazamos con rejillas de casilleros inteligentes a los que la compra por internet puede ser 'entregada' por nuestros estibadores en nuestros almacenes co-ubicados con terminales de transporte. Los compradores ordenan desde cualquier sitio web para entrega en un día y ruta, los vendedores venden en nuestro sitio web y transferimos artículos a rutas en cualquier parte de la red. Somos transitarios. La aplicación móvil de Fako permite a los clientes usar su teléfono para desbloquear el casillero donde está su artículo en cualquier momento durante su viaje. Algunos casilleros son refrigerados, tenemos nuestra propia línea de kits de comida. Una característica muy popular de nuestra aplicación móvil permite a los pasajeros pujar en subastas por artículos abandonados. Fako paga a los operadores de transporte el equivalente a una tarifa por pasajero por artículo, aumentando enormemente su número efectivo de pasajeros. Fako no tiene que comprar una flota de vehículos de entrega y los operadores de transporte están obteniendo ingresos incrementados. ¡El negocio está prosperando!
Los sistemas backend de Fako funcionan con Snowflake. Para que todo funcione, Fako necesita mantener el estado de la red continuamente como objetos habilitados espacialmente en Snowflake. ¡Veamos cómo!
Primero la forma aburrida, para la cual casualmente me descalifiqué al elegir una frecuencia que las tareas programadas de Windows no soportan, sería copiar un espacio de trabajo Spatial ETL fuente fmw a mi servidor Data Interoperability y configurar una tarea programada basada en la línea de comandos documentada en un archivo log desde una ejecución manual como el usuario arcgis:
Línea de comandos para ejecutar este espacio de trabajo:
"C:\Program Files\ESRI\Data Interoperability\Data Interoperability AO11\fme.exe" C:\Users\arcgis\Desktop\ContinuousIntegration\VehiclePositions2Snowflake.fmw
Deberías considerar cuidadosamente esta opción para tu situación, es robusta y simple.
Ahora la forma no aburrida. Como dije, me impulsé hacia esta dirección trabajando con datos que se actualizan masivamente a alta frecuencia. Hago una herramienta web que realiza la integración y luego se llama a sí misma después de esperar a que los datos fuente se actualicen.
Whoa una herramienta web que se llama a sí misma, sin webhook y sin programación? Es increíblemente simple (posiblemente también simplemente loco).
Hice dos herramientas Spatial ETL, una real y otra dummy que no hace nada, pero tiene el mismo nombre y parámetros (ninguno en este caso).

Compartí un elemento histórico de la versión dummy de VehiclePositions2Snowflake como herramienta web y registré la URL submitJob. Es importante que la herramienta web sea asincrónica para que cuando se llame no bloquee el espacio de trabajo esperando una respuesta:
https://dev99999.esri.com/server/rest/services/VehiclePositions2Snowflake/GPServer/VehiclePositions2Snowflake/submitJob
Luego edita la herramienta ETL real, en el paso HTTP final, para llamar a la URL submitJob. Ejecuta la herramienta y desde su elemento histórico sustituye la herramienta web dummy.
Te dejaré explorar la herramienta tú mismo pero básicamente el flujo superior obtiene los datos del vehículo y los sincroniza con el portal y Snowflake y el flujo inferior espera esto y que transcurran 30 segundos para luego hacer la llamada HTTP.
La Herramienta ETL Auto Integrante
Luego solo ejecuta la herramienta web manualmente una vez y estarás listo para comenzar, se repetirá sin fin. Estoy aquí refrescando mi mapa Pro (sin caché en la capa del servicio de entidades) y viendo cómo se mueve la flota del transporte.
En Snowflake mis datos también se están actualizando:
Consola Snowflake
Volviendo a algunos detalles aburridos, no olvides que al publicar herramientas Spatial ETL como herramientas web Data Interoperability debe estar instalado y licenciado en cada servidor anfitrión de herramientas y cuando uses credenciales web o base de datos como hago aquí, ve al diálogo Tools>FME Options y exporta las credenciales requeridas (clic derecho para el menú) a archivos XML, colócalos en tu servidor e impórtalos al entorno Workbench como propietario del servicio arcgis. Si ejecutas manualmente un espacio de trabajo en el servidor puede que tengas que cambiar también el entorno Python. Por último, aunque la descarga del blog tiene un archivo FMW la herramienta que publiques en tu servidor debería tener una fuente incrustada.
¡Ahora eso fue divertido!