From d1e1737f283d234d93694825fd7c946ba095a5d1 Mon Sep 17 00:00:00 2001 From: lowlighter <22963968+lowlighter@users.noreply.github.com> Date: Sun, 24 Apr 2022 13:23:31 -0400 Subject: [PATCH] ref(app/action): move `action.yml` bash script to `run.sh` --- .github/scripts/build.mjs | 2 +- source/app/action/action.yml | 91 +----------------------------------- source/app/action/run.sh | 90 +++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 91 deletions(-) create mode 100644 source/app/action/run.sh diff --git a/.github/scripts/build.mjs b/.github/scripts/build.mjs index 1d89cfbe..44ce5849 100644 --- a/.github/scripts/build.mjs +++ b/.github/scripts/build.mjs @@ -77,7 +77,7 @@ for (const id of Object.keys(templates)) { for (const step of ["config", "documentation"]) { switch (step) { case "config": - await update({source: paths.join(__action, "action.yml"), output: "action.yml"}) + await update({source: paths.join(__action, "action.yml"), output: "action.yml", context: {runsh: `${await fs.readFile(paths.join(__action, "run.sh"), "utf8")}`}}) await update({source: paths.join(__web, "settings.example.json"), output: "settings.example.json"}) break case "documentation": diff --git a/source/app/action/action.yml b/source/app/action/action.yml index 7ff13e07..f51497f2 100644 --- a/source/app/action/action.yml +++ b/source/app/action/action.yml @@ -25,96 +25,7 @@ runs: using: composite steps: - run: | - # Check runner compatibility - echo "::group::Metrics docker image setup" - echo "GitHub action: $METRICS_ACTION ($METRICS_ACTION_PATH)" - cd $METRICS_ACTION_PATH - for DEPENDENCY in docker jq; do - if ! which $DEPENDENCY; then - echo '::error::"$DEPENDENCY" is not installed on current runner but is needed to run metrics' - MISSING_DEPENDENCIES=1 - fi - done - if [[ $MISSING_DEPENDENCIES == "1" ]]; then - echo "Runner compatibility: missing dependencies" - exit 1 - else - echo "Runner compatibility: compatible" - fi - - # Create environment file from inputs and GitHub variables - touch .env - for INPUT in $(echo $INPUTS | jq -r 'to_entries|map("INPUT_\(.key|ascii_upcase)=\(.value|@uri)")|.[]'); do - echo $INPUT >> .env - done - env | grep -E '^(GITHUB|ACTIONS|CI|TZ)' >> .env - echo "Environment variables: loaded" - - # Renders output folder - METRICS_RENDERS="/metrics_renders" - sudo mkdir -p $METRICS_RENDERS - echo "Renders output folder: $METRICS_RENDERS" - - # Source repository (picked from action name) - METRICS_SOURCE=$(echo $METRICS_ACTION | sed -E 's/metrics.*?$//g' | sed -E 's/_//g') - echo "Source: $METRICS_SOURCE" - - # Version (picked from package.json) - METRICS_VERSION=$(grep -Po '(?<="version": ").*(?=")' package.json) - echo "Version: $METRICS_VERSION" - - # Image tag (extracted from version or from env) - METRICS_TAG=v$(echo $METRICS_VERSION | sed -r 's/^([0-9]+[.][0-9]+).*/\1/') - echo "Image tag: $METRICS_TAG" - - # Image name - # Official action - if [[ $METRICS_SOURCE == "lowlighter" ]]; then - # Use registry with pre-built images - if [[ ! $METRICS_USE_PREBUILT_IMAGE =~ ^([Ff]alse|[Oo]ff|[Nn]o|0)$ ]]; then - # Is released version - set +e - METRICS_IS_RELEASED=$(expr $(expr match $METRICS_VERSION .*-beta) == 0) - set -e - echo "Is released version: $METRICS_IS_RELEASED" - if [[ "$METRICS_IS_RELEASED" -eq "0" ]]; then - METRICS_TAG="$METRICS_TAG-beta" - echo "Image tag (updated): $METRICS_TAG" - fi - METRICS_IMAGE=ghcr.io/lowlighter/metrics:$METRICS_TAG - echo "Using pre-built version $METRICS_TAG, will pull docker image from GitHub registry" - if ! docker image pull $METRICS_IMAGE; then - echo "Failed to fetch docker image from GitHub registry, will rebuild it locally" - METRICS_IMAGE=metrics:$METRICS_VERSION - fi - # Rebuild image - else - echo "Using an unreleased version ($METRICS_VERSION)" - METRICS_IMAGE=metrics:$METRICS_VERSION - fi - # Forked action - else - echo "Using a forked version" - METRICS_IMAGE=metrics:forked-$METRICS_VERSION - fi - echo "Image name: $METRICS_IMAGE" - - # Build image if necessary - set +e - docker image inspect $METRICS_IMAGE - METRICS_IMAGE_NEEDS_BUILD="$?" - set -e - if [[ "$METRICS_IMAGE_NEEDS_BUILD" -gt "0" ]]; then - echo "Image $METRICS_IMAGE is not present locally, rebuilding it from Dockerfile" - docker build -t $METRICS_IMAGE . - else - echo "Image $METRICS_IMAGE is present locally" - fi - echo "::endgroup::" - - # Run docker image with current environment - docker run --init --rm --volume $GITHUB_EVENT_PATH:$GITHUB_EVENT_PATH --volume $METRICS_RENDERS:/renders --env-file .env $METRICS_IMAGE - rm .env + <%- runsh.split("\n").map((line, i) => `${i ? " " : ""}${line}`).join("\n") %> shell: bash env: METRICS_ACTION: ${{ github.action }} diff --git a/source/app/action/run.sh b/source/app/action/run.sh new file mode 100644 index 00000000..d1819c80 --- /dev/null +++ b/source/app/action/run.sh @@ -0,0 +1,90 @@ +# Check runner compatibility +echo "::group::Metrics docker image setup" +echo "GitHub action: $METRICS_ACTION ($METRICS_ACTION_PATH)" +cd $METRICS_ACTION_PATH +for DEPENDENCY in docker jq; do + if ! which $DEPENDENCY; then + echo '::error::"$DEPENDENCY" is not installed on current runner but is needed to run metrics' + MISSING_DEPENDENCIES=1 + fi +done +if [[ $MISSING_DEPENDENCIES == "1" ]]; then + echo "Runner compatibility: missing dependencies" + exit 1 +else + echo "Runner compatibility: compatible" +fi + +# Create environment file from inputs and GitHub variables +touch .env +for INPUT in $(echo $INPUTS | jq -r 'to_entries|map("INPUT_\(.key|ascii_upcase)=\(.value|@uri)")|.[]'); do + echo $INPUT >> .env +done +env | grep -E '^(GITHUB|ACTIONS|CI|TZ)' >> .env +echo "Environment variables: loaded" + +# Renders output folder +METRICS_RENDERS="/metrics_renders" +sudo mkdir -p $METRICS_RENDERS +echo "Renders output folder: $METRICS_RENDERS" + +# Source repository (picked from action name) +METRICS_SOURCE=$(echo $METRICS_ACTION | sed -E 's/metrics.*?$//g' | sed -E 's/_//g') +echo "Source: $METRICS_SOURCE" + +# Version (picked from package.json) +METRICS_VERSION=$(grep -Po '(?<="version": ").*(?=")' package.json) +echo "Version: $METRICS_VERSION" + +# Image tag (extracted from version or from env) +METRICS_TAG=v$(echo $METRICS_VERSION | sed -r 's/^([0-9]+[.][0-9]+).*/\1/') +echo "Image tag: $METRICS_TAG" + +# Image name +# Official action +if [[ $METRICS_SOURCE == "lowlighter" ]]; then + # Use registry with pre-built images + if [[ ! $METRICS_USE_PREBUILT_IMAGE =~ ^([Ff]alse|[Oo]ff|[Nn]o|0)$ ]]; then + # Is released version + set +e + METRICS_IS_RELEASED=$(expr $(expr match $METRICS_VERSION .*-beta) == 0) + set -e + echo "Is released version: $METRICS_IS_RELEASED" + if [[ "$METRICS_IS_RELEASED" -eq "0" ]]; then + METRICS_TAG="$METRICS_TAG-beta" + echo "Image tag (updated): $METRICS_TAG" + fi + METRICS_IMAGE=ghcr.io/lowlighter/metrics:$METRICS_TAG + echo "Using pre-built version $METRICS_TAG, will pull docker image from GitHub registry" + if ! docker image pull $METRICS_IMAGE; then + echo "Failed to fetch docker image from GitHub registry, will rebuild it locally" + METRICS_IMAGE=metrics:$METRICS_VERSION + fi + # Rebuild image + else + echo "Using an unreleased version ($METRICS_VERSION)" + METRICS_IMAGE=metrics:$METRICS_VERSION + fi +# Forked action +else + echo "Using a forked version" + METRICS_IMAGE=metrics:forked-$METRICS_VERSION +fi +echo "Image name: $METRICS_IMAGE" + +# Build image if necessary +set +e +docker image inspect $METRICS_IMAGE +METRICS_IMAGE_NEEDS_BUILD="$?" +set -e +if [[ "$METRICS_IMAGE_NEEDS_BUILD" -gt "0" ]]; then + echo "Image $METRICS_IMAGE is not present locally, rebuilding it from Dockerfile" + docker build -t $METRICS_IMAGE . +else + echo "Image $METRICS_IMAGE is present locally" +fi +echo "::endgroup::" + +# Run docker image with current environment +docker run --init --rm --volume $GITHUB_EVENT_PATH:$GITHUB_EVENT_PATH --volume $METRICS_RENDERS:/renders --env-file .env $METRICS_IMAGE +rm .env \ No newline at end of file