Skip to content

Commit

Permalink
chore: add run use case example to GH workflow
Browse files Browse the repository at this point in the history
  • Loading branch information
jfrery committed Sep 28, 2023
1 parent e467cb7 commit 49f5aaa
Show file tree
Hide file tree
Showing 2 changed files with 132 additions and 30 deletions.
123 changes: 123 additions & 0 deletions .github/workflows/run_use_cases_examples.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
name: Run Use Case Examples
on:
workflow_dispatch:

concurrency:
group: ${{ github.ref }}
cancel-in-progress: true

env:
ACTION_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}

jobs:
start-runner-linux:
name: Start EC2 runner
runs-on: ubuntu-20.04
outputs:
label-38: ${{ steps.start-ec2-runner-38.outputs.label }}
ec2-instance-id-38: ${{ steps.start-ec2-runner-38.outputs.ec2-instance-id || '' }}
steps:
- name: Checkout Code
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608

- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@8c3f20df09ac63af7b3ae3d7c91f105f857d8497
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}

- name: Start EC2 runner python 38
id: start-ec2-runner-38
uses: machulav/ec2-github-runner@4e0303de215db88e1c489e07a15ca4d867f488ea
with:
mode: start
github-token: ${{ secrets.EC2_RUNNER_BOT_TOKEN }}
ec2-image-id: ${{ secrets.AWS_EC2_AMI }}
ec2-instance-type: "m6i.metal"
subnet-id: ${{ secrets.AWS_EC2_SUBNET_ID }}
security-group-id: ${{ secrets.AWS_EC2_SECURITY_GROUP_ID }}

run-use-case-examples:
needs: [start-runner-linux]
runs-on: ${{ needs.start-runner-linux.outputs.label-38 }}
container:
image: ubuntu:20.04
defaults:
run:
shell: bash
steps:
- name: Checkout Code
uses: actions/checkout@v2

- name: Set up Environment
run: |
# Setup commands if any, for example, installing dependencies, etc.
apt-get update && apt-get install -y python3-venv make # Add other dependencies as needed
- name: Run Use Case Examples Script
run: |
chmod +x ./script/make_utils/run_use_case_examples.sh
./script/make_utils/run_use_case_examples.sh
stop-runner-linux:
name: Stop EC2 runner
needs: [run-use-case-examples, start-runner-linux]
runs-on: ubuntu-20.04
if: ${{ always() && (needs.start-runner-linux.result != 'skipped') }}
steps:
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@8c3f20df09ac63af7b3ae3d7c91f105f857d8497
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}

- name: Stop EC2 runner python 38
uses: machulav/ec2-github-runner@4e0303de215db88e1c489e07a15ca4d867f488ea
if: ${{ always() && needs.start-runner-linux.outputs.ec2-instance-id-38 }}
with:
github-token: ${{ secrets.EC2_RUNNER_BOT_TOKEN }}
label: ${{ needs.start-runner-linux.outputs.label-38 }}
ec2-instance-id: ${{ needs.start-runner-linux.outputs.ec2-instance-id-38 }}
mode: stop

send-report:
if: ${{ always() }}
needs:
[
start-runner-linux,
run-use-case-examples,
stop-runner-linux,
]
name: Send Slack notification
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2 # Update to the latest stable version

- name: Prepare whole job status
if: ${{ always() }}
continue-on-error: true
env:
NEEDS_JSON: ${{ toJSON(needs) }}
run: |
echo "${NEEDS_JSON}" > /tmp/needs_context.json
JOB_STATUS=$(python3 ./script/actions_utils/actions_combine_status.py \
--needs_context_json /tmp/needs_context.json)
echo "JOB_STATUS=${JOB_STATUS}" >> "$GITHUB_ENV"
- name: Slack Notification
if: ${{ always() }}
continue-on-error: true
uses: rtCamp/action-slack-notify@b24d75fe0e728a4bf9fc42ee217caa686d141ee8
env:
SLACK_CHANNEL: ${{ secrets.SLACK_CHANNEL }}
SLACK_ICON: https://pbs.twimg.com/profile_images/1274014582265298945/OjBKP9kn_400x400.png
SLACK_COLOR: ${{ env.JOB_STATUS || 'failure' }}
SLACK_MESSAGE: "Full run of use case examples finished with status ${{ env.JOB_STATUS || 'failure' }} \
(${{ env.ACTION_RUN_URL }})\n\
- start-runner-linux: ${{ needs.start-runner-linux.result || 'Did not run.'}}\n\n\
- run-use-case-examples: ${{ needs.run-use-case-examples.result || 'Did not run.' }}\n\n\
- stop-runner-linux: ${{ needs.stop-runner-linux.result || 'Did not run.'}}"
SLACK_USERNAME: ${{ secrets.BOT_USERNAME }}
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
39 changes: 9 additions & 30 deletions script/make_utils/run_use_case_examples.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,6 @@ set -e

DIR=$(dirname "$0")

# shellcheck disable=SC1090,SC1091
source "${DIR}/detect_docker.sh"

if isDocker; then
echo "Can not run in docker -> this script needs to install new virtualenvs"
exit 1
fi


CML_DIR=$(pwd)
USE_CASE_REL_DIR="use_case_examples"
USE_CASE_DIR="${CML_DIR}/${USE_CASE_REL_DIR}"
Expand All @@ -21,9 +12,8 @@ if [ ! -d "$USE_CASE_DIR" ]; then
exit 1
fi

echo "Refreshing notebooks with PIP installed Concrete ML"
echo "Running notebooks with PIP installed Concrete ML"

# shellcheck disable=SC2143
if [[ $(git ls-files --others --exclude-standard | grep ${USE_CASE_REL_DIR}) ]]; then
echo "This script must be run in a clean clone of the Concrete ML repo"
echo "This directory has untracked files in ${USE_CASE_REL_DIR}"
Expand Down Expand Up @@ -51,14 +41,6 @@ else
fi
fi

if [ ! "$(docker images -q zamafhe/concrete-ml:latest 2> /dev/null)" ]; then
# BUILD THE DOCKER IMAGE
echo "Building docker image"
poetry build && mkdir -p pkg && cp dist/* pkg/ && make release_docker
docker tag concrete-ml-release:latest zamafhe/concrete-ml:latest
fi

# shellcheck disable=SC2068
for EXAMPLE in ${LIST_OF_USE_CASES[@]}
do
EXAMPLE_NAME=$(basename "${EXAMPLE}")
Expand All @@ -75,52 +57,49 @@ do
echo " - VirtualEnv already exists, deleting the old one"
rm -rf "$VENV_PATH"
fi
virtualenv -q "$VENV_PATH"
python3 -m venv "$VENV_PATH"
echo " - VirtualEnv created at $VENV_PATH"
# shellcheck disable=SC1090,SC1091
source "${VENV_PATH}/bin/activate"
# Install Concrete ML
set +e
cd "$CML_DIR"
pip install -e . &> "/tmp/log_cml_pip_${EXAMPLE_NAME}"
pip install -U pip setuptools wheel
pip install -e .
hresult=$?
if [ $hresult -ne 0 ]; then
echo "Could not install Concrete ML in the virtualenv, see /tmp/log_cml_pip_${EXAMPLE_NAME}"
rm -rf "$VENV_PATH"
continue
fi
set -e
echo " - Concrete ML installed in $VENV_PATH"

# Install example requirements
cd "$EXAMPLE"
if [ -f "requirements.txt" ]; then
set +e
pip install -r requirements.txt &> "/tmp/log_reqs_${EXAMPLE_NAME}"
pip install -r requirements.txt
hresult=$?
set -e
if [ $hresult -ne 0 ]; then
echo "Could not install Concrete ML in the virtualenv, see /tmp/log_reqs_${EXAMPLE_NAME}"
echo "Could not install example requirements in the virtualenv, see /tmp/log_reqs_${EXAMPLE_NAME}"
rm -rf "$VENV_PATH"
continue
fi
echo " - Requirements installed in $VENV_PATH"
fi

set +e
# Strip colors from the error output before piping to the log files
# Strip colors from the error output before piping to the log files
# Swap stderr and stdout, all output of jupyter execution is in stderr
# The information about time spent running the notebook is in stdout
# The following will pipe the stderr to the regex so that it
# ends up in the log file.
# The timing shows in the terminal
USE_CASE_DIR=$USE_CASE_DIR make 3>&2 2>&1 1>&3- | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' > "/tmp/log_${EXAMPLE_NAME}"
USE_CASE_DIR=$USE_CASE_DIR make 3>&2 2>&1 1>&3- | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g'

# Neet to check the result of execution of the make command (ignore the results
# of the other commands in the pipe)
hresult="${PIPESTATUS[0]}"
if [ "$hresult" -ne 0 ]; then
echo "Error while running example ${EXAMPLE_NAME} see /tmp/log_${EXAMPLE_NAME}"
echo "Error while running example ${EXAMPLE_NAME}"
fi
set -e

Expand Down

0 comments on commit 49f5aaa

Please sign in to comment.