En un servidor Octopus Deploy podemos definir los procesos para desplegar el software, quién y cuándo puede desplegar a qué entornos (pruebas, producción) y qué pasos se realizan al realizar cada despliegue.

Para analizar la actividad del trabajo realizado en Octopus hay opciones de línea de comandos que permiten exportar la información de todos los despliegues a Excel y analizar la información en base a los campos:

  • Enviroment
  • Project
  • ProjectGroup
  • Created
  • Name
  • Id

Más información en https://octopus.com/docs/administration/reporting/report-on-deployments-using-excel

Pero si queremos realizar un estudio más detallado tenemos que irnos a la API, y aquí os damos una breve introducción de cómo hacerlo.

Crea un token de acceso a Octopus:

Para realizar peticiones a la API es necesario que contemos con la autorización correspondiente en el servidor de Octopus. Es para ello que crearemos un token para que la aplicación tenga el mismo nivel de acceso que nuestro perfil de usuario en Octopus.

  1. Entra en la web de tu servidor de Octopus y en la página de tu perfil de usuario entra en "My API Keys"
  2. Una vez ahí puedes crear una clave para acceder a la API o revocar las que tengas creadas
  3. Copia el token de acceso que te muestra el Octopus para usarlo luego en el código ya que no lo podrás recuperar más tarde

Para comprobar que puedes acceder a Octopus con ese token de acceso, abre un navegador en modo incógnito para evitar usar por error alguna cookie de autenticación y prueba con las URL:

https://myOctopusServer/spaces

https://myOctopusServer/spaces?apikey=yourAccessTokenGoesHere

Toda la información que se puede extraer con la API del Octopus está en la URL:

https://myOctopusServer/api

Para estos ejemplos he utilizado el árbol Spaces - Projects - Releases

Ahora, Octopus + Python

Para realizar las peticiones, hemos tirado de las librerías estándar de Python de peticiones HTTP.

pip install requests  --trusted-host pypi.org --trusted-host files.pythonhosted.org

pip install urllib3   --trusted-host pypi.org --trusted-host files.pythonhosted.org

La primera librería nos permitirá lanzar peticiones web, la segunda ignorar los errores por peticiones Web no seguras - por si los certificados entre tu ordenador y el servidor no están al día.

Una vez preparado el entorno, no hay más que lanzar las peticiones y procesar los resultados.

Me he preparado un pequeño paquete para facilitar las llamadas http y el procesamiento del JSON de respuesta que podéis encontrar en esta URL:

https://github.com/fcnatra/PythonHttpRequestsTools/blob/master/requestsTools.py

Las tres peticiones que hacemos nos van a permitir obtener la lista de espacios en Octopus, de los proyectos en un espacio y de las releases en un proyecto:

https://myOctopusServer/api/spaces?apikey=yourAccessTokenGoesHere

https://myOctopusServer/api/writeHereTheSpaceId/projects?apikey=yourAccessTokenGoesHere

https://myOctopusServer/api/writeHereTheSpaceId/projects/writeHereTheProjectId/releases?apikey=yourAccessTokenGoesHere

Con el siguiente código en Python, y apoyado en la librería "requestsTools.py" he conseguido procesar e imprimir una muestra del contenido del repositorio:

    import requestsTools

    requestsTools.accessToken = 'apikey=yourAccessTokenGoesHere'

    def getSpaces(url):
        jsonContent = requestsTools.getJsonFromUrl(url + '/spaces')
        spaces = requestsTools.getNodesFromJson(jsonContent['Items'], 'Id,Name')
        return spaces

    def printSpaces(spaces):
        print('[SPACES]')
        for (id, name) in spaces:
            print('\tSpace {}: {}'.format(id, name))

    def getProjects(url, spaceId):    
        jsonContent = requestsTools.getJsonFromUrl('{}/{}/projects?skip=0&take=2147483647'.format(url, spaceId))
        projects = requestsTools.getNodesFromJson(jsonContent['Items'], 'Id,Name')
        return projects

    def printProjects(projects):
        for (id, name) in projects:
            print('\tProject {}: {}'.format(id, name))

    def getReleases(url, spaceId, projectId):
        jsonContent = requestsTools.getJsonFromUrl('{}/{}/projects/{}/releases?skip=0&take=2147483647'.format(url, spaceId, projectId))
        releases = requestsTools.getNodesFromJson(jsonContent['Items'], 'Id,Assembled,ReleaseNotes,Version')
        return releases

    def printReleases(releases):
        for (id, releaseDate, notes, version) in releases:
            print('\tRelease {} {} - version {} - {}'.format(id, releaseDate, version, notes))

    def jsonSample(url):
        spaces = getSpaces(url)
        printSpaces(spaces)

        for spaceId, spaceName in spaces:
            print('\n[PROJECTS IN {}]'.format(spaceId))
            projects = getProjects(url, spaceId)
            printProjects(projects)

            print('\n[RELEASES IN THE PROJECT I\'VE SELECTED]')
            selectedProjectId = 'writeHereAProjectId'
            releases = getReleases(url, spaceId, selectedProjectId)
            printReleases(releases)

    requestsTools.setupAuthentication()
    jsonSample('https://myOctopusServer/api')

De aquí en adelante podemos comenzar a explorar por nuestra cuenta:

¡Suerte!