@@ -75,32 +75,105 @@ while read -r run; do
75
75
job_log=run-" ${database_id} " -job-" ${job_database_id} " -" ${job_name} " .log
76
76
if [[ ! -f " ${job_log} " ]]; then
77
77
echo " Fetching log for: ${job_name} (${job_database_id} , ${job_url} )"
78
- # Example log (partial).
79
- # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:18.4063489Z ##[group]Run # Artifacts are not available after rerunning a job,
80
- # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:18.4063872Z # Artifacts are not available after rerunning a job,
81
- # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:18.4064188Z # so we need to print the test stats to the log.
82
- # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:18.4064642Z go run ./scripts/ci-report/main.go gotests.json | tee gotests_stats.json
83
- # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:18.4110112Z shell: /usr/bin/bash -e {0}
84
- # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:18.4110364Z ##[endgroup]
85
- # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:19.3440469Z {
86
- # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:19.3441078Z "packages": [
87
- # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:19.3441448Z {
88
- # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:19.3442927Z "name": "agent",
89
- # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:19.3443311Z "time": 17.538
90
- # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:19.3444048Z },
91
- # ...
92
- gh run view --job " ${job_database_id} " --log > " ${job_log} " || {
78
+
79
+ # Since gh run view is unreliable, we will fetch the logs via API
80
+ # instead, however, unfortunately the API does not provide the job
81
+ # name in the log output.
82
+ #
83
+ # TODO(mafredri): This would be more reliably fetched from the following URL:
84
+ # https://github.com/coder/coder/commit/${head_sha}/checks/${job_database_id}/logs/${job_step_number}
85
+ # but it requires browser-level authentication(?).
86
+ #
87
+ # Example output:
88
+ #
89
+ # 2023-04-14T05:43:34.4763012Z ##[group]Run # Artifacts are not available after rerunning a job,
90
+ # 2023-04-14T05:43:34.4763385Z # Artifacts are not available after rerunning a job,
91
+ # 2023-04-14T05:43:34.4763815Z # so we need to print the test stats to the log.
92
+ # 2023-04-14T05:43:34.4764149Z go run ./scripts/ci-report/main.go gotests.json | tee gotests_stats.json
93
+ # 2023-04-14T05:43:34.4809056Z shell: /usr/bin/bash -e {0}
94
+ # 2023-04-14T05:43:34.4809308Z ##[endgroup]
95
+ # 2023-04-14T05:43:35.5934784Z {
96
+ # 2023-04-14T05:43:35.5935419Z "packages": [
97
+ # 2023-04-14T05:43:35.5936020Z {
98
+ # 2023-04-14T05:43:35.5936585Z "name": "agent",
99
+ # 2023-04-14T05:43:35.5937105Z "time": 17.044
100
+ # 2023-04-14T05:43:35.5937631Z },
101
+ gh api " /repos/coder/coder/actions/jobs/${job_database_id} /logs" > " ${job_log} " || {
93
102
# Sometimes gh fails to extract ZIP, etc. :'(
94
103
rm -f " ${job_log} "
95
104
echo " Failed to fetch log for: ${job_name} (${job_database_id} , ${job_url} ), skipping..."
96
105
continue
97
106
}
98
- log_lines=" $( wc -l " ${job_log} " | awk ' {print $1}' ) "
99
- if [[ ${log_lines} -lt 2 ]]; then
100
- # Sometimes gh returns nothing and gives no error :'(
101
- rm -f " ${job_log} "
102
- echo " Log is empty for: ${job_name} (${job_database_id} , ${job_url} ), skipping..."
103
- continue
107
+
108
+ # Elaborate loop for finding the starting point for $job_step_name.
109
+ # We check for the first occurrence of "##[group]" which contains
110
+ # the go run command and then continue until we find the next
111
+ # "##[group]". We then print everything in between.
112
+ log_buffer=()
113
+ found_step=0
114
+ while read -r line; do
115
+ if [[ ${found_step} -eq 1 ]] && [[ ${# log_buffer[@]} -eq 0 ]]; then
116
+ if [[ ${line} == * " ##[group]" * ]]; then
117
+ break
118
+ fi
119
+ # Mimic output from gh run view.
120
+ echo " ${job_name} " $' \t ' " ${job_step_name} " $' \t ' " ${line} "
121
+ fi
122
+ if [[ ${found_step} -eq 0 ]] && [[ ${# log_buffer[@]} -eq 0 ]] && [[ ${line} != * " ##[group]" * ]]; then
123
+ continue
124
+ fi
125
+ if [[ ${line} == * " ##[group]" * ]]; then
126
+ log_buffer=(" ${line} " )
127
+ fi
128
+ if [[ ${line} == * " ##[endgroup]" * ]]; then
129
+ if [[ ${found_step} -eq 1 ]]; then
130
+ for bufline in " ${log_buffer[@]} " ; do
131
+ # Mimic output from gh run view.
132
+ echo " ${job_name} " $' \t ' " ${job_step_name} " $' \t ' " ${bufline} "
133
+ done
134
+ fi
135
+ log_buffer=()
136
+ continue
137
+ fi
138
+ if [[ ${# log_buffer[@]} -gt 0 ]]; then
139
+ log_buffer+=(" ${line} " )
140
+ fi
141
+ # If line contains go run ./scripts/ci-report/main.go gotests.json
142
+ if [[ ${line} == * " go run ./scripts/ci-report/main.go" * ]]; then
143
+ found_step=1
144
+ fi
145
+ done < " ${job_log} " > " ${job_log} .parsed"
146
+ mv " ${job_log} .parsed" " ${job_log} "
147
+
148
+ # Disable the unreliable way of fetching logs.
149
+ if false ; then
150
+ # Example log (partial).
151
+ # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:18.4063489Z ##[group]Run # Artifacts are not available after rerunning a job,
152
+ # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:18.4063872Z # Artifacts are not available after rerunning a job,
153
+ # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:18.4064188Z # so we need to print the test stats to the log.
154
+ # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:18.4064642Z go run ./scripts/ci-report/main.go gotests.json | tee gotests_stats.json
155
+ # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:18.4110112Z shell: /usr/bin/bash -e {0}
156
+ # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:18.4110364Z ##[endgroup]
157
+ # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:19.3440469Z {
158
+ # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:19.3441078Z "packages": [
159
+ # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:19.3441448Z {
160
+ # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:19.3442927Z "name": "agent",
161
+ # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:19.3443311Z "time": 17.538
162
+ # test-go (ubuntu-latest) Print test stats 2023-04-11T03:02:19.3444048Z },
163
+ # ...
164
+ gh run view --job " ${job_database_id} " --log > " ${job_log} " || {
165
+ # Sometimes gh fails to extract ZIP, etc. :'(
166
+ rm -f " ${job_log} "
167
+ echo " Failed to fetch log for: ${job_name} (${job_database_id} , ${job_url} ), skipping..."
168
+ continue
169
+ }
170
+ log_lines=" $( wc -l " ${job_log} " | awk ' {print $1}' ) "
171
+ if [[ ${log_lines} -lt 2 ]]; then
172
+ # Sometimes gh returns nothing and gives no error :'(
173
+ rm -f " ${job_log} "
174
+ echo " Log is empty for: ${job_name} (${job_database_id} , ${job_url} ), skipping..."
175
+ continue
176
+ fi
104
177
fi
105
178
fi
106
179
0 commit comments