improve exit code testing #77
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
name: Build and Run Docker Image | |
on: | |
push: | |
branches: | |
- 'ci' # Trigger on push to release branches | |
jobs: | |
build_and_run: | |
runs-on: ubuntu-latest # Use a GitHub-hosted runner | |
steps: | |
- name: Checkout Code | |
uses: actions/checkout@v4 | |
- name: Build Image Name | |
run: | | |
echo DOCKER_IMAGE_NAME=$(echo ${{ github.event.repository.name }} | tr '[A-Z]' '[a-z]') | tee -a $GITHUB_ENV | |
echo CODELINE=$(echo ${{ github.ref_name }} | tr '[A-Z]' '[a-z]') | tee -a $GITHUB_ENV | |
echo INSTANCE_NAME=${{ github.ref_name }}_InT | tee -a $GITHUB_ENV | |
- name: Build Docker Image | |
run: | | |
docker build . --file Dockerfile --tag ${{ env.DOCKER_IMAGE_NAME }}:${{ env.CODELINE }} | |
echo '## Image Details' >> $GITHUB_STEP_SUMMARY | |
header=$(docker images | sed -r 's/\s{2,}/|/g' | grep -E '^R' | sed -r 's/^|$/\|/g') | |
echo "$header" >> $GITHUB_STEP_SUMMARY | |
echo "$header" | sed -r 's/[^|]/-/g' >> $GITHUB_STEP_SUMMARY | |
docker images | sed -r 's/\s{2,}/|/g' | grep -E 'pyterrabacktyl' | sed -r 's/^|$/\|/g' >> $GITHUB_STEP_SUMMARY | |
- name: Run Docker Container | |
run: | | |
docker run -d --name ${{ env.INSTANCE_NAME }} -p 2442:2442 ${{ env.DOCKER_IMAGE_NAME }}:${{ env.CODELINE }} | |
- name: Wait for PyTerraBackTYL to start | |
run: | | |
for ct in {0..9} | |
do | |
# '000' gets set if curl fails | |
OK=$(curl -Ss -o /dev/null -w "%{http_code}" http://localhost:2442 || true) | |
if [ ${OK} -ne 200 ]; then | |
echo "waiting..." | |
sleep 1 | |
else | |
exit 0 | |
fi | |
done | |
exit 1 | |
- name: Set up Terraform | |
uses: hashicorp/setup-terraform@v3 | |
with: | |
terraform_version: 1.9.6 # Specify the version of Terraform you want to use | |
- name: Run Terraform Test | |
run: | | |
cd .github/build_tests | |
terraform init | |
terraform plan | |
terraform apply --auto-approve | |
docker logs ${{ env.INSTANCE_NAME }} | |
echo TFSTATE=$(curl -sS http://localhost:2442/?env=InT) | tee -a $GITHUB_ENV | |
- name: Validate Terraform State | |
run: | | |
cd .github/build_tests | |
TF_CONTENT=$(echo '${{ env.TFSTATE }}' | jq -r '.resources[].instances[].attributes.content | select(. != null)') | |
FILE_CONTENT=$(cat test.txt) | |
if [[ ${TF_CONTENT} != ${FILE_CONTENT} ]]; then | |
echo ${TF_CONTENT} != ${FILE_CONTENT} >&2 | |
exit 1 | |
fi | |
- name: Validate Terraform State Changed | |
run: | | |
cd .github/build_tests | |
CURRENT_NULL_RESOURCE_ID=$(echo '${{env.TFSTATE}}' | jq -r '.resources[] | select(.type == "null_resource") | .instances[].attributes.id') | |
terraform apply --auto-approve | |
NEW_NULL_RESOURCE_ID=$(curl -sS http://localhost:2442/?env=InT | jq -r '.resources[] | select(.type == "null_resource") | .instances[].attributes.id') | |
[ -n "${NEW_NULL_RESOURCE_ID}" ] | |
[ -n "${CURRENT_NULL_RESOURCE_ID}" ] | |
[ "${CURRENT_NULL_RESOURCE_ID}" -ne "${NEW_NULL_RESOURCE_ID}" ] | |
- name: Run Terraform Test, Locked ENV | |
continue-on-error: true | |
run: | | |
curl -X LOCK -sS http://localhost:2442/lock?env=InT | |
cd .github/build_tests | |
terraform apply --auto-approve | |
- name: Verify Command Failed Successfully | |
run: | | |
if [ "${{ steps.run_command.outcome }}" != "success" ]; then | |
if [ "${{ steps.run_command.exit_code }}" -eq 1 ]; then | |
echo "Environment lock was successful" | |
curl -X UNLOCK -sS http://localhost:2442/unlock?env=InT | |
else | |
echo "Step failed with unexpected exit code ${{ steps.run_command.exit_code }}." | |
exit 1 | |
fi | |
else | |
echo "Step succeeded unexpectedly." | |
exit 1 | |
fi | |
- name: Clean Up | |
# Hopefully this is being nice to GHA infra and not wasted CPU cycles | |
run: | | |
docker rm -f ${{ env.INSTANCE_NAME }} || true | |
docker rmi ${{ env.DOCKER_IMAGE_NAME }}:${{ env.CODELINE }} || true |