Archives pour la catégorie ‘Développement’

Git : nettoyer les branches locales déjà mergés et supprimées sur le serveur distant

# git branch -r | awk '{print $1}' | \
  egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | \
  awk '{print $1}' | xargs git branch -d

Git : supprimer un fichier sensible d’un dépôt

# git filter-branch --force \
   --index-filter 'git rm --cached --ignore-unmatch my/path/to/file.txt' \
   --prune-empty --tag-name-filter cat -- --all

Maven : vérifier les mises à jour disponibles

Vérifier les mises à jour des plugins Maven :

boris@debian:~$ mvn versions:display-plugin-updates

Vérifier les mises à jour des dépendances du projet :

boris@debian:~$ mvn versions:display-dependency-updates

Maven : construire une image Docker et y intégrer le JAR du projet

Le but est de construire l’image Docker d’un projet Java par Maven. L’image est générée par le plugin Maven docker-maven-plugin mais afin de ne pas casser le versioning, le nom du JAR original n’est pas modifié; une copie est réalisée avant intégration (un nom de fichier fixe est obligatoire).

Au niveau du projet Maven, un répertoire dédié est créé pour le Dockerfile et l’ensemble des fichiers de génération de l’image :

bhuisgen@local:~/Projects/java/demo$ find src/main/docker/
src/main/docker/
src/main/docker/Dockerfile
src/main/docker/root
src/main/docker/root/etc
src/main/docker/root/etc/services.d
src/main/docker/root/etc/services.d/app
src/main/docker/root/etc/services.d/app/finish
src/main/docker/root/etc/services.d/app/run

L’image repose sur une base Alpine Linux avec gestion des services par s6-overlay auquel est ajouté le strict nécessaire :

bhuisgen@local:~/Projects/java/demo$ cat src/main/docker/Dockerfile
FROM bhuisgen/alpine-base:latest
MAINTAINER Boris HUISGEN <bhuisgen@hbis.fr>

RUN apk add --update openjdk8-jre && \
    rm -rf /var/cache/apk/*

COPY root /

ENTRYPOINT ["/init"]
CMD []

A noter que la commande de copie du JAR n’est pas présente; le plugin l’ajoutera de lui-même. Le reste est donc à ajouter au fichier POM :

bhuisgen@local:~/Projects/java/demo$ vim pom.xml

[...]

    <build>
        <plugins>

[...]

            <!-- copy and rename the JAR to a fixed filename -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <copy
                                    file="${project.build.directory}/${project.artifactId}-${project.version}.jar"
                                    tofile="${project.build.directory}/app.jar" />
                            </target>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <!-- build the Docker image -->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
                    <imageTag>${project.version}</imageTag>
                    <imageTag>latest</imageTag>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <resources>
                        <resource>
                            <directory>${project.build.directory}</directory>
                            <include>app.jar</include>
                            <targetPath>/</targetPath>
                        </resource>
                    </resources>
                </configuration>
            </plugin>

L’image sera générée lors de la phase package et un tag y sera appliqué pour conserver le numéro de version de l’application.

Boto : gérer le logging

Pour activer le log de debug :

import logging
logging.basicConfig(filename="boto.log", level=logging.DEBUG)

Pour supprimer tout le logging (par exemple avec S3) hormis les erreurs critiques :

import logging
logging.getLogger('boto').setLevel(logging.CRITICAL)

Java : log syslog avec log4j

package syslog;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.net.SyslogAppender;

public class test {
	private static final Logger log = Logger.getLogger(test.class);

	public static void main(String[] args) {
		Logger rootLogger = Logger.getRootLogger();
		
		rootLogger.setLevel(Level.DEBUG);

		PatternLayout layout = new PatternLayout("%t: %p: %m%n");
		SyslogAppender syslogAppender = new SyslogAppender(layout, "localhost",
				SyslogAppender.LOG_USER);
		
		Logger.getRootLogger().addAppender(syslogAppender);

		log.info("log message");
	}
}

Ne pas oublier d’activer l’écoute réseau du serveur syslog local :

# vim /etc/rsyslog.conf
# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

Git : annuler le dernier commit « amend »

# git reset --soft HEAD@{1}

Git : appliquer une stratégie de merge différente

# git checkout master
# git merge --no-ff release -X theirs

Git : prompt bash

Un prompt bash spécialisé pour l’utilisation de Git :

https://github.com/magicmonty/bash-git-prompt

Shell : la commande du jour

Vérification de la syntaxe des scripts shell par récursion avec shellcheck :

# shellcheck -e SC2029,SC2034 $(find . ! -path './.git/*' -type f -executable -exec sh -c 'file {}|grep -q "shell script" && echo -n "{} "' \;)
Haut de page