Skip to content

Commit a57067c

Browse files
committed
update email content; fix #15; fix #16
1 parent 608dea6 commit a57067c

3 files changed

Lines changed: 132 additions & 60 deletions

File tree

.github/scripts/mailgun.sh

Lines changed: 14 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,54 +8,38 @@ if [[ $# -ne 1 ]]; then
88
fi
99

1010
ARTIFACT_DIR="$1"
11-
REPORT_CSV="${ARTIFACT_DIR}/report.csv"
1211
REPORT_HTML="${ARTIFACT_DIR}/report.html"
1312
RERUN_REPORT_HTML="${ARTIFACT_DIR}/rerun-report.html"
1413
LOG_FILE="${ARTIFACT_DIR}/run.log"
15-
RUN_NAME="${RUN_NAME:-}"
16-
RUN_DATE="$(date +%Y-%m-%d)"
17-
PUBARCHIVER_STATUS="${PUBARCHIVER_STATUS:-0}"
18-
VALIDATION_ERRORS="${VALIDATION_ERRORS:-0}"
19-
CURL_STATUS="${CURL_STATUS:-0}"
20-
21-
# Determine subject and recipient based on failures
22-
if [[ $PUBARCHIVER_STATUS != '0' ]] || [[ $VALIDATION_ERRORS != '0' ]] || [[ $CURL_STATUS != '0' ]]; then
23-
EMAIL_TO="${EMAIL_FAILURE:-}"
24-
if [[ $PUBARCHIVER_STATUS != '0' ]]; then
25-
SUBJECT="${RUN_NAME} failed: pubarchiver error"
26-
elif [[ $VALIDATION_ERRORS != '0' ]]; then
27-
SUBJECT="${RUN_NAME} failed: ${VALIDATION_ERRORS} articles with validation errors"
28-
else
29-
SUBJECT="${RUN_NAME} failed: FTP upload error"
30-
fi
31-
else
32-
EMAIL_TO="${EMAIL_SUCCESS:-}"
33-
SUBJECT="${RUN_NAME} results for ${RUN_DATE}"
34-
fi
14+
EMAIL_TO="${EMAIL_TO:-}"
15+
EMAIL_SUBJECT="${EMAIL_SUBJECT:-}"
16+
EMAIL_BODY_B64="${EMAIL_BODY_B64:-}"
3517

3618
# Ensure we have an email address
3719
if [[ -z "$EMAIL_TO" ]]; then
3820
echo "No email recipient configured; skipping email" >&2
3921
exit 0
4022
fi
4123

24+
# Decode email body from base64
25+
EMAIL_BODY=$(echo "$EMAIL_BODY_B64" | base64 -d)
26+
4227
# Build curl command with attachments
43-
CURL_CMD="curl -s --user \"api:${MAILGUN_API_KEY}\" \
44-
https://api.mailgun.net/v3/${MAILGUN_DOMAIN}/messages \
45-
-F from='PubArchiver <no-reply@${MAILGUN_DOMAIN}>' \
46-
-F to=\"$EMAIL_TO\" \
47-
-F subject=\"$SUBJECT\""
28+
CURL_CMD="curl -s --user \"api:${MAILGUN_API_KEY}\" \\
29+
https://api.mailgun.net/v3/${MAILGUN_DOMAIN}/messages \\
30+
-F from='PubArchiver <no-reply@${MAILGUN_DOMAIN}>' \\
31+
-F to=\"$EMAIL_TO\" \\
32+
-F subject=\"$EMAIL_SUBJECT\""
4833

49-
# Add text body
50-
CURL_CMD="$CURL_CMD -F text='${RUN_NAME} completed. See attached reports and logs.'"
34+
# Add text body (using printf to handle special characters safely)
35+
CURL_CMD="$CURL_CMD -F text=@-"
5136

5237
# Add attachments if they exist
5338
[[ -f "$LOG_FILE" ]] && CURL_CMD="$CURL_CMD -F attachment=@$LOG_FILE"
54-
[[ -f "$REPORT_CSV" ]] && CURL_CMD="$CURL_CMD -F attachment=@$REPORT_CSV"
5539
[[ -f "$REPORT_HTML" ]] && CURL_CMD="$CURL_CMD -F attachment=@$REPORT_HTML"
5640
[[ -f "$RERUN_REPORT_HTML" ]] && CURL_CMD="$CURL_CMD -F attachment=@$RERUN_REPORT_HTML"
5741

58-
eval "$CURL_CMD" || {
42+
printf '%s' "$EMAIL_BODY" | eval "$CURL_CMD" || {
5943
echo "Failed to send email via Mailgun" >&2
6044
exit 1
6145
}

.github/workflows/archive-in-portico.yml

Lines changed: 63 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -107,21 +107,34 @@ jobs:
107107
echo "=== Running pubarchiver on past failures ===" | tee "$ARTIFACT_DIR/run.log"
108108
# Note the use of -Z to prevent zip'ing the final results.
109109
pubarchiver -j micropublication -d portico -Z -C -f "$FAILURES_FILE" \
110-
-o "$ARTIFACT_DIR" -r "$ARTIFACT_DIR/report.csv" -s csv,html \
111-
-t "Past_failures_retried" -@ "$ARTIFACT_DIR/debug.log" 2>&1 | tee -a "$ARTIFACT_DIR/run.log"
110+
-o "$ARTIFACT_DIR" -r "$ARTIFACT_DIR/report" -s csv,html \
111+
-t "Past failures retried" -@ "$ARTIFACT_DIR/debug.log" 2>&1 | tee -a "$ARTIFACT_DIR/run.log"
112112
[[ -f "$ARTIFACT_DIR/report.html" ]] && mv "$ARTIFACT_DIR/report.html" "$ARTIFACT_DIR/rerun-report.html"
113113
fi
114+
RETRY_REPORT="$ARTIFACT_DIR/report.csv"
115+
RETRY_COUNT=0
116+
if [[ -f "$RETRY_REPORT" ]]; then
117+
RETRY_COUNT=$(($(wc -l < "$RETRY_REPORT") - 1))
118+
fi
119+
echo "RETRY_COUNT=$RETRY_COUNT" >> "$GITHUB_ENV"
114120
115121
- name: Run pubarchiver for new articles
116122
run: |
117123
TODAY=$(date +%Y-%m-%d)
118124
echo "" | tee -a "$ARTIFACT_DIR/run.log"
119125
echo "=== Running pubarchiver for new articles ===" | tee -a "$ARTIFACT_DIR/run.log"
120126
pubarchiver -j micropublication -d portico -C -a "${{ env.AFTER_DATE }}" \
121-
-o "$ARTIFACT_DIR" -r "$ARTIFACT_DIR/latest-report.csv" \
127+
-o "$ARTIFACT_DIR" -r "$ARTIFACT_DIR/latest-report" \
122128
-s csv,html -t "$TODAY" -@ "$ARTIFACT_DIR/latest-debug.log" 2>&1 | tee -a "$ARTIFACT_DIR/run.log"
123129
status=${PIPESTATUS[0]}
124130
echo "PUBARCHIVER_STATUS=$status" >> "$GITHUB_ENV"
131+
[[ -f "$ARTIFACT_DIR/latest-report.html" ]] && mv "$ARTIFACT_DIR/latest-report.html" "$ARTIFACT_DIR/report.html"
132+
LATEST_REPORT="$ARTIFACT_DIR/latest-report.csv"
133+
NEW_COUNT=0
134+
if [[ -f "$LATEST_REPORT" ]]; then
135+
NEW_COUNT=$(($(wc -l < "$LATEST_REPORT") - 1))
136+
fi
137+
echo "NEW_COUNT=$NEW_COUNT" >> "$GITHUB_ENV"
125138
# Combine reports
126139
tail -n +2 "$ARTIFACT_DIR/latest-report.csv" >> "$ARTIFACT_DIR/report.csv"
127140
tail "$ARTIFACT_DIR/latest-debug.log" >> "$ARTIFACT_DIR/debug.log"
@@ -132,15 +145,21 @@ jobs:
132145
grep -i "missing," "$ARTIFACT_DIR/report.csv" | cut -f2 -d',' > "$STATE_DIR/last-failures" || true
133146
echo "TODAY=$TODAY" >> "$GITHUB_ENV"
134147
135-
- name: Evaluate report and failures
148+
- name: Evaluate report and counts
136149
run: |
137150
set -euo pipefail
138151
REPORT="$ARTIFACT_DIR/report.csv"
139152
VALIDATION_ERRORS=0
153+
COMPLETE_COUNT=0
154+
TOTAL_LINES=0
140155
if [[ -f "$REPORT" ]]; then
141156
VALIDATION_ERRORS=$(grep -Eci "validation|missing|failed" "$REPORT" || true)
157+
COMPLETE_COUNT=$(grep -c "complete" "$REPORT" || true)
158+
TOTAL_LINES=$(wc -l < "$REPORT")
142159
fi
143160
echo "VALIDATION_ERRORS=$VALIDATION_ERRORS" >> "$GITHUB_ENV"
161+
echo "COMPLETE_COUNT=$COMPLETE_COUNT" >> "$GITHUB_ENV"
162+
echo "TOTAL_LINES=$TOTAL_LINES" >> "$GITHUB_ENV"
144163
145164
- name: Upload to Portico FTP
146165
if: ${{ env.PUBARCHIVER_STATUS == '0' && env.VALIDATION_ERRORS == '0' }}
@@ -183,16 +202,52 @@ jobs:
183202
git commit -m "🤖 update archive-in-portico state files"
184203
git push origin HEAD:${{ github.ref }}
185204
186-
- name: Send email report
205+
- name: Set email variables
187206
if: always()
188207
env:
189208
EMAIL_FAILURE: ${{ vars.EMAIL_FAILURE }}
190209
EMAIL_SUCCESS: ${{ vars.EMAIL_SUCCESS }}
191-
MAILGUN_API_KEY: ${{ secrets.MAILGUN_API_KEY }}
192-
MAILGUN_DOMAIN: ${{ vars.MAILGUN_DOMAIN }}
193-
RUN_NAME: "Portico archiving"
210+
COMPLETE_COUNT: ${{ env.COMPLETE_COUNT }}
211+
TOTAL_LINES: ${{ env.TOTAL_LINES }}
212+
TODAY: ${{ env.TODAY }}
213+
PUBARCHIVER_STATUS: ${{ env.PUBARCHIVER_STATUS }}
194214
VALIDATION_ERRORS: ${{ env.VALIDATION_ERRORS }}
195215
CURL_STATUS: ${{ env.CURL_STATUS }}
216+
run: |
217+
if [[ $PUBARCHIVER_STATUS != '0' ]] || [[ $VALIDATION_ERRORS != '0' ]] || [[ $CURL_STATUS != '0' ]]; then
218+
EMAIL_TO="${EMAIL_FAILURE:-}"
219+
if [[ $PUBARCHIVER_STATUS != '0' ]]; then
220+
SUBJECT="Portico upload failed: pubarchiver error"
221+
elif [[ $VALIDATION_ERRORS != '0' ]]; then
222+
SUBJECT="Portico upload failed: ${VALIDATION_ERRORS} articles with validation errors"
223+
else
224+
SUBJECT="Portico upload failed: FTP upload error"
225+
fi
226+
else
227+
EMAIL_TO="${EMAIL_SUCCESS:-}"
228+
SUBJECT="Portico archiving: ${COMPLETE_COUNT} total articles on ${TODAY}"
229+
fi
230+
if [[ $TOTAL_LINES -le 1 ]]; then
231+
BODY="No new articles were uploaded to Portico."
232+
rm -f "$ARTIFACT_DIR/report*"
233+
else
234+
BODY="Past failures retried: ${RETRY_COUNT}"
235+
BODY+=$'\n'"New articles: ${NEW_COUNT}"
236+
BODY+=$'\n\n'"$(cat "$ARTIFACT_DIR/report.csv")"
237+
rm -f "$ARTIFACT_DIR/report.csv"
238+
fi
239+
echo "EMAIL_TO=$EMAIL_TO" >> "$GITHUB_ENV"
240+
echo "EMAIL_SUBJECT=$SUBJECT" >> "$GITHUB_ENV"
241+
echo "EMAIL_BODY_B64=$(echo "$BODY" | base64 -w 0)" >> "$GITHUB_ENV"
242+
243+
- name: Send email report
244+
if: always()
245+
env:
246+
MAILGUN_API_KEY: ${{ secrets.MAILGUN_API_KEY }}
247+
MAILGUN_DOMAIN: ${{ vars.MAILGUN_DOMAIN }}
248+
EMAIL_TO: ${{ env.EMAIL_TO }}
249+
EMAIL_SUBJECT: ${{ env.EMAIL_SUBJECT }}
250+
EMAIL_BODY_B64: ${{ env.EMAIL_BODY_B64 }}
196251
run: |
197252
bash .github/scripts/mailgun.sh "${{ env.ARTIFACT_DIR }}"
198253

.github/workflows/upload-to-pmc.yml

Lines changed: 55 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ jobs:
107107
TODAY=$(date +%Y-%m-%d)
108108
echo "=== Running pubarchiver for new articles ===" | tee "$ARTIFACT_DIR/run.log"
109109
pubarchiver -j micropublication -d pmc -C -a "$AFTER_DATE" \
110-
-o "$ARTIFACT_DIR" -r "$ARTIFACT_DIR/report.csv" \
110+
-o "$ARTIFACT_DIR" -r "$ARTIFACT_DIR/report" \
111111
-s csv,html -t "$TODAY" -@ "$ARTIFACT_DIR/debug.log" 2>&1 | tee -a "$ARTIFACT_DIR/run.log"
112112
status=${PIPESTATUS[0]}
113113
echo "PUBARCHIVER_STATUS=$status" >> "$GITHUB_ENV"
@@ -168,37 +168,52 @@ jobs:
168168
git commit -m "🤖 update upload-to-pmc state files"
169169
git push origin HEAD:${{ github.ref }}
170170
171-
- name: Send email report
171+
- name: Set email variables
172172
if: always()
173173
env:
174174
EMAIL_FAILURE: ${{ vars.EMAIL_FAILURE }}
175175
EMAIL_SUCCESS: ${{ vars.EMAIL_SUCCESS }}
176-
MAILGUN_API_KEY: ${{ secrets.MAILGUN_API_KEY }}
177-
MAILGUN_DOMAIN: ${{ vars.MAILGUN_DOMAIN }}
178-
RUN_NAME: "PMC upload"
176+
COMPLETE_COUNT: ${{ env.COMPLETE_COUNT }}
177+
TOTAL_LINES: ${{ env.TOTAL_LINES }}
178+
TODAY: ${{ env.TODAY }}
179179
PUBARCHIVER_STATUS: ${{ env.PUBARCHIVER_STATUS }}
180180
VALIDATION_ERRORS: ${{ env.VALIDATION_ERRORS }}
181181
CURL_STATUS: ${{ env.CURL_STATUS }}
182182
run: |
183-
bash .github/scripts/mailgun.sh "${{ env.ARTIFACT_DIR }}"
184-
185-
- name: Fail if pubarchiver errored
186-
if: ${{ env.PUBARCHIVER_STATUS != '0' }}
187-
run: |
188-
echo "pubarchiver exited with status ${PUBARCHIVER_STATUS}" >&2
189-
exit 1
190-
191-
- name: Fail if validation errors found
192-
if: ${{ env.PUBARCHIVER_STATUS == '0' && env.VALIDATION_ERRORS != '0' }}
193-
run: |
194-
echo "Validation or missing/failed entries detected: ${VALIDATION_ERRORS}" >&2
195-
exit 1
183+
if [[ $PUBARCHIVER_STATUS != '0' ]] || [[ $VALIDATION_ERRORS != '0' ]] || [[ $CURL_STATUS != '0' ]]; then
184+
EMAIL_TO="${EMAIL_FAILURE:-}"
185+
if [[ $PUBARCHIVER_STATUS != '0' ]]; then
186+
SUBJECT="PMC upload failed: pubarchiver error"
187+
elif [[ $VALIDATION_ERRORS != '0' ]]; then
188+
SUBJECT="PMC upload failed: ${VALIDATION_ERRORS} articles with validation errors"
189+
else
190+
SUBJECT="PMC upload failed: FTP upload error"
191+
fi
192+
else
193+
EMAIL_TO="${EMAIL_SUCCESS:-}"
194+
SUBJECT="PMC upload: ${COMPLETE_COUNT} total articles on ${TODAY}"
195+
fi
196+
if [[ $TOTAL_LINES -le 1 ]]; then
197+
BODY="No new articles were uploaded to PMC."
198+
rm -f "$ARTIFACT_DIR/report*"
199+
else
200+
BODY="$(cat "$ARTIFACT_DIR/report.csv")"
201+
rm -f "$ARTIFACT_DIR/report.csv"
202+
fi
203+
echo "EMAIL_TO=$EMAIL_TO" >> "$GITHUB_ENV"
204+
echo "EMAIL_SUBJECT=$SUBJECT" >> "$GITHUB_ENV"
205+
echo "EMAIL_BODY_B64=$(echo "$BODY" | base64 -w 0)" >> "$GITHUB_ENV"
196206
197-
- name: Fail if curl upload failed
198-
if: ${{ env.PUBARCHIVER_STATUS == '0' && env.VALIDATION_ERRORS == '0' && env.CURL_STATUS != '0' }}
207+
- name: Send email report
208+
if: always()
209+
env:
210+
MAILGUN_API_KEY: ${{ secrets.MAILGUN_API_KEY }}
211+
MAILGUN_DOMAIN: ${{ vars.MAILGUN_DOMAIN }}
212+
EMAIL_TO: ${{ env.EMAIL_TO }}
213+
EMAIL_SUBJECT: ${{ env.EMAIL_SUBJECT }}
214+
EMAIL_BODY_B64: ${{ env.EMAIL_BODY_B64 }}
199215
run: |
200-
echo "Curl FTP upload to PMC failed with status ${CURL_STATUS}" >&2
201-
exit 1
216+
bash .github/scripts/mailgun.sh "${{ env.ARTIFACT_DIR }}"
202217
203218
- name: Install slack-cli
204219
if: always()
@@ -224,3 +239,21 @@ jobs:
224239
with:
225240
path: ${{ env.ARTIFACT_DIR }}
226241
compression-level: 9
242+
243+
- name: Fail if pubarchiver errored
244+
if: ${{ env.PUBARCHIVER_STATUS != '0' }}
245+
run: |
246+
echo "pubarchiver exited with status ${PUBARCHIVER_STATUS}" >&2
247+
exit 1
248+
249+
- name: Fail if validation errors found
250+
if: ${{ env.PUBARCHIVER_STATUS == '0' && env.VALIDATION_ERRORS != '0' }}
251+
run: |
252+
echo "Validation or missing/failed entries detected: ${VALIDATION_ERRORS}" >&2
253+
exit 1
254+
255+
- name: Fail if curl upload failed
256+
if: ${{ env.PUBARCHIVER_STATUS == '0' && env.VALIDATION_ERRORS == '0' && env.CURL_STATUS != '0' }}
257+
run: |
258+
echo "Curl FTP upload to PMC failed with status ${CURL_STATUS}" >&2
259+
exit 1

0 commit comments

Comments
 (0)