Angular: Sentry-Nachrichten mit Version anreichern

Maximilian Holl, 18. Juni 2018
Lesezeit: 6 Minuten

Jedes Release birgt potentielle Fehler, die selbst durch ausgiebige Testphasen nicht gefunden werden. Um diese möglichst schnell zu erfassen, helfen sogenannte Error-Tracker (in unserem Fall Sentry) Fehler direkt während der Laufzeit zu loggen und wichtige systembezogene Informationen mitzuschicken.

Das Vergleichen der Codeänderungen ist eines der ersten Mittel, um die Fehlerursachen einzugrenzen. Dementsprechend sollte in dieser Nachricht die aktuelle Release-Version nicht fehlen. Um diese Eigenschaft kontinuierlich und möglichst automatisiert in Sentry einzustellen, lesen wir über die Git-Tags die aktuelle Version beim Jenkins-Rollout aus und legen sie in eine Datei ab.

Auslesen der SemVer Git-Tags

Da unsere Jenkins-Pipeline beim Rollout npm build ausführt, finden wir über den prebuild Script-Hook einen geeigneten Einstieg für ein Node-Script mit dem wir die Git-Version auslesen und in einer Version-Datei ablegen.

package.json

Copy
"scripts": { 
    … 
    "start": "npm install && ng serve", 
    "prebuild": "ts-node ./scripts/git.version.ts",
    … 
},

scripts/git.versions.ts

Copy
// ts-check 
const chalk = require('chalk'); 
const git = require('git-describe');
const path = require('path');
const fs = require('fs-extra');
const info = git.gitDescribeSync({ 
    longSemver: true, 
    dirtySemver: false 
});

Zum Auslesen benutzen wir das npm module git-describe und installieren es.

Copy
npm install -–save-dev git-describe

Das Tool überprüft, ob es sich um ein korrektes SemVer-Tagging handelt, liefert aber idealerweise in beiden Fällen ein robustes Ergebnis. Die Version schreiben wir in eine Datei ab und importieren sie wo benötigt.

scripts/git.versions.ts

Copy
const file = path.resolve(__dirname, '..', 'src', 'environments', 'version.ts'); 

fs.writeFileSync( 
    file, 
    `export const VERSION = ${JSON.stringify(info)};`, 
    { encoding: 'utf-8' } 
);

console.log(chalk.green(`Schreibe Version ${info.raw} nach ${path.relative(path.resolve(__dirname, '..'), file)}`));

Sentry-Nachrichten einstellen

Zum Übermitteln der Tags geben wir zusätzlich zur Release-Version auch den exakten Git-Commit-Hash an. Sobald das Git mit Sentry verbunden ist, werden die Nachrichten automatisch mit den Commits verlinkt.

app/services/raven.service.ts

Copy
import {ErrorHandler, Injectable} from "@angular/core"; import * as Raven from "raven-js"; 
import {environment} from "../../environments/environment";
import {VERSION} from "../../environments/version";

@Injectable()
export class RavenErrorHandler extends ErrorHandler { 

    constructor() {
        super(false); 
        
        if (environment.production) { 
            Raven 
            .config('https://avc.sentry.local', { 
                release: VERSION.semver.version, 
                tags: {git_commit: VERSION.hash}, 
                environment: environment.env 
            }).install(); 
        } 
} 

handleError(error: any): void { 
    if (environment.production) {
        Raven.captureException(error); 
        } else { 
            super.handleError(error); 
        } 
    } 
}

Version-File erzeugen

Mit dem Git-Tag-Versioning pushen wir eine neue Versionen und legen diese durch das Rollout bzw. dem Auführen von npm build in das Version-File, wo sie zur Laufzeit ausgelesen wird.

Copy
git tag v1.0.1-RELEASE
git push --tags
npm build

Nach dem Build-Befehl ist die Datei unter environments/version.ts angelegt.