Skip to content

Commit a5ccd6d

Browse files
committed
update uploading workflow
1 parent d5657df commit a5ccd6d

File tree

6 files changed

+103
-21
lines changed

6 files changed

+103
-21
lines changed

.github/workflows/upload_benchmark_results.yml

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
name: Upload SDGym Benchmark results
22

33
on:
4+
push:
5+
branches:
6+
- issue-425-workflow-sdgym
47
workflow_run:
58
workflows: ["Run SDGym Benchmark"]
69
types:
@@ -28,10 +31,37 @@ jobs:
2831
2932
- name: Upload SDGym Benchmark
3033
env:
31-
SLACK_TOKEN: ${{ secrets.SLACK_TOKEN }}
3234
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
3335
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
3436
AWS_DEFAULT_REGION: ${{ secrets.AWS_REGION }}
35-
37+
GITHUB_LOCAL_RESULTS_DIR: ${{ runner.temp }}/sdgym-leaderboard-files
38+
3639
run: |
3740
invoke upload-benchmark-results
41+
- name: Create pull request for SDGym benchmark result
42+
id: create_pr
43+
if: env.SKIP_UPLOAD != 'true'
44+
uses: peter-evans/create-pull-request@v4
45+
with:
46+
token: ${{ secrets.GH_ACCESS_TOKEN }}
47+
commit-message: "Upload SDGym Benchmark Results (${{ env.FOLDER_NAME }})"
48+
author: "github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>"
49+
committer: "github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>"
50+
title: "Upload SDGym Benchmark Results - ${{ env.FOLDER_NAME }}"
51+
body: |
52+
This is an **auto-generated PR** for uploading SDGym benchmark latest results.
53+
54+
branch: sdgym-benchmark-upload
55+
branch-suffix: short-commit-hash
56+
base: gatsby-home
57+
58+
- name: Send Slack notification
59+
if: env.SKIP_UPLOAD != 'true'
60+
env:
61+
SLACK_TOKEN: ${{ secrets.SLACK_TOKEN }}
62+
63+
run: |
64+
invoke notify-sdgym-benchmark-uploaded \
65+
--folder-name ${{ env.FOLDER_NAME }} \
66+
--pr-url "${{ steps.create_pr.outputs.pull-request-url }}"
67+

sdgym/result_writer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ def write_yaml(self, data, file_path, append=False):
3333
class LocalResultsWriter(ResultsWriter):
3434
"""Results writer for local file system."""
3535

36-
def write_dataframe(self, data, file_path, append=False):
36+
def write_dataframe(self, data, file_path, append=False, index=False):
3737
"""Write a DataFrame to a CSV file."""
3838
file_path = Path(file_path)
3939
if file_path.exists() and append:
40-
data.to_csv(file_path, mode='a', index=False, header=False)
40+
data.to_csv(file_path, mode='a', index=index, header=False)
4141
else:
4242
data.to_csv(file_path, mode='w', index=False)
4343

sdgym/run_benchmark/upload_benchmark_results.py

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import boto3
99
from botocore.exceptions import ClientError
1010

11-
from sdgym.result_writer import S3ResultsWriter
11+
from sdgym.result_writer import LocalResultsWriter, S3ResultsWriter
1212
from sdgym.run_benchmark.utils import OUTPUT_DESTINATION_AWS
1313
from sdgym.s3 import S3_REGION, parse_s3_path
1414
from sdgym.sdgym_result_explorer.result_explorer import SDGymResultsExplorer
@@ -62,7 +62,7 @@ def get_result_folder_name_and_s3_vars(aws_access_key_id, aws_secret_access_key)
6262

6363

6464
def upload_results(
65-
aws_access_key_id, aws_secret_access_key, folder_name, s3_client, bucket, prefix
65+
aws_access_key_id, aws_secret_access_key, folder_name, s3_client, bucket, prefix, github_env
6666
):
6767
"""Upload benchmark results to S3."""
6868
result_explorer = SDGymResultsExplorer(
@@ -71,16 +71,31 @@ def upload_results(
7171
aws_secret_access_key=aws_secret_access_key,
7272
)
7373
result_writer = S3ResultsWriter(s3_client)
74-
74+
local_results_writer = LocalResultsWriter()
7575
if not result_explorer.all_runs_complete(folder_name):
7676
LOGGER.warning(f'Run {folder_name} is not complete yet. Exiting.')
77+
if github_env:
78+
with open(github_env, 'a') as env_file:
79+
env_file.write('SKIP_UPLOAD=true\n')
80+
7781
sys.exit(0)
82+
else:
83+
LOGGER.info(f'Run {folder_name} is complete! Proceeding with summarization...')
84+
if github_env:
85+
with open(github_env, 'a') as env_file:
86+
env_file.write('SKIP_UPLOAD=false\n')
87+
env_file.write(f'FOLDER_NAME={folder_name}\n')
7888

79-
LOGGER.info(f'Run {folder_name} is complete! Proceeding with summarization...')
8089
summary, _ = result_explorer.summarize(folder_name)
8190
result_writer.write_dataframe(
8291
summary, f'{OUTPUT_DESTINATION_AWS}{folder_name}/{folder_name}_summary.csv', index=True
8392
)
93+
local_export_dir = os.environ.get('GITHUB_LOCAL_RESULTS_DIR')
94+
if local_export_dir:
95+
local_results_writer.write_dataframe(
96+
summary, f'{local_export_dir}/{folder_name}_summary.csv', index=True
97+
)
98+
8499
write_uploaded_marker(s3_client, bucket, prefix, folder_name)
85100

86101

@@ -91,11 +106,18 @@ def main():
91106
folder_name, s3_client, bucket, prefix = get_result_folder_name_and_s3_vars(
92107
aws_access_key_id, aws_secret_access_key
93108
)
109+
github_env = os.environ.get('GITHUB_ENV')
94110
if upload_already_done(s3_client, bucket, prefix, folder_name):
95111
LOGGER.warning('Benchmark results have already been uploaded. Exiting.')
112+
if github_env:
113+
with open(github_env, 'a') as env_file:
114+
env_file.write('SKIP_UPLOAD=true\n')
115+
96116
sys.exit(0)
97117

98-
upload_results(aws_access_key_id, aws_secret_access_key, folder_name, s3_client, bucket, prefix)
118+
upload_results(
119+
aws_access_key_id, aws_secret_access_key, folder_name, s3_client, bucket, prefix, github_env
120+
)
99121

100122

101123
if __name__ == '__main__':

sdgym/run_benchmark/utils.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,17 +68,20 @@ def post_benchmark_launch_message(date_str):
6868
bucket, prefix = parse_s3_path(OUTPUT_DESTINATION_AWS)
6969
url_link = get_s3_console_link(bucket, f'{prefix}{folder_name}/')
7070
body = '🏃 SDGym benchmark has been launched! EC2 Instances are running. '
71-
body += f'Intermediate results can be found <<{url_link} |here>.\n'
71+
body += f'Intermediate results can be found <{url_link} |here>.\n'
7272
post_slack_message(channel, body)
7373

7474

75-
def post_run_summary(folder_name):
76-
"""Post run summary to sdv-alerts slack channel."""
75+
def post_benchmark_uploaded_message(folder_name, pr_url=None):
76+
"""Post benchmark uploaded message to sdv-alerts slack channel."""
7777
channel = DEBUG_SLACK_CHANNEL
7878
bucket, prefix = parse_s3_path(OUTPUT_DESTINATION_AWS)
7979
url_link = get_s3_console_link(bucket, f'{prefix}{folder_name}/{folder_name}_summary.csv')
80-
body = ''
81-
body += f'🤸🏻‍♀️ SDGym benchmark results for {folder_name} are available!🏋️‍♀️ \n'
82-
body += f'Check the results <<{url_link} |here>.\n'
80+
body = (
81+
f'🤸🏻‍♀️ SDGym benchmark results for *{folder_name}* are available! 🏋️‍♀️\n'
82+
f'Check the results <{url_link} |here>.\n'
83+
)
84+
if pr_url:
85+
body += f'Waiting on merging this PR to update GitHub directory: <{pr_url}|PR Link>\n'
8386

8487
post_slack_message(channel, body)

tasks.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from invoke import task
1111
from packaging.requirements import Requirement
1212
from packaging.version import Version
13-
13+
from sdgym.run_benchmark.utils import post_benchmark_uploaded_message
1414
COMPARISONS = {'>=': operator.ge, '>': operator.gt, '<': operator.lt, '<=': operator.le}
1515
EGG_STRING = '#egg='
1616

@@ -209,6 +209,11 @@ def run_sdgym_benchmark(c):
209209
c.run('python sdgym/run_benchmark/run_benchmark.py')
210210

211211
@task
212-
def upload_benchmark_results(c, date=None):
212+
def upload_benchmark_results(c):
213213
"""Upload the benchmark results to S3."""
214-
c.run(f'python sdgym/run_benchmark/upload_benchmark_results.py {date}')
214+
c.run(f'python sdgym/run_benchmark/upload_benchmark_results.py')
215+
216+
@task
217+
def notify_sdgym_benchmark_uploaded(c, folder_name, pr_url=None):
218+
"""Notify Slack about the SDGym benchmark upload."""
219+
post_benchmark_uploaded_message(folder_name, pr_url)

tests/unit/run_benchmark/test_upload_benchmark_result.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,11 @@ def test_get_result_folder_name_and_s3_vars(
101101
@patch('sdgym.run_benchmark.upload_benchmark_results.write_uploaded_marker')
102102
@patch('sdgym.run_benchmark.upload_benchmark_results.LOGGER')
103103
@patch('sdgym.run_benchmark.upload_benchmark_results.OUTPUT_DESTINATION_AWS')
104+
@patch('sdgym.run_benchmark.upload_benchmark_results.LocalResultsWriter')
105+
@patch('sdgym.run_benchmark.upload_benchmark_results.os.environ.get')
104106
def test_upload_results(
107+
mock_os_environ_get,
108+
mock_local_results_writer,
105109
mock_output_destination_aws,
106110
mock_logger,
107111
mock_write_uploaded_marker,
@@ -119,9 +123,18 @@ def test_upload_results(
119123
result_explorer_instance = mock_sdgym_results_explorer.return_value
120124
result_explorer_instance.all_runs_complete.return_value = True
121125
result_explorer_instance.summarize.return_value = ('summary', 'results')
126+
mock_os_environ_get.return_value = '/tmp/sdgym_results'
122127

123128
# Run
124-
upload_results(aws_access_key_id, aws_secret_access_key, run_name, s3_client, bucket, prefix)
129+
upload_results(
130+
aws_access_key_id,
131+
aws_secret_access_key,
132+
run_name,
133+
s3_client,
134+
bucket,
135+
prefix,
136+
github_env=None,
137+
)
125138

126139
# Assert
127140
mock_logger.info.assert_called_once_with(
@@ -136,6 +149,9 @@ def test_upload_results(
136149
result_explorer_instance.summarize.assert_called_once_with(run_name)
137150
mock_s3_results_writer.return_value.write_dataframe.assert_called_once()
138151
mock_write_uploaded_marker.assert_called_once_with(s3_client, bucket, prefix, run_name)
152+
mock_local_results_writer.return_value.write_dataframe.assert_called_once_with(
153+
'summary', '/tmp/sdgym_results/SDGym_results_10_01_2023_summary.csv', index=True
154+
)
139155

140156

141157
@patch('sdgym.run_benchmark.upload_benchmark_results.SDGymResultsExplorer')
@@ -165,7 +181,13 @@ def test_upload_results_not_all_runs_complete(
165181
# Run
166182
with pytest.raises(SystemExit, match='0'):
167183
upload_results(
168-
aws_access_key_id, aws_secret_access_key, run_name, s3_client, bucket, prefix
184+
aws_access_key_id,
185+
aws_secret_access_key,
186+
run_name,
187+
s3_client,
188+
bucket,
189+
prefix,
190+
github_env=None,
169191
)
170192

171193
# Assert
@@ -247,5 +269,5 @@ def test_main(
247269
)
248270
mock_upload_already_done.assert_called_once_with('s3_client', 'bucket', 'prefix', 'run_name')
249271
mock_upload_results.assert_called_once_with(
250-
'my_access_key', 'my_secret_key', 'run_name', 's3_client', 'bucket', 'prefix'
272+
'my_access_key', 'my_secret_key', 'run_name', 's3_client', 'bucket', 'prefix', None
251273
)

0 commit comments

Comments
 (0)