name: Daily Benchmarks on: workflow_dispatch: env: ACTION_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} jobs: perform: name: Run Benchmarks on EC2 and Publish Results to Progress Tracker runs-on: ubuntu-20.04 steps: - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@05b148adc31e091bafbaf404f745055d4d3bc9d2 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: eu-west-3 # Europe (Paris) - name: Write SSH Key To A File run: echo "$SSH_KEY" > ~/ssh-key && chmod 400 ~/ssh-key env: SSH_KEY: ${{ secrets.BENCHMARKS_EC2_SSH_KEY }} - name: Start AMD EC2 Instance run: | aws ec2 start-instances --instance-ids ${{ secrets.BENCHMARKS_EC2_AMD_INSTANCE_ID }} - name: Wait For The AMD EC2 Instance To Get An IP Address run: | # shellcheck disable=SC2016,2026 timeout 180 bash -c 'until [[ $(aws ec2 describe-instances --instance-ids ${{ secrets.BENCHMARKS_EC2_AMD_INSTANCE_ID }} --query 'Reservations[].Instances[].PublicIpAddress' --output text) != "" ]]; do sleep 0.1; done' - name: Get Public IP Address of AMD EC2 Instance id: amd-public-ip run: echo "::set-output name=value::$(aws ec2 describe-instances --region eu-west-3 --instance-ids ${{ secrets.BENCHMARKS_EC2_AMD_INSTANCE_ID }} --query 'Reservations[].Instances[].PublicIpAddress' --output text)" - name: Hide Public IP Address of AMD EC2 Instance From GitHub Logs run: echo "::add-mask::${{ steps.amd-public-ip.outputs.value }}" - name: Wait For The AMD EC2 Instance To Accept SSH Connections run: timeout 180 bash -c 'until nc -z ${{ steps.amd-public-ip.outputs.value }} 22; do sleep 0.1; done' - name: Connect To AMD EC2 Instance, Perform Benchmarks, Publish Results uses: appleboy/ssh-action@1d1b21ca96111b1eb4c03c21c14ebb971d2200f6 with: host: ${{ steps.amd-public-ip.outputs.value }} username: ${{ secrets.BENCHMARKS_EC2_USERNAME }} key: ${{ secrets.BENCHMARKS_EC2_SSH_KEY }} command_timeout: 720m script: | cd ~/project git pull make docker_publish_measurements docker system prune -f - name: Copy AMD EC2 Instance Concrete Logs run: scp -o StrictHostKeyChecking=no -i ~/ssh-key ${{ secrets.BENCHMARKS_EC2_USERNAME }}@${{ steps.amd-public-ip.outputs.value }}:~/project/logs/latest.concrete.log ~/latest.concrete.log - name: Copy AMD EC2 Instance ML Logs run: scp -o StrictHostKeyChecking=no -i ~/ssh-key ${{ secrets.BENCHMARKS_EC2_USERNAME }}@${{ steps.amd-public-ip.outputs.value }}:~/project/logs/latest.ml.log ~/latest.ml.log - name: Stop AMD EC2 Instance if: ${{ always() }} run: | aws ec2 stop-instances --instance-ids ${{ secrets.BENCHMARKS_EC2_AMD_INSTANCE_ID }} - name: Upload Logs of AMD EC2 Instance uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 with: name: amd path: ~/latest.*.log - name: Start Intel EC2 Instance run: | aws ec2 start-instances --instance-ids ${{ secrets.BENCHMARKS_EC2_INTEL_INSTANCE_ID }} - name: Wait For The Intel EC2 Instance To Get An IP Address run: | # shellcheck disable=SC2016,2026 timeout 180 bash -c 'until [[ $(aws ec2 describe-instances --instance-ids ${{ secrets.BENCHMARKS_EC2_INTEL_INSTANCE_ID }} --query 'Reservations[].Instances[].PublicIpAddress' --output text) != "" ]]; do sleep 0.1; done' - name: Get Public IP Address of Intel EC2 Instance id: intel-public-ip run: echo "::set-output name=value::$(aws ec2 describe-instances --region eu-west-3 --instance-ids ${{ secrets.BENCHMARKS_EC2_INTEL_INSTANCE_ID }} --query 'Reservations[].Instances[].PublicIpAddress' --output text)" - name: Hide Public IP Address of Intel EC2 Instance From GitHub Logs run: echo "::add-mask::${{ steps.intel-public-ip.outputs.value }}" - name: Wait For The Intel EC2 Instance To Accept SSH Connections run: timeout 180 bash -c 'until nc -z ${{ steps.intel-public-ip.outputs.value }} 22; do sleep 0.1; done' - name: Connect To Intel EC2 Instance, Perform Benchmarks, Publish Results uses: appleboy/ssh-action@1d1b21ca96111b1eb4c03c21c14ebb971d2200f6 with: host: ${{ steps.intel-public-ip.outputs.value }} username: ${{ secrets.BENCHMARKS_EC2_USERNAME }} key: ${{ secrets.BENCHMARKS_EC2_SSH_KEY }} command_timeout: 720m script: | cd ~/project git pull make docker_publish_measurements docker system prune -f - name: Copy Intel EC2 Instance Concrete Logs run: scp -o StrictHostKeyChecking=no -i ~/ssh-key ${{ secrets.BENCHMARKS_EC2_USERNAME }}@${{ steps.intel-public-ip.outputs.value }}:~/project/logs/latest.concrete.log ~/latest.concrete.log - name: Copy Intel EC2 Instance ML Logs run: scp -o StrictHostKeyChecking=no -i ~/ssh-key ${{ secrets.BENCHMARKS_EC2_USERNAME }}@${{ steps.intel-public-ip.outputs.value }}:~/project/logs/latest.ml.log ~/latest.ml.log - name: Stop Intel EC2 Instance if: ${{ always() }} run: | aws ec2 stop-instances --instance-ids ${{ secrets.BENCHMARKS_EC2_INTEL_INSTANCE_ID }} - name: Upload Logs of Intel EC2 Instance uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 with: name: intel path: ~/latest.*.log - name: Send Slack Notification if: ${{ always() }} continue-on-error: true uses: rtCamp/action-slack-notify@12e36fc18b0689399306c2e0b3e0f2978b7f1ee7 env: SLACK_CHANNEL: ${{ secrets.SLACK_CHANNEL }} SLACK_ICON: https://pbs.twimg.com/profile_images/1274014582265298945/OjBKP9kn_400x400.png SLACK_COLOR: ${{ job.status }} SLACK_MESSAGE: "Publishing benchmarks finished with status ${{ job.status }} \ (${{ env.ACTION_RUN_URL }})" SLACK_USERNAME: ${{ secrets.BOT_USERNAME }} SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}