Continuous Integration mit MPS und ANT

Technische Problemstellung:

Sie möchten die Generierung Ihrer MPS-Sprachen sowie die Compilierung Ihrer MPS-Solutions nicht mehr innerhalb von MPS erledigen sondern diese Funktionalität von außen ansteuern? Sie möchten eine automatisierte Build-Umgebung für Ihre auf dem MPS-Framework basierende Applikation erstellen oder sogar eine komplette Continous Integration Umgebung für Ihre MPS-Applikation entwickeln?

Problemlösung:

Prinzipiell ist die Ansteuerung der MPS-Buildumgebung von Ihren technischen Voraussetzungen abhängig. Für eine Gradle-Umgebung bietet sich zum Beispiel der Einsatz des Itemis MPS Gradle Plugins an. 

Laden Sie die benötigte Library aus GIT herunter und importieren Sie in Ihrer Gradle-Umgebung die benötigten Header-Dateien:

import de.itemis.mps.gradle.BuildLanguages
import de.itemis.mps.gradle.RunAntScript
import org.gradle.api.DefaultTask

Fügen Sie eine entsprechende Dependency zu Ihrer build.gradle.kts hinzu:

buildscript {
    dependencies {
classpath(fileTree(mapOf("dir" to "path/de/itemis/mps/mps-gradle-plugin", "include" to listOf("*.jar"))))
}
}
Führen Sie schließlich die benötigten BuildLanguages- oder RunAntScript-Tasks  des MPS Gradle Wrappers aus:

val task1 = tasks.register<BuildLanguages>("taskName") { ... }
val task2 = tasks.register<RunAntScript>("taskName") { ... }

Aber auch ohne die Verwendung eines solchen Wrappers ist eine Ansteuerung der MPS-Buildumgebung jedoch problemlos möglich. Benötigt wird hierfür lediglich Apache Ant.

Bei den während der Ausführung  der MPS-Buildscripte generierten XML-Dateien handelt es sich um reine Ant-Scripte, welche unter Verwendung des Ant-Launchers beispielsweise auch problemlos außerhalb von MPS ansteuerbar sind.

<project name="application-build-script" default="build">
  <!-- Generated by MPS -->
  <property name="build.dir" location="build" />
  <property name="build.tmp" location="${build.dir}/tmp/application-build-script" />
  <property name="build.layout" location="${build.dir}/artifacts/application-build-script" />
...
Hierzu rufen Sie lediglich den Ant-Launcher mit den korrekten Pfaden zur JetBrains JDK sowie zu JetBrains MPS auf.

%JAVA_PATH% -Dfile.encoding=windows-1252 -Duser.country=US -Duser.language=en -Duser.variant -cp %ANT_PATH\lib\ant-launcher.jar;%JDK_PATH%\lib\tools.jar org.apache.tools.ant.launch.Launcher -Dmps_home=%MPS_PATH% -Dversion=%MPS_VERSION% -Dmps.generator.skipUnmodifiedModels=true -buildfile %ANT_XML_FILE%

Sofern die Build-Scripte noch MPS-Solutions oder MPS-Sprachen beinhalten, welche ebenfalls gebaut werden müssen, so fügen Sie noch die entsprechenden Kommandos für die Generierung der Sprachen/Solutions hinzu (z.B. clean, generate und assemble). Und beachten Sie natürlich die korrekte Reihenfolge der Generierung Ihrer Ant-Scripte (XML).

%JAVA_PATH% -Dfile.encoding=windows-1252 -Duser.country=US -Duser.language=en -Duser.variant -cp %ANT_PATH\lib\ant-launcher.jar;%JDK_PATH%\lib\tools.jar org.apache.tools.ant.launch.Launcher -Dmps_home=%MPS_PATH% -Dversion=%MPS_VERSION% -Dmps.generator.skipUnmodifiedModels=true -buildfile %ANT_XML_FILE% clean generate assemble
IllegalArgumentException: No output location for XXX bei MPS 2020.3 upgrade