Awk etl #536
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- | |
# | |
# .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}" |