[Fabric][SimplePBI] Actualizar área de trabajo desde git repo

Las áreas de trabajo sincronizadas con un repositorio ya no son una novedad. De hace tiempo podemos versionar ítems de Fabric. Sin embargo, versionar no lo es todo, también pensamos en ambientes e integraciones/deploy continuos.

En este artículo muestro como actualizar una área de trabajo a partir de cambios de un repositorio utilizando SimplePBI, la python library para power bi y fabric rest api. Indispensable para construir CICD.

Antes de comenzar me gustaría alinear algunos conceptos. Si bien este artículo solo muestra como ejecutar una acción que llevaría los cambios del repositorio a una área de trabajo, no podemos pensarlo sin el foco que representa.

Al trabajar con ambientes, lo que más nos gustaría es seguir un flujo unidireccional que lleve los cambios automáticamente. Con esto me refiero a que un desarrollador que termine de hacer sus cambios y quiera llevar eso a test o producción, ejecutaría un pull request que podría enlazar una acción para que automáticamente los cambios del repo vayan a la área de trabajo simulando un deploy. Veamos el siguiente diagrama asumiendo que cada área de trabajo esta sincronizada a un repositorio.

NOTA: Si no sabes como integrar un área de trabajo a un repositorio, podemos leer este artículo para **Azure DevOps* o este para *Github*.*

Como pueden apreciar en la imagen, un desarrollador trabajando en una área de trabajo podría estar escribiendo un notebook, integrando nuevos datos en un pipeline o armando vistas de un warehouse. Sea el caso que sea, al terminar su trabajo llevaría los cambios al repositorio con un “Commit”. Para que estos cambios fluyan, se ejecutan pull request a la branch siguiente.

Un proceso automatizado de despliegue sería el que se encargue que al recibir cambios en la rama, puedan automáticamente reflejarse en su ambiente. Este proceso es el “Actualizar de Git” que suele aparecer para ejecutar manualmente en las áreas:

Ahora vamos a automatizar esto para poder ponerlo en un DevOps Pipeline o una Github action.

1- Permitir sincronización Git a nuestro service principal

Puede que ya tengan la opción funcionando porque ya hicieron la integración de su área de trabajo con Git, pero necesitamos que nuestro service principal también pueda hacerlo. Para eso revisamos la siguiente opción de portal de administración “Tenant Settings”:

No es necesario que toda la organización lo haga, si lo tenemos por grupos de seguridad bastaría con agregar como miembro al service principal que vayamos a usar en la ejecución.

2- Cargar la conexión.

Puede que suene raro, pero para poder actualizar los datos del repo hacia el área de trabajo, necesitamos disponer de una conexión al repositorio tal como lo hacemos para integrar datos. Desde el administrador de conexiones (manage connections en el engranaje) vamos a agregar una nueva conexión Cloud del estilo Github Source Control o Azure DevOps Source Control

De esta forma dispondremos del Connection ID necesario para ejecutar nuestra operación. No olvidemos darle permisos al Service Principal sobre la conexión para que pueda utilizarla.

3- Script de python con SimplePBI

Si nunca usaste la Fabric/PowerBi Rest API, podes leer éste artículo. Nuestra apliacación registrada necesitará los permisos de las acciones que hacemos. En este caso Workspace.GitUpdate.All or Workspace.GitCommit.All y Workspace.ReadWrite.All. Vamos a escribir un script de python que luego pueden llamar desde el trigger de un ambiente. Solo vamos a cubrir el código para que vean lo simple que lo hace SimplePBI.

# Importar módulos
from simplepbi import token
from simplepbi.fabric import core

# Cargar variables
TENANT_ID = "xxxxxx-xxxx-xxxx-xxxxxx"
power_bi_client_id = 'xxxxxx-xxxx-xxxx-xxxxxx'
power_bi_secret = '*************'
workspace_id ="xxxxxx-xxxx-xxxx-xxxxxx"
connection_id="xxxxxx-xxxx-xxxx-xxxxxx"

# Inicializar objetos a usar de la API
t = token.Token(TENANT_ID, power_bi_client_id, None, None, power_bi_secret, use_service_principal=True)
gg = core.Git(t.token)

# Hacemo conciente al script que vamos a usar esa conexión
gg.update_my_git_credentials(workspace_id, connection_id)

# Obtenemos el status de git que nos da información del SHA del commit que acabamos de ejecutar y el HEAD.
statu = gg.get_git_status(workspace_id)

# Definimos un accionar en caso de conflictos
conflict_resolution = {"ConflictResolutionPolicy": "PreferRemote", "ConflictResolutionType": "Workspace"}

# Ejecutamos el update
gg.update_from_git(workspace_id, remoteCommitHash=statu["remoteCommitHash"], conflictResolution=conflict_resolution, workspaceHead=statu["workspaceHead"])

De esa forma automatizamos el botón que vimos antes en la UI para que al llegar nuevos cambios al repo, vayan automáticamente al área de trabajo. Ese script puede llamarse de una Github Action o un Azure DevOps Pipeline.

Ejemplo de ejecución:

Respuesta en tiempo real:

Ahora si apreciamos como desaparece el cambio tras ejecutar el update desde la ventana de la consola.

Espero que este artículo les sirva para traer nuevas alternativas de CICD a la mesa que salgan de la caja puesto que ejecutar código python en cualquier parte puede ser más versátil que la librería fabric cicd que fuerza modos de autenticación o deployment pipelines que forzarían cambiar la dirección del diagrama enviando siempre de las áreas al repositorio.