Wilfried Woivré

Cloud Solution Architect - MVP Microsoft Azure

Github Actions - Créer ses étapes personnalisées

Categories : Azure Azure   Github Actions Github Actions   ARM ARM


Lors de mon dernier article je vous ai présenté comment utiliser Github Action pour déployer vos templates ARM.

Pour cela, j’ai utilisé une action provenant d’un repository Microsoft Azure.

Cette action permet de :

  • Créer un groupe de ressource
  • Déployer un template ARM & un fichier de paramètres depuis une URL relative ou absolue.
  • Supprimer un groupe de ressource.

Maintenant elle a aussi des défauts, à ce jour, on ne peut pas déployer sans fichier de paramètre, et il n’est pas possible de déployer au niveau d’une souscription.

J’ai donc décidé de créer ma propre action disponible sur mon github : Azure Action ARM

Elle permet de déployer soit sur un groupe de ressource soit sur une souscription avec ou non un paramètre.

Pour ce faire, il vous suffit juste de créer une image Docker qui réalisera ce dont vous avez besoin. Pour ma part, j’ai repris quelque chose de similaire de celles qui sont fournis par Microsoft.

A savoir le Dockerfile suivant


FROM microsoft/azure-cli:2.0.47

LABEL version="1.0.0"

LABEL maintainer="Wilfried Woivré"
LABEL com.github.actions.name="Déploy ARM Template"
LABEL com.github.actions.description="GitHub Action to deploy ARM template to Azure"
LABEL com.github.actions.icon="triange"
LABEL com.github.actions.color="blue"

ENV GITHUB_ACTION_NAME="Azure - Deploy ARM Template"

RUN apk update \
  && apk add --no-cache util-linux

COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

Et un fichier bash entrypoint.sh suivant :

#!/bin/bash

set -e
export AZURE_HTTP_USER_AGENT="GITHUBACTIONS_${GITHUB_ACTION_NAME}_${GITHUB_REPOSITORY}"

URI_REGEX="^(http://|https://)\\w+"
GUID=$(uuidgen | cut -d '-' -f 1)

if [[ -z "$SCOPE" ]]
then
  SCOPE="RESOURCE_GROUP"
fi

if [[ $SCOPE = "RESOURCE_GROUP" ]] && [[ -z "$AZURE_RESOURCE_GROUP" ]]
then
  echo "AZURE_RESOURCE_GROUP is not set." >&2
  exit 1
fi

if [[ -z "$AZURE_TEMPLATE_LOCATION" ]]
then
    echo "AZURE_TEMPLATE_FILE is not set." >&2
    exit 1
fi


# Download parameters file if it is a remote URL

if [[ -z "$AZURE_TEMPLATE_PARAM_LOCATION" ]]
then
  echo "No parameter files set"
else
  if [[ $AZURE_TEMPLATE_PARAM_LOCATION =~ $URI_REGEX ]]
  then
    PARAMETERS=$(curl "$AZURE_TEMPLATE_PARAM_LOCATION")
    echo "Downloaded parameters from ${AZURE_TEMPLATE_PARAM_LOCATION}"
  else
    PARAMETERS_FILE="${GITHUB_WORKSPACE}/${AZURE_TEMPLATE_PARAM_LOCATION}"
    if [[ ! -e "$PARAMETERS_FILE" ]]
    then
      echo "Parameters file ${PARAMETERS_FILE} does not exits." >&2
      exit 1
    fi
    PARAMETERS="@${PARAMETERS_FILE}"
  fi
fi

# Generate deployment name if not specified

if [[ -z "$DEPLOYMENT_NAME" ]]
then
  DEPLOYMENT_NAME="Github-Action-ARM-${GUID}"
  echo "Generated Deployment Name ${DEPLOYMENT_NAME}"
fi

# Deploy ARM template

if [[ $SCOPE = 'RESOURCE_GROUP' ]]
then
  if [[ $AZURE_TEMPLATE_LOCATION =~ $URI_REGEX ]]
  then
    if [[ -z "$PARAMETERS" ]]
    then
      az group deployment create -g "$AZURE_RESOURCE_GROUP" --name "$DEPLOYMENT_NAME" --template-uri "$AZURE_TEMPLATE_LOCATION"
    else
      az group deployment create -g "$AZURE_RESOURCE_GROUP" --name "$DEPLOYMENT_NAME" --template-uri "$AZURE_TEMPLATE_LOCATION" --parameters "$PARAMETERS"
    fi
  else
    TEMPLATE_FILE="${GITHUB_WORKSPACE}/${AZURE_TEMPLATE_LOCATION}"
    if [[ ! -e "$TEMPLATE_FILE" ]]
    then
      echo "Template file ${TEMPLATE_FILE} does not exists." >&2
      exit 1
    fi
    if [[ -z "$PARAMETERS" ]]
    then
      az group deployment create -g "$AZURE_RESOURCE_GROUP" --name "$DEPLOYMENT_NAME" --template-file "$AZURE_TEMPLATE_LOCATION"
    else
      az group deployment create -g "$AZURE_RESOURCE_GROUP" --name "$DEPLOYMENT_NAME" --template-file "$AZURE_TEMPLATE_LOCATION" --parameters "$PARAMETERS"
    fi
  fi
fi

if [[ $SCOPE = 'SUBSCRIPTION' ]]
then
  if [[ $AZURE_TEMPLATE_LOCATION =~ $URI_REGEX ]]
  then
    if [[ -z "$PARAMETERS" ]]
    then
      az deployment create --location "$DEPLOYMENT_LOCATION" --name "$DEPLOYMENT_NAME" --template-uri "$AZURE_TEMPLATE_LOCATION"
    else
      az deployment create --location "$DEPLOYMENT_LOCATION" --name "$DEPLOYMENT_NAME" --template-uri "$AZURE_TEMPLATE_LOCATION" --parameters "$PARAMETERS"
    fi
  else
    TEMPLATE_FILE="${GITHUB_WORKSPACE}/${AZURE_TEMPLATE_LOCATION}"
    if [[ ! -e "$TEMPLATE_FILE" ]]
    then
      echo "Template file ${TEMPLATE_FILE} does not exists." >&2
      exit 1
    fi
    if [[ -z "$PARAMETERS" ]]
    then
      az deployment create --location "$DEPLOYMENT_LOCATION" --name "$DEPLOYMENT_NAME" --template-file "$AZURE_TEMPLATE_LOCATION"
    else
      az deployment create --location "$DEPLOYMENT_LOCATION" --name "$DEPLOYMENT_NAME" --template-file "$AZURE_TEMPLATE_LOCATION" --parameters "$PARAMETERS"
    fi
  fi
fi

Pour l’utiliser, il suffit de créer vos étapes de la manière suivantes :

    - name: Azure - Deploy ARM Template - Subscription Level with parameters
      uses: wilfriedwoivre/github-actions/Azure/arm@master
      env:
        SCOPE: SUBSCRIPTION
        DEPLOYMENT_LOCATION: West Europe
        AZURE_TEMPLATE_LOCATION: arm-deployment-sub.json
        AZURE_TEMPLATE_PARAM_LOCATION: arm-deployment-sub.parameters.json

Dans la propriété use on retrouve mon image Docker selon le format suivant : mon_nom_d’utilisateur/mon_repo_github/arborescence@branch

L’image est ensuite construite lors de chaque début de job sur Github Action

Pour aller plus loin, il est possible de publier votre action sur le marketplace de Github : https://developer.github.com/marketplace/actions/publishing-an-action-in-the-github-marketplace/