RRZE – Projekte & Prozesse (P&P)

Das Blog der RRZE Stabsstelle "Projekte & Prozesse"

Content

Message-ID & Grails Mail Plugin

Nach einem freundlichen Hinweis unserer Postmaster, dass die Message-ID unserer E-Mails eher suboptimal ist, einigten wir uns auf eine neue einheitliche Message-ID für unsere Anwendungen.

Bisher wurde die Message-ID autogeneriert und hatte die Form: <1234567890.12.1234567890123.JavaMail.”RRZE IdM-Portal”@smtp.uni-erlangen.de>

Wir haben uns nun auf die folgende Form geeinigt: <[TIMESTAMP].[RANDOM(10)].[appname]@[domain]>

In unseren GRAILS-Anwendungen nutzen wir das Mail-Plugin. Man kann die Message-ID durch folgende Anweisung neu setzen.
[groovy]
headers “Message-ID”: “<message-id@domain>”
[/groovy]

Es gibt allerdings ein Problem bei dieser Lösung: Man kann die Message-ID nicht anwendungsweit in der Konfiguration festlegen. Daher müsste man bei jedem Aufruf des Mail-Services die Message-ID neu setzen. Wir haben uns nun dafür entschieden, einen eigenen Service als Wrapper für den Mail-Service zu nutzen.
[groovy]class PpsaMailService {
def grailsApplication

def mail = { c ->
def domain = grailsApplication.config.mail.domain?:’idm.fau.de’
// generate random number

sendMail {
c.delegate = delegate
c.call()
headers “Message-ID”: “<${(System.currentTimeMillis())}.${randomNumber}.${grailsApplication?.metadata[‘app.name’]}@${domain}>”
}
}
}
[/groovy]

In der Grails Konfiguration kann man nun die Domain für die Message-ID festlegen, default ist idm.fau.de.

Folgendes Beispiel zeigt nun, wie der neue Service zu nutzen ist:

Mit Mail Plugin:
[groovy]
sendMail {
from “from@example.org”
to “to@example.org”
subject “Subject”
body “Body”
}
[/groovy]

Mit Wrapper:
[groovy]
def ppsaMailService
ppsaMailService.mail {
from “from@example.org”
to “to@example.org”
subject “Subject”
body “Body”
}
[/groovy]

 

Message-ID & Grails Mail Plugin

After a friendly advice from our postmaster, the Message-ID of our e-mails are rather suboptimal, we agreed on a new consistent Message-ID for our applications.

So far the Message-ID has been automatically generated and had the form: <1234567890.12.1234567890123.JavaMail.”RRZE IdM-Portal”@smtp.uni-erlangen.de>

We agreed now on the following form: <[TIMESTAMP].[RANDOM(10)].[appname]@[domain]>

In our GRAILS-applicatons we use the Mail-Plugin. You can set a new Message-ID with the following command:
[groovy]
headers “Message-ID”: “<message-id@domain>”
[/groovy]

However there is a problem with this solution: you can not define the Message-ID application wide in the configuration. Therefore the Message-ID would have to be set again at every request to the Mail-Service. We have now decided to use an own service as a wrapper for the Mail-Service.
[groovy]class PpsaMailService {
def grailsApplication

def mail = { c ->
def domain = grailsApplication.config.mail.domain?:’idm.fau.de’
// generate random number

sendMail {
c.delegate = delegate
c.call()
headers “Message-ID”: “<${(System.currentTimeMillis())}.${randomNumber}.${grailsApplication?.metadata[‘app.name’]}@${domain}>”
}
}
}
[/groovy]

In the Grails configuration, the domain for the Message-Id can be set. Default is idm.fau.de.

The following example shows how to use the service:

With Mail Plugin:
[groovy]
sendMail {
from “from@example.org”
to “to@example.org”
subject “Subject”
body “Body”
}
[/groovy]

With Wrapper:
[groovy]
def ppsaMailService
ppsaMailService.mail {
from “from@example.org”
to “to@example.org”
subject “Subject”
body “Body”
}
[/groovy]

Grails Plugins – lokal und global / Grails Plugins – local and global

English Version

Bei der Verwaltung von Grails Plugins in einem zentralen Repository gestaltet sich die lokale Weiterentwicklung der Plugins ggf. schwierig.

Mit dem folgenden Code-Block in der BuildConfig.groovy kann mittels des Kommandozeilenparameters -Dlive=... eines, oder mit
Komma getrennt, mehrere Plugins lokal geladen werden.

Wichtig ist dabei, dass neben dem Hauptprojekt auch alle Plugins mit diesem Code Block ausgestattet werden. So werden auch transitive Abhängigkeiten wie gewünscht mittels relativem Pfad oder aus dem Repository aufgelöst.

[groovy]
/*
* PPSA PLUGIN CONFIGURATION
*/
def runtimePlugins = [
“:ppsa-menu:latest.release”,
“:ppsa-layout:latest.release”,
]

/* —– BEGIN: no changes past here —– */
def live = System.getProperty(“live”)?System.getProperty(“live”).split(‘,’):[]
def filteredLivePlugins = []
if (live) {
filteredLivePlugins = live.inject([]) { list, lib ->
runtimePlugins.grep { it.contains(lib) } ? list << lib : list
}
if (filteredLivePlugins) {
println “[YOUR_PROJECT_NAME_HERE] Loading some plugins from relative paths in the workspace: ” + filteredLive
filteredLivePlugins.each { pluginName -> grails.plugin.location.”${pluginName}” = “../${pluginName}” }
}
}
/* —– END: no changes past here —– */

grails.project.dependency.resolution = {
plugins {
def filteredRuntimePlugins = runtimePlugins.inject([]) { list, lib ->
filteredLivePlugins.grep { lib.contains(it) } ? list : list << lib
}
if (filteredRuntimePlugins) {
println “[YOUR_PROJECT_NAME_HERE] Loading plugins from release repository: ” + filteredRuntimePlugins
filteredRuntimePlugins.each { pluginDef -> runtime “${pluginDef}” }
}
}
}
[/groovy]

Beispiel, wie man zur live Umgebung für das Plugin ppsa-layout wechseln kann:
[bash]
grails clean -Dlive=ppsa-layout
grails run-app -Dlive=ppsa-layout
[/bash]

Grails Plugins – local and global


With the management of Grails Plugins in a central repository the local further development of plugins could become quite difficult.

With the following Code Block in the  BuildConfig.groovy one or more plugins — sepearted via commas — can be loaded locally instead of from the repository with the help of the command line parameter  -Dlive=....

In order to also resolve transitive dependencies in this way it is important that beside the main project all plugins are also provided with this code block. This way also transitive dependencies can be loaded from a relative path or from the repository.

[groovy]
/*
* PPSA PLUGIN CONFIGURATION
*/
def runtimePlugins = [
“:ppsa-menu:latest.release”,
“:ppsa-layout:latest.release”,
]

/* —– BEGIN: no changes past here —– */
def live = System.getProperty(“live”)?System.getProperty(“live”).split(‘,’):[]
def filteredLivePlugins = []
if (live) {
filteredLivePlugins = live.inject([]) { list, lib ->
runtimePlugins.grep { it.contains(lib) } ? list << lib : list
}
if (filteredLivePlugins) {
println “[YOUR_PROJECT_NAME_HERE] Loading some plugins from relative paths in the workspace: ” + filteredLive
filteredLivePlugins.each { pluginName -> grails.plugin.location.”${pluginName}” = “../${pluginName}” }
}
}
/* —– END: no changes past here —– */

grails.project.dependency.resolution = {
plugins {
def filteredRuntimePlugins = runtimePlugins.inject([]) { list, lib ->
filteredLivePlugins.grep { lib.contains(it) } ? list : list << lib
}
if (filteredRuntimePlugins) {
println “[YOUR_PROJECT_NAME_HERE] Loading plugins from release repository: ” + filteredRuntimePlugins
filteredRuntimePlugins.each { pluginDef -> runtime “${pluginDef}” }
}
}
}
[/groovy]

Example on how to switch to the live environment for the plugin ppsa-layout:
[bash]
grails clean -Dlive=ppsa-layout
grails run-app -Dlive=ppsa-layout
[/bash]

Grails Plugins in eigenem Maven Repository verwalten / Manage Grails Plugins in own Maven Repository

English Version

In diesem Beitrag zeige ich kurz wie man Grails 2 Plugins als Releases in einem eigenen Maven Repository wie Archiva oder Artifactory verwalten kann. Dafür sind grundsätzlich zwei seperate Konfigurationen für Upload und Download vom Repository nötig.

Upload

Für das Releasen neuer Versionen in das eigene Repository bietet Grails 2 das Release Plugin, das man allerdings erst selbst nachinstallieren muss:
[bash]
grails install-plugin release
[/bash]

Die nötige Konfiguration dazu wird in die ~/.grails/settings.groovy ausgelagert. Einträge in dieser Datei gelten für alle Grails Projekte und sind äquivalent zu Einträgen in der BuildConfig.groovy.

Hier ein Beispiel zur Einrichtung von Archiva als Release Repository:
[groovy]
/*
* THIS IS FOR UPLOADING TO THE REPO (via release plugin)
* To use this do:
* grails2 install-plugin release
*/
grails.project.repos.default = “rrzeArchiva”

grails.project.repos.rrzeArchiva.url = “http://REPOSITORY:PORT/archiva/repository/internal/”
grails.project.repos.rrzeArchiva.username = “USERNAME”
grails.project.repos.rrzeArchiva.password = “PASSWORD”

// disable nagging about not having committed all changes…
grails.release.scm.enabled = false
[/groovy]

Das Beispiel Konfiguriert das rrzeArcchiva Repository als Default für Uploads und deaktiviert die SVN Überprüfung für nicht eingecheckte Änderungen.

Fertig.

Neue Releases können dann mit folgenden Build Targets ins Repository geladen bzw. in den lokalen Maven Cache installiert werden.
[bash]
grails maven-deploy
grails maven-install
[/bash]

Download

Für den automatischen Download von Plugins aus dem Repository sind folgende Einträge in der BuildConfig.groovy des Projektes nötig.
[groovy]
grails.project.dependency.resolution = {
repositories {
mavenLocal()
mavenRepo name:”rrzeArchiva”, root:”http://REPOSITORY:PORT/archiva/repository/internal”
}
plugins {
runtime “:ppsa-menu:latest.release”
}
}
[/groovy]

Der Repositories Abschnitt Konfiguriert den lokalen Maven Cache und das Archiva Repository als zu durchsuchende Quellen für Plugin Abhängigkeiten.
Die Plugin Abhängigkeiten selbst werden im eigenen Abschnitt Plugins verwaltet. Der Beispieleintrag lädt immer die aktuellste Version des Plugins ppsa-menu.

Eigentlich würde das nun schon reichen, um Plugins auf dem Repository zu installieren.

Die allermeisten internen Repositories werden jedoch noch zusätzlich eine Authentifizierung erfordern. Hierfür muss noch der folgende Eintrag zur ~/.grails/settings.groovy hinzugefügt werden.
[groovy]
/*
* THIS IS FOR DOWNLOADING FROM THE REPO
* To use this add this to your BuildConfig.groovy:
* mavenRepo name:”rrzeArchiva”, root:”http://REPOSITORY:PORT/archiva/repository/internal”
*/
grails.project.ivy.authentication = {
credentials {
realm = “Repository Archiva Managed internal Repository”
host = “REPOSITORY(ohne Port!)”
username = “USERNAME”
password = “PASSWORD”
}
}
[/groovy]

—- WICHTIG —-

Für Archiva muss der Realm wie angegeben konfiguriert werden. Sonst geht nix!

Außerdem muss der Host hier ohne Port angegeben werden. Wenn das Archiva also z.B. auf Port 8080 läuft ist diese Angabe hier wegzulassen.
—- WICHTIG —-

Managing Grails Plugins in own Maven Repository


 

In this post I will briefly show how to manage Grails 2 Plugins as releases in an own Maven Repository such as Archiva or Artifactory. Therefore basically two separate configurations for Upload and Download from the repository are needed.

Upload

To release new versions in the own repository Graisl 2 offers the Release Plugin, which though must be installed additionally by yourself:
[bash]
grails install-plugin release
[/bash]

The necessary configuration for this is stored in the  ~/.grails/settings.groovy. Entries in this data are valid for all Grails projects and equivalent entries in the BuildConfig.groovy.

Here is an example of installing Archiva as release repository:
[groovy]
/*
* THIS IS FOR UPLOADING TO THE REPO (via release plugin)
* To use this do:
* grails2 install-plugin release
*/
grails.project.repos.default = “rrzeArchiva”

grails.project.repos.rrzeArchiva.url = “http://REPOSITORY:PORT/archiva/repository/internal/”
grails.project.repos.rrzeArchiva.username = “USERNAME”
grails.project.repos.rrzeArchiva.password = “PASSWORD”

// disable nagging about not having committed all changes…
grails.release.scm.enabled = false
[/groovy]

The example configures the rrzeArcchiva repository as Default for Uploads and deactivates the SVN proof for not-checked-in changes.

Done.

New releases can be loaded with the following Build Target in the Repository, respectively installed the local Maven Cache.
[bash]
grails maven-deploy
grails maven-install
[/bash]

Download

For the automatic download of plugins from the repository the following entries in the  BuildConfig.groovy of the project are needed.
[groovy]
grails.project.dependency.resolution = {
repositories {
mavenLocal()
mavenRepo name:”rrzeArchiva”, root:”http://REPOSITORY:PORT/archiva/repository/internal”
}
plugins {
runtime “:ppsa-menu:latest.release”
}
}
[/groovy]

The repository paragraph configures the local Maven Cache and the Archiva Repository as sources for plugin dependencies which have to be browsed.
The plugin dependencies themselves are managed in the own paragraph plugins. The example entry is always loading the most current version of the plugin ppsa-menu.

Actually this would be enough to install plugins on the repository.

Most of all intern repositories will though need further authentication. Therefore the following entry has to be added ~/.grails/settings.groovy.
[groovy]
/*
* THIS IS FOR DOWNLOADING FROM THE REPO
* To use this add this to your BuildConfig.groovy:
* mavenRepo name:”rrzeArchiva”, root:”http://REPOSITORY:PORT/archiva/repository/internal”
*/
grails.project.ivy.authentication = {
credentials {
realm = “Repository Archiva Managed internal Repository”
host = “REPOSITORY(ohne Port!)”
username = “USERNAME”
password = “PASSWORD”
}
}
[/groovy]

—- IMPORTANT —-

For Archiva the realm must be configured as shown. Or nothing will work!

Also, the Host must be stated here without Port. If the Archiva is also running e.g. on Port 8080 these information can be omitted here.
—- IMPORTANT —-