Od momentu napisania pierwszej wersji skryptu do sprawdzania wersji pluginów w kontenerach WP, ich ilość zwiększyła się dwukrotnie. Niektóre aplikacje na jednym serwerze posiadają dwie instancje WordPressa, a pierwsza wersja skryptu kompletnie nie była przygotowana na taką sytuację. Patrząc na wiele możliwych rozwiązań, stwierdziłem, że najczystszym z nich będzie wprowadzenie labelek.

Od teraz każdy serwis posiada opisującą go labelkę, dzięki temu namierzenie odpowiedniego w danym projekcie kontenera z bazą, wordpressem, czy aplikacją w nodejs stało się bardzo proste. Jest to też pewna forma dokumentacji, która devopsom niezaangażowanym w projekt szybko daje infomację na temat przeznaczenia danego serwisu.

By odwzorować tą zmianę w skrypcie wporwadziłem nową zmienną LABELS, która tak na prawdę jest po prostu tablicą z nazwami labelek opisujących kontenery WordPressa.

LABELS=("shop-wordpress" "blog-wordpress" "shop2-wordpress")

Zmieniła się też natura pętli, która teraz nie tylko iteruje po zmiennej INSTANCES, ale również odnosi się do LABESL. Z tego powodu ma ona teraz postać

for i in ${!INSTANCES[@]}
do
    echo -e "\U1F600 Checking plugins in ${INSTANCES[i]}"

    WORDPRESS_CONTAINER_ID=$(ssh ${INSTANCES[i]} "docker ps -q --filter label=pk.label=${LABELS[i]}")
    RESPONSE=$(ssh ${INSTANCES[i]} "docker exec $WORDPRESS_CONTAINER_ID wp plugin list --format=json --allow-root")
    ARRLENGTH=$(echo $RESPONSE | jq length)

    echo -e "\n### ${INSTANCES[i]} - label ${LABELS[i]}\n" >> $FILE
    echo -e "Name | Status | Update | Version" >> $FILE
    echo -e "--- | --- | --- | ---" >> $FILE

    for (( i=0; i<$ARRLENGTH; i++ ))
    do
        echo "$(echo $RESPONSE | jq -r .[$i].name) | $(echo $RESPONSE | jq -r .[$i].status) | $(echo $RESPONSE | jq -r .[$i].update) | $(echo $RESPONSE | jq -r .[$i].version)" >> $FILE
    done
done

Idąc jeszcze za ciosem, stwierdziłem, że skrypt mógłby jeszcze sprawdzić dla mnie szablony, które są zainstalowane w kontenerach. Poniższy kod, to obecnie kopia poprzedniej pętli, z nową komendą w exec i nazwą pliku, która informuje o raporcie dla themes

FILE=themes-$(date +'%d-%m-%Y').md
for i in ${!INSTANCES[@]}
do
    echo -e "\U1F600 Checking themes in ${INSTANCES[i]}"

    WORDPRESS_CONTAINER_ID=$(ssh ${INSTANCES[i]} "docker ps -q --filter label=pk.label=${LABELS[i]}")
    RESPONSE=$(ssh ${INSTANCES[i]} "docker exec $WORDPRESS_CONTAINER_ID wp theme list --format=json --allow-root")
    ARRLENGTH=$(echo $RESPONSE | jq length)

    echo -e "\n### ${INSTANCES[i]} - label ${LABELS[i]}\n" >> $FILE
    echo -e "Name | Status | Update | Version" >> $FILE
    echo -e "--- | --- | --- | ---" >> $FILE

    for (( i=0; i<$ARRLENGTH; i++ ))
    do
        echo "$(echo $RESPONSE | jq -r .[$i].name) | $(echo $RESPONSE | jq -r .[$i].status) | $(echo $RESPONSE | jq -r .[$i].update) | $(echo $RESPONSE | jq -r .[$i].version)" >> $FILE
    done
done

Na koniec, cały skrypt, który obecnie pozwala mi zaoszczędzić kilkadziesiąt minut pracy, co tydzień.

#!/bin/bash
FILE=plugins-$(date +'%d-%m-%Y').md
INSTANCES=("pkgs.staging" "pkgs.production")
LABELS=("shop-wordpress" "blog-wordpress")

for i in ${!INSTANCES[@]}
do
    echo -e "\U1F600 Checking plugins in ${INSTANCES[i]}"

    WORDPRESS_CONTAINER_ID=$(ssh ${INSTANCES[i]} "docker ps -q --filter label=pk2service.label=${LABELS[i]}")
    RESPONSE=$(ssh ${INSTANCES[i]} "docker exec $WORDPRESS_CONTAINER_ID wp plugin list --format=json --allow-root")
    ARRLENGTH=$(echo $RESPONSE | jq length)

    echo -e "\n### ${INSTANCES[i]} - label ${LABELS[i]}\n" >> $FILE
    echo -e "Name | Status | Update | Version" >> $FILE
    echo -e "--- | --- | --- | ---" >> $FILE

    for (( i=0; i<$ARRLENGTH; i++ ))
    do
        echo "$(echo $RESPONSE | jq -r .[$i].name) | $(echo $RESPONSE | jq -r .[$i].status) | $(echo $RESPONSE | jq -r .[$i].update) | $(echo $RESPONSE | jq -r .[$i].version)" >> $FILE
    done
done

FILE=themes-$(date +'%d-%m-%Y').md
for i in ${!INSTANCES[@]}
do
    echo -e "\U1F600 Checking themes in ${INSTANCES[i]}"

    WORDPRESS_CONTAINER_ID=$(ssh ${INSTANCES[i]} "docker ps -q --filter label=pk2service.label=${LABELS[i]}")
    RESPONSE=$(ssh ${INSTANCES[i]} "docker exec $WORDPRESS_CONTAINER_ID wp theme list --format=json --allow-root")
    ARRLENGTH=$(echo $RESPONSE | jq length)

    echo -e "\n### ${INSTANCES[i]} - label ${LABELS[i]}\n" >> $FILE
    echo -e "Name | Status | Update | Version" >> $FILE
    echo -e "--- | --- | --- | ---" >> $FILE

    for (( i=0; i<$ARRLENGTH; i++ ))
    do
        echo "$(echo $RESPONSE | jq -r .[$i].name) | $(echo $RESPONSE | jq -r .[$i].status) | $(echo $RESPONSE | jq -r .[$i].update) | $(echo $RESPONSE | jq -r .[$i].version)" >> $FILE
    done
done