Generar Build en Azure DevOps con tu propia máquina macOS

¡Hola!
El otro día desarrollando un Addin para VS4Mac (en concreto éste), me decidí a incluir la compilación y generación del archivo .mpack a través de Azure DevOps. Realmente para las 4 cosas que hace el Addin y, el más que dudoso tiempo que le dedicaré, no tenía mucho sentido perder un rato que podía estar dedicando a que el Addin hiciese más cosas, pero eh, de eso se tratan los side projects (vamos, los proyectos que empiezas y abandonas), de hacer lo que te apetezca.
Lo que necesitaba que hiciese Azure DevOps por mí era generar la compilación, coger la dll de la compilación y generar el archivo .mpack y por último generar una release en GitHub con el archivo .mpack. Para alguien, como es mi caso, que no tiene ni idea de estas cosas es todo un mundo 🙂 Vamos a ir viendo un poco los pasos que seguí hasta acabar teniendo que generar la build en mi propio mac conectándolo con Azure DevOps.

Seguramente no tenga mucho sentido, o por lo menos no sea lo ideal, tener que generar la Build en tu propia máquina, pero como digo, no es un proyecto de la vida real, sino un proyecto al que le dedicaré un rato :) Por lo que no tengas demasiado en cuenta las barbaridades que pueda decir a continuación, y tampoco hagas demasiado caso a lo que leas en el post...

Lo primero que vamos a hacer es crear el proyecto en GitHub con nuestro Addin. Vamos a añadir algo de código al Addin para que muestre un diálogo:

Ya podemos hacer push con nuestros cambios. El siguiente paso va a ser conectar Azure DevOps con nuestro proyecto creando un nuevo proyecto en Azure DevOps:



A continuación vamos a seleccionar nuestro repositorio en GitHub:

Seleccionamos nuestro repositorio:

Y por último, escogemos una plantilla YAML cualquiera (la vamos a escribir desde cero):


Ya tenemos todo listo, ahora vamos a pegar el siguiente código en nuestra plantilla YAML:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 trigger:
    branches:
        include:
        - master
    tags:
        include:
        - '*'
 
 jobs:
    - job: macOS
        pool:
            vmImage: 'macOS-latest'
 
        steps:
        - task: NuGetToolInstaller@0
 
        - task: NuGetCommand@2
        inputs:
            restoreSolution: '**/*.sln'
 
        - script: msbuild /p:Configuration=Release VSMacAddinSample/VSMacAddinSample/VSMacAddinSample.csproj
        displayName: 'Build VSMacAddinSample'

Básicamente lo que le estamos diciendo es que genere nuestra compilación cuando se actualice la rama master o se añada alguna etiqueta, restaure los paquetes NuGet y compile en release:

Al añadir este nuevo archivo YAML, se va a subir directamente un commit en master con el archivo… por lo que, como dijimos, se va a generar una nueva compilación. Ups, algo ha ido mal:

Si miramos el detalle del error, que se ha generado al compilar el proyecto, nos dice lo siguiente:

/Users/vsts/agent/2.154.3/work/1/s/VSMacAddinSample/VSMacAddinSample/VSMacAddinSample.csproj" (default target) (1) ->
(ResolveMonoDevelopInstance target) -> 
  /Users/vsts/.nuget/packages/monodevelop.addins/0.4.6/build/MonoDevelop.Addins.targets(76,5): warning : The provided ProfileVersion '' does not match the target instance. Overriding with '8.0'. [/Users/vsts/agent/2.154.3/work/1/s/VSMacAddinSample/VSMacAddinSample/VSMacAddinSample.csproj]
  /Users/vsts/.nuget/packages/monodevelop.addins/0.4.6/build/MonoDevelop.Addins.targets(76,5): warning : The TargetFrameworkVersion 'v4.7.1' does not the target instance. Overriding with 'v4.7.2'. [/Users/vsts/agent/2.154.3/work/1/s/VSMacAddinSample/VSMacAddinSample/VSMacAddinSample.csproj]


"/Users/vsts/agent/2.154.3/work/1/s/VSMacAddinSample/VSMacAddinSample/VSMacAddinSample.csproj" (default target) (1) ->
(GetReferenceAssemblyPaths target) -> 
  /Library/Frameworks/Mono.framework/Versions/5.12.0/lib/mono/msbuild/15.0/bin/Microsoft.Common.CurrentVersion.targets(1195,5): error MSB3644: The reference assemblies for framework ".NETFramework,Version=v4.7.2" were not found. To resolve this, install the SDK or Targeting Pack for this framework version or retarget your application to a version of the framework for which you have the SDK or Targeting Pack installed. Note that assemblies will be resolved from the Global Assembly Cache (GAC) and will be used in place of reference assemblies. Therefore your assembly may not be correctly targeted for the framework you intend. [/Users/vsts/agent/2.154.3/work/1/s/VSMacAddinSample/VSMacAddinSample/VSMacAddinSample.csproj]

    2 Warning(s)
    1 Error(s)

Seguro que este error se puede solucionar, pero es verdad que tampoco le di demasiadas vueltas porque no le quería dedicar demasiado tiempo… La cosa es que, si nos fijamos en el archivo YAML que vimos antes, estamos utilizando una máquina macOS con la última versión que esté disponible en Azure DevOps:

    - job: macOS
        pool:
            vmImage: 'macOS-latest'

Y, después de tantos rodeos, ahora vamos a ver cómo generar esa compilación en nuestro propio mac. Lo primero que vamos a hacer es acceder a la configuración del proyecto y crear un nuevo pool:


Entramos dentro de nuestro nuevo pool y creamos un nuevo agente que descargaremos y descomprimiremos en alguna parte de nuestro Mac:


Ahora que ya tenemos el agente en nuestro ordenador, vamos a configurarlo. Abrimos un terminal, nos situamos en la carpeta de nuestro agente (que previamente habíamos descomprimido) y ejecutamos el archivo de configuración config.sh:

El primer paso será aceptar los términos. Pulsamos «Y» e intro. A continuación nos va a pedir la url de nuestro servidor Azure DevOps. Para obtenerla, podemos buscarla en la propia barra de direcciones de Azure Devops:

La introducimos y pulsamos intro:

Ahora necesitamos indicar el tipo de autenticación (en nuestro caso seleccionamos PAT) y vamos a generar un token desde Azure DevOps en la opción Seguridad de nuestro perfil:

Pulsamos en generar nuevo token y rellenamos los campos:

Y copiamos el token generado:

Volvemos a nuestra terminal y pegamos el token:

Una vez que hayamos introducido el token, se va a conectar al servidor y, si todo va bien, lo tenemos ya casi. Damos un par de nombres que nos quedan y, ¡ya está configurado!:

Una vez hemos finalizado la configuración, vamos a poner en marcha nuestro agente recién creado ejecutando el archivo run.sh:

Ya tenemos nuestro agente listo y escuchando para generar nuestra compilación 🙂
El siguiente paso va a ser volver a nuestra web de Azure DevOps para modificar el archivo YAML (lo podríamos hacer también desde GitHub, claro) y establecer como agente el que acabamos de configurar, en lugar del que teníamos (aquí el commit):

1
2
3
  - job: macOS
    pool:
      name: My-MacBook

Igual que antes, como hemos hecho push en master, se va a lanzar la Build, pero esta vez veremos en nuestro terminal que se está ejecutando y su resultado:

En este caso el resultado ha sido que… ¡nuestra Build se ha generado bien! Si navegamos por las carpetas del agente que hemos configurado y tenemos en ejecución, podremos ver los archivos que se han generado (por ejemplo, la dll).
Ya tenemos todo listo, ahora vamos a añadir un par de cosas a nuestro YAML, por una parte que, además de compilar la solución nos genere el archivo .mpack y, cuando se añada una etiqueta a algún commit se genere una Release en GitHub y se incluya el archivo .mpack.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
  name: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)
 
  trigger:
    branches:
      include:
      - master
    tags:
      include:
        - '*'
 
  jobs:
    - job: macOS
      pool:
        name: My-Macbook
 
      steps:
      - task: NuGetToolInstaller@0
 
      - task: NuGetCommand@2
        inputs:
          restoreSolution: '**/*.sln'
 
      - script: msbuild /p:Configuration=Release VSMacAddinSample/VSMacAddinSample/VSMacAddinSample.csproj
        displayName: 'Build VSMacAddinSample'
 
      - script: /Applications/Visual\ Studio.app/Contents/MacOS/vstool setup pack VSMacAddinSample/VSMacAddinSample/bin/Release/net471/VSMacAddinSample.dll
        displayName: 'Build mpack Addin'
 
      - script: mv VSMacAddinSample.*.mpack  $(Build.ArtifactStagingDirectory)/
        displayName: 'Copy addin'
 
      - task: PublishBuildArtifacts@1
        inputs:
          artifactName: 'Addin'
          targetPath: $(Build.ArtifactStagingDirectory)
 
      - task: GitHubRelease@0
        inputs:
          gitHubConnection: github connection
          repositoryName: '$(Build.Repository.Name)'
          action: 'create'
          target: '$(Build.SourceVersion)'        
          tagSource: 'auto'

Una vez guardado, se va a lanzar la Build y:

Nos está dando error. En concreto el problema es que nos falta añadir la conexión con GitHub. Nada que no podamos solucionar desde el propio portal de Azure DevOps. Vamos a crear la conexión desde la configuración del proyecto en la opción de Conexiones de servicios, y creamos una nueva conexión de GitHub:

Le damos un nombre y pulsamos en autorizar:

Ahora vamos a añadir ese nombre en nuestra configuración de Release de GitHub de nuestro archivo YAML:

Perfecto, ahora la Build ya no nos da error, se ejecuta correctamente.
Finalmente, vamos a añadir una Tag a nuestro último commit para ver si además de compilar y generar nuestro archivo .mpack se crea correctamente nuestra Release en GitHub y se adjunta el .mpack:

Si volvemos a GitHub, a la opción Relase y…

Voilà!! Se ha generado todo correctamente. Aquí está la release.

Y nada más. Hemos visto cómo podemos configurar Azure DevOps para generar una Build en nuestra máquina, generar el archivo .mpack y, cuando generemos una Tag en nuestro repositorio, se cree una Release en GitHub con el archivo .mpack. Espero que os sea útil.
¡Un saludo!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *