Injecter des informations sur les Git dans Spring

Injection d'informations git au printemps

1. Vue d'ensemble

Dans ce didacticiel, nous allons montrer comment injecter des informations de référentiel Git dans une application basée sur Spring Boot construite par Maven.

Pour ce faire, nous utiliseronsmaven-git-commit-id-plugin - un outil pratique créé uniquement à cet effet.

2. Dépendances Maven

Ajoutons un plugin à une section<plugins> de notre fichierpom.xml de notre projet:


    pl.project13.maven
    git-commit-id-plugin
    2.2.1

Vous pouvez trouver la dernière versionhere. Gardez à l'esprit que ceplugin requires at least 3.1.1 version of Maven.

3. Configuration

Le plugin a de nombreux drapeaux et attributs pratiques qui élargissent ses fonctionnalités. Dans cette section, nous allons décrire brièvement certaines d’entre elles. Si vous voulez les connaître tous, visitez lespage etif you want to go straight to the example, go to section 4 de maven-git-commit-id-plugin.

Les extraits de code suivants contiennent des exemples d'attributs de plug-in; spécifiez-les dans une section<configuration></configuration> selon vos besoins.

3.1. Référentiel manquant

Vous pouvez le configurer pour qu'il omette les erreurs si le référentiel Git n'a pas été trouvé:

false

3.2. Emplacement du référentiel Git

Si vous souhaitez spécifier l'emplacement du référentiel.git personnalisé, utilisez l'attributdotGitDirectory:

${project.basedir}/submodule_directory/.git

3.3. Fichier de sortie

Afin de générer un fichier de propriétés avec un nom personnalisé et / ou un répertoire, utilisez la section suivante:


    ${project.build.outputDirectory}/filename.properties

3.4. Verbosité

Pour une utilisation plus généreuse de la journalisation:

true

3.5. Génération de fichiers de propriétés

Vous pouvez désactiver la création d'un fichiergit.properties:

false

3.6. Préfixe des propriétés

Si vous souhaitez spécifier un préfixe de propriété personnalisé, utilisez:

git

3.7. Uniquement pour le référentiel parent

Lorsque vous utilisez un projet avec des sous-modules, la définition de cet indicateur garantit que ce plug-in ne fonctionne que pour le référentiel parent:

true

3.8. Exclusion de propriétés

Vous voudrez peut-être exclure certaines données sensibles telles que les informations utilisateur du référentiel:


    git.user.*

3.9. Inclusion de propriétés

L'inclusion de données spécifiées uniquement est également possible:


    git.commit.id

4. Exemple d'application

Créons un exemple de contrôleur REST, qui renverra des informations de base sur notre projet.

Nous allons créer l'exemple d'application à l'aide de Spring Boot. Si vous ne savez pas comment configurer une application Spring Boot, veuillez consulter l'article d'introduction:Configure a Spring Boot Web Application.

Notre application sera composée de 2 classes:Application etCommitIdController

4.1. Application

CommitIdApplication servira de racine de notre application:

@SpringBootApplication(scanBasePackages = { "com.example.git" })
public class CommitIdApplication {

    public static void main(String[] args) {
        SpringApplication.run(CommitIdApplication.class, args);
    }

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
        PropertySourcesPlaceholderConfigurer propsConfig
          = new PropertySourcesPlaceholderConfigurer();
        propsConfig.setLocation(new ClassPathResource("git.properties"));
        propsConfig.setIgnoreResourceNotFound(true);
        propsConfig.setIgnoreUnresolvablePlaceholders(true);
        return propsConfig;
    }
}

En plus de configurer la racine de notre application, nous avons créé le beanPropertyPlaceHolderConfigurer pour pouvoir accéder au fichier de propriétés généré par le plugin.

Nous avons également défini certains indicateurs, de sorte que l'application fonctionnerait correctement même si Spring ne pouvait pas résoudre le fichiergit.properties.

4.2. Manette

@RestController
public class CommitInfoController {

    @Value("${git.commit.message.short}")
    private String commitMessage;

    @Value("${git.branch}")
    private String branch;

    @Value("${git.commit.id}")
    private String commitId;

    @RequestMapping("/commitId")
    public Map getCommitId() {
        Map result = new HashMap<>();
        result.put("Commit message",commitMessage);
        result.put("Commit branch", branch);
        result.put("Commit id", commitId);
        return result;
    }
}

Comme vous pouvez le constater, nous injectons des propriétés Git dans des champs de classe.

Pour voir toutes les propriétés disponibles, reportez-vous au fichiergit.properties ou au Githubpage de l'auteur. Nous avons également créé un point de terminaison simple qui, sur requête HTTP GET, répondra aveca JSON contenant des valeurs injectées.

4.3. Entrée Maven

Nous allons d'abord configurer les étapes d'exécution à effectuer par le plugin, ainsi que toute autre propriété de configuration que nous jugeons utile:


    pl.project13.maven
    git-commit-id-plugin
    2.2.1
    
        
            get-the-git-infos
            
                revision
            
        
        
            validate-the-git-infos
            
                validateRevision
            
        
    
    
        
    

Pour que notre code fonctionne correctement, nous devons nous retrouver avec un fichiergit.properties dans notre chemin de classe. Pour ce faire, nous avons deux options.

La première consiste à laisser le plugin générer le fichier. Nous pouvons le spécifier en définissant la propriété de configurationgenerateGitPropertiesFile sur une valeurtrue:


    true

La deuxième option consiste à inclure nous-mêmes un fichiergit.properties dans le dossier des ressources. Nous ne pouvons inclure que les entrées que nous utiliserons dans notre projet:

# git.properties
git.tags=${git.tags}
git.branch=${git.branch}
git.dirty=${git.dirty}
git.remote.origin.url=${git.remote.origin.url}
git.commit.id=${git.commit.id}
git.commit.id.abbrev=${git.commit.id.abbrev}
git.commit.id.describe=${git.commit.id.describe}
git.commit.id.describe-short=${git.commit.id.describe-short}
git.commit.user.name=${git.commit.user.name}
git.commit.user.email=${git.commit.user.email}
git.commit.message.full=${git.commit.message.full}
git.commit.message.short=${git.commit.message.short}
git.commit.time=${git.commit.time}
git.closest.tag.name=${git.closest.tag.name}
git.closest.tag.commit.count=${git.closest.tag.commit.count}
git.build.user.name=${git.build.user.name}
git.build.user.email=${git.build.user.email}
git.build.time=${git.build.time}
git.build.host=${git.build.host}
git.build.version=${git.build.version}

Maven remplacera les espaces réservés par les valeurs appropriées.

Remarque: certains IDE ne fonctionnent pas bien avec ce plugin et peuvent générer une erreur de «référence d'espace réservé circulaire» lors du démarrage lorsque nous définissons les propriétés comme nous l'avons fait ci-dessus.

Après le démarrage et la demande delocalhost:8080/commitId, vous pouvez voir un fichier JSON avec une structure similaire à la suivante:

{
    "Commit id":"7adb64f1800f8a84c35fef9e5d15c10ab8ecffa6",
    "Commit branch":"commit_id_plugin",
    "Commit message":"Merge branch 'master' into commit_id_plugin"
}

5. Intégration avec Spring Boot Actuator

Vous pouvez utiliser le plugin avecSpring Actuator facilement.

Comme vous pouvez le lire dans lesdocumentation,GitInfoContributor récupérera le fichiergit.properties s'il est disponible. Ainsi, avec la configuration du plugin par défaut, les informations Git seront renvoyées lors de l'appel du point de terminaison/info:

{
  "git": {
    "branch": "commit_id_plugin",
    "commit": {
      "id": "7adb64f",
      "time": "2016-08-17T19:30:34+0200"
    }
  }
}

6. Conclusion

Dans ce didacticiel, nous avons montré les bases de l'utilisation demaven-git-commit-id-plugin et créé une simple application Spring Boot, qui utilise les propriétés générées par le plugin.

La configuration présentée ne couvre pas tous les drapeaux et attributs disponibles, mais couvre toutes les bases nécessaires pour commencer à travailler avec ce plugin.

Vous pouvez trouver des exemples de code surGithub.