Skip to content

Webassembly day01

Webassembly day01 #699

Workflow file for this run

---
#
# .github/workflows/awk.yml
#
name: Awk Workflow 2.0
on: # yamllint disable-line rule:truthy
pull_request:
workflow_dispatch:
defaults:
run:
shell: bash
jobs:
stage1:
name: Change Check
runs-on: 'ubuntu-latest'
outputs:
docs_changed: ${{ steps.check_file_changed.outputs.docs_changed }}
matrix_exercise: ${{ steps.check_file_changed.outputs.matrix_exercise }}
exercise_count: ${{ steps.check_file_changed.outputs.exercise_count }}
steps:
- name: Check GitHub Vars
id: github-vars
run: set | grep -e ^CI -e ^GITHUB_ -e ^RUNNER_
- name: Checkout Repo
id: checkout-repo
uses: actions/checkout@v3
with:
fetch-depth: 0
ref: ${{ github.ref }}
submodules: recursive
- name: Get Change List
id: check_file_changed
run: |-
{
printf "Workflow: %s\n\n" "${GITHUB_WORKFLOW}"
printf "Runner: name[%s] arch[%s]\n" "${RUNNER_NAME}" "${RUNNER_ARCH}"
printf "Repo: %s\n" "${GITHUB_REPOSITORY}"
printf "User: %s\n" "${GITHUB_TRIGGERING_ACTOR}"
printf "\n"
} | tee -a "${GITHUB_STEP_SUMMARY}"
# get user info for default gh container
{
printf "\`\`\`text\n"
printf "Container user info:\n"
who
printf "\n"
id
printf "\`\`\`\n"
} | tee -a "${GITHUB_STEP_SUMMARY}"
printf "\n"
# Diff HEAD with the previous commit then output to stdout.
GIT_DIFF="$(git diff --name-only HEAD^ HEAD | tee /tmp/changed_files.txt)"
{
printf "=== Which files changed? ===\n"
printf "\`\`\`text\n"
printf "%s\n" "${GIT_DIFF}"
printf "\`\`\`\n"
} | tee -a "${GITHUB_STEP_SUMMARY}"
HAS_WF_DIFF=false
HAS_EX_DIFF=false
if printf "%s\n" "${GIT_DIFF}" | grep -E '^(.github/workflows/awk.yml|.github/citools/awk/)$'; then
HAS_WF_DIFF=true
fi
if printf "%s\n" "${GIT_DIFF}" | grep -E '^awk/.*[.]awk$'; then
HAS_EX_DIFF=true
fi
printf "\n"
printf "=== Did WF/CI change without exercise changes? ===\n"
CI_FORCE_FULL=false
if ${HAS_WF_DIFF} && ! ${HAS_EX_DIFF}; then
CI_FORCE_FULL=true
printf "%s\n" "${CI_FORCE_FULL}"
fi
printf "\n"
# Get changed exercise list.
if [[ ${GITHUB_EVENT_NAME} == pull_request ]] && ! ${CI_FORCE_FULL}; then
printf "Generating pull request changed exercise list.\n"
grep -E '^awk/[-a-z0-9]+./.*$' /tmp/changed_files.txt | cut -f1,2 -d/ | sort -Vu | tee /tmp/exercises.txt || true
else
printf "Generating complete exercise list.\n"
find ./awk/ -type d -print | grep -v -E '^[.]/awk/(|[.].*)$' | sed -r -e 's:[.]/(awk/[-a-z0-9]+)/?.*$:\1:g' | sort -Vu | tee /tmp/exercises.txt
HAS_DIFF=true
fi
printf "\n"
# Check if the files are present in the changed file list (added, modified, deleted) then output to stdout.
HAS_DIFF="${HAS_DIFF:-false}"
printf "=== Which Awk files changed? ===\n"
if printf "%s\n" "${GIT_DIFF}" | grep -E '^(awk/.*[.]awk|.github/workflows/awk.yml)$'; then
HAS_DIFF=true
printf "%s\n" "${HAS_DIFF}"
fi
printf "\n"
# Did Awk files change?
printf "=== Did Awk files change? ===\n"
printf "%s\n" "${HAS_DIFF}"
printf "\n"
# Generate exercise job matrix from changed files list.
printf "=== Generating matrix exercise list. ===\n"
declare -i last=0
declare -i count=0
last=$(wc -l /tmp/exercises.txt | cut -f1 -d\ )
((last -= 1)) || true
entries=""
while read -r line; do
if [[ ! ${count} -lt ${last} ]]; then
comma=""
else
comma=","
fi
printf -v entry "\"%s\"%s\n" "${line}" "${comma}"
((count += 1))
entries+="${entry}"
done < <(sort -V /tmp/exercises.txt)
jq --sort-keys . >/tmp/exercises.json <<EOF
[ ${entries} ]
EOF
exercise_count="$(jq '. | length' /tmp/exercises.json)"
printf "%s=%s\n" "exercise_count" "${exercise_count}" | tee -a "${GITHUB_OUTPUT}"
matrix_exercise="$(jq --compact-output --sort-keys . /tmp/exercises.json)"
printf "%s=%s\n" "matrix_exercise" "${matrix_exercise}" | tee -a "${GITHUB_OUTPUT}"
printf "\n"
cat "${GITHUB_OUTPUT}"
# Don't run stage 2 if PR mode doesn't have testable changes.
if [[ ${GITHUB_EVENT_NAME} == pull_request ]] && [[ -z ${entries} ]]; then
printf "In PR mode with no testable changes, disabling stage 2.\n"
HAS_DIFF=false
fi
# Set the output named "docs_changed"
printf "%s=%s\n" "docs_changed" "${HAS_DIFF}" >> "${GITHUB_OUTPUT}"
check-matrix:
runs-on: ubuntu-latest
needs: stage1
steps:
- name: Install json2yaml
run: sudo npm install -g json2yaml
- name: Check matrix::exercises
run: |-
exercise_count='${{ needs.stage1.outputs.exercise_count }}'
matrix_exercise='${{ needs.stage1.outputs.matrix_exercise }}'
{
printf "\`\`\`text\n"
printf "exercise_count=%s\n" "${exercise_count}"
printf "matrix_exercise=%s\n" "${matrix_exercise}"
printf "\`\`\`\n"
printf "json:\n"
printf "\`\`\`text\n"
printf "%s" "${matrix_exercise}" | jq .
printf "\`\`\`\n"
} | tee -a "${GITHUB_STEP_SUMMARY}"
{
printf "yaml:\n"
printf "\`\`\`text\n"
printf "{ \"matrix\": { \"exercise\": %s } }" "${matrix_exercise}" | json2yaml
printf "\`\`\`\n"
} | tee -a "${GITHUB_STEP_SUMMARY}"
stage2:
name: Awk Checks
strategy:
matrix:
os: ["ubuntu-latest", "windows-latest", "macos-latest"]
exclude:
- os: "macos-latest"
- os: "windows-latest"
exercise: ${{fromJson(needs.stage1.outputs.matrix_exercise)}}
runs-on: "${{ matrix.os }}"
needs: [stage1]
if: needs.stage1.outputs.docs_changed == 'True'
steps:
- name: Checkout Repo [${{ matrix.exercise }}]
id: checkout-repo
uses: actions/checkout@v3
- name: Set up Awk [${{ matrix.exercise }}]
id: setup-awk
run: |-
sudo apt install -y gawk
- name: Show Awk version [${{ matrix.exercise }}]
id: awk-version
run: |-
awk --version
- name: Checkout bats-core [${{ matrix.exercise }}]
id: checkout-bats-core
uses: actions/checkout@v3
with:
repository: bats-core/bats-core
path: bats-core
- name: Install Bats [${{ matrix.exercise }}]
id: install-bats-core
run: |-
cd bats-core
sudo ./install.sh /usr/local
- name: Checkout awkunit [${{ matrix.exercise }}]
id: checkout-awkunit
uses: actions/checkout@v3
with:
repository: soimort/awkunit
path: awkunit
- name: Install Awk Tools [${{ matrix.exercise }}]
id: install-awk-tools
run: |-
ls
awk_ver="gawk-$(awk --version | awk '/^GNU Awk/ { print $3 }' | tr -d ',')"
git clone http://git.savannah.gnu.org/r/gawk.git gawk
cd gawk
git checkout "${awk_ver}"
cd ../awkunit
AWKSRCPATH=../gawk make
mkdir -pv ../.lib
cp -v awkunit.so ../.lib
- name: CD to Awk Dir [${{ matrix.exercise }}]
id: cd-to-awk-dir
run: |-
pwd
ls
cd ./awk
pwd
ls
- name: Lint Checking with Awk [${{ matrix.exercise }}]
id: awk-lint-run
run: |-
pwd
cd "./${{ matrix.exercise }}"
pwd
ls
{
printf "awk-lint output\n\n"
printf "\`\`\`text\n"
../../.github/citools/awk/awk-lint
printf "\`\`\`\n"
} |& tee -a "${GITHUB_STEP_SUMMARY}"
- name: Testing with Bats tests [${{ matrix.exercise }}]
id: awk-bats-run
run: |-
pwd
cd "./${{ matrix.exercise }}"
pwd
ls
{
printf "awk-bats output\n\n"
printf "\`\`\`text\n"
../../.github/citools/awk/awk-bats
printf "\`\`\`\n"
} |& tee -a "${GITHUB_STEP_SUMMARY}"
- name: Testing with AwkUnit [${{ matrix.exercise }}]
id: awk-test-run
run: |-
pwd
cd "./${{ matrix.exercise }}"
pwd
ls
{
printf "Testing with unit tests\n"
printf "\`\`\`text\n"
../../.github/citools/awk/awk-test
printf "\`\`\`\n"
} |& tee -a "${GITHUB_STEP_SUMMARY}"