Ansible i cache buster

Pamięć podręczna przeglądarki może napsuć krwi programistom zajmującym się frontem. Wielokrotnie byłem świadkiem podobnych dialogów:
– Frontend developerze, mówiłeś, że to naprawiłeś, a nie działa.
– Naciśnij Control i F5.
– Aaa, OK.
Żeby wymusić na przeglądarce pobranie nowej wersji plików (JavaScriptów, arkuszy stylów) można do nazwy pliku dodać query string z wartością zmienianą razem plikami czyli tzw. cache buster, na przykład:

<link rel="stylesheet" type="text/css" href="compiled.css?v=1.23">

Mniej więcej tak robiliśmy w aplikacji, z którą obecnie dużo pracuję. Występujące w przykładzie 1.23 to była wersja aplikacji. Wartość ta była pobierana z pliku konfiguracyjnego. To rozwiązanie miało przynajmniej dwie wady:

  1. Na środowiska testowe często wydajemy wielokrotnie kolejne poprawki do tej samej wersji aplikacji, przez co cache buster nie działał.
  2. Zdarzało nam się zapomnieć podbić wersję w pliku konfiguracyjnym, przez co cache buster nie działał także na produkcji.

Ponieważ do wydań używamy ansible’a postanowiliśmy zautomatyzować generowanie wartości dla cache bustera.

W pierwszym podejściu chciałem użyć daty i czasu wykonania skryptu np. w formacie RRMMDDGGMMSS, ale to rozwiązanie nie za dobrze działa w wypadku, gdy wydanie jest robione dla podzbioru serwerów (tzw. rolling update). Czas uruchomienia skryptu jest inny dla każdej grupy serwerów.

Lepszym rozwiązaniem moim zdaniem jest użycie ID commitu z gita. Zalety tego podejścia to:

  1. Wartość będzie identyczna na każdym serwerze, niezależnie od tego w której serii serwer był aktualizowany.
  2. Wartość jest generowana automatycznie, więc odpada czynnik ludzko-zapominalski.
  3. Wartość jest inna po każdej zmianie kodu w repozytorium, więc będzie różna również dla każdej poprawki w ramach jednej wersji aplikacji.

W roli ansible’a można to ograć następująco:

- name: "Get git short commit ID"
  command: git rev-parse --short HEAD
  args:
    chdir: "/tmp/build-directory"
  register: git_revparse

W powyższym przykładzie wartość chdir to katalog, w którym mamy kod aplikacji z repozytorium git. Po wykonaniu tego kroku w
w zmiennej git_revparse.stdout będzie znajdować ID commitu, które można przekazać np. do szablonu pliku konfiguracyjnego.

Obecnie linki do skryptów i styli wyglądają mniej więcej tak:

<link rel="stylesheet" type="text/css" href="compiled.css?v=c109ad9">