Skip to content
This repository was archived by the owner on Feb 24, 2025. It is now read-only.

Commit 0ba4168

Browse files
authored
Fix creating DMG images in GitHub Actions (#1185)
Task/Issue URL: https://app.asana.com/0/1203301625297703/1204523592790998/f Description: Create DMG in a separate job that’s running on macOS 12, while keeping the build pipeline on macOS 13.
1 parent 4604851 commit 0ba4168

File tree

3 files changed

+151
-37
lines changed

3 files changed

+151
-37
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
name: Upload file to Asana
2+
description: Uploads a file to an Asana task
3+
inputs:
4+
access-token:
5+
description: "Asana access token"
6+
required: true
7+
type: string
8+
file-name:
9+
description: "Name of the uploaded file"
10+
required: true
11+
type: string
12+
task-url:
13+
description: "Asana task URL"
14+
required: true
15+
type: string
16+
runs:
17+
using: "composite"
18+
steps:
19+
- run: |
20+
task_url_regex='^https://app.asana.com/[0-9]/[0-9]*/([0-9]*)/f$'
21+
if [[ "${{ inputs.task-url }}" =~ ${task_url_regex} ]]; then
22+
echo "task_id=${BASH_REMATCH[1]}" >> $GITHUB_ENV
23+
else
24+
echo "::error::Asana Task URL has incorrect format (attempted to match ${task_url_regex})."
25+
fi
26+
shell: bash
27+
- run: |
28+
curl -s "https://app.asana.com/api/1.0/tasks/${task_id}/attachments" \
29+
-H "Authorization: Bearer ${{ inputs.access-token }}" \
30+
--form "file=@${{ inputs.file-name }}"
31+
shell: bash

.github/workflows/build_notarized.yml

Lines changed: 118 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,12 @@ jobs:
7171

7272
runs-on: macos-13
7373

74+
outputs:
75+
app-version: ${{ steps.set-outputs.outputs.app-version }}
76+
app-name: ${{ steps.set-outputs.outputs.app-name }}
77+
7478
env:
7579
release-type: ${{ github.event.inputs.release-type || inputs.release-type }}
76-
create-dmg: ${{ github.event.inputs.create-dmg || inputs.create-dmg }}
7780
asana-task-url: ${{ github.event.inputs.asana-task-url || inputs.asana-task-url }}
7881

7982
steps:
@@ -142,20 +145,11 @@ jobs:
142145
continue-on-error: true
143146
run: brew install xcbeautify
144147

145-
- name: Install create-dmg
146-
if: ${{ env.create-dmg == true || env.asana-task-url }}
147-
run: |
148-
brew install create-dmg
149-
echo "create_dmg_arg=-d" >> $GITHUB_ENV
150-
151-
- name: Set Asana task URL
152-
if: env.asana-task-url
153-
run: echo "asana_task_url_arg=-a ${{ env.asana-task-url }}" >> $GITHUB_ENV
154-
155148
- name: Select Xcode
156149
run: sudo xcode-select -s /Applications/Xcode_$(<.xcode-version).app/Contents/Developer
157150

158151
- name: Archive and notarize the app
152+
id: archive
159153
env:
160154
APPLE_API_KEY_BASE64: ${{ secrets.APPLE_API_KEY_BASE64 }}
161155
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
@@ -166,46 +160,134 @@ jobs:
166160
export APPLE_API_KEY_PATH="$RUNNER_TEMP/apple_api_key.pem"
167161
echo -n "$APPLE_API_KEY_BASE64" | base64 --decode -o $APPLE_API_KEY_PATH
168162
169-
./scripts/archive.sh ${{ env.release-type }} \
170-
${{ env.create_dmg_arg }} \
171-
${{ env.asana_task_url_arg }}
163+
./scripts/archive.sh ${{ env.release-type }}
164+
165+
- name: Set app name and version
166+
id: set-outputs
167+
run: |
168+
echo "app-version=${{ env.app-version }}" >> $GITHUB_OUTPUT
169+
echo "app-name=${{ env.app-name }}" >> $GITHUB_OUTPUT
172170
173171
- name: Upload app artifact
174172
uses: actions/upload-artifact@v3
175173
with:
176-
name: DuckDuckGo-${{ env.release-type }}-${{ env.app_version }}.app
177-
path: ${{ github.workspace }}/release/DuckDuckGo-${{ env.app_version }}.zip
174+
name: DuckDuckGo-${{ env.release-type }}-${{ env.app-version }}.app
175+
path: ${{ github.workspace }}/release/DuckDuckGo-${{ env.app-version }}.zip
178176

179177
- name: Upload dSYMs artifact
180178
uses: actions/upload-artifact@v3
181179
with:
182-
name: DuckDuckGo-${{ env.release-type }}-dSYM-${{ env.app_version }}
183-
path: ${{ github.workspace }}/release/DuckDuckGo-${{ env.app_version }}-dSYM.zip
180+
name: DuckDuckGo-${{ env.release-type }}-dSYM-${{ env.app-version }}
181+
path: ${{ github.workspace }}/release/DuckDuckGo-${{ env.app-version }}-dSYM.zip
182+
183+
- name: Upload dSYMs to Asana
184+
if: env.asana-task-url
185+
uses: ./.github/actions/asana-upload
186+
with:
187+
access-token: ${{ secrets.ASANA_ACCESS_TOKEN }}
188+
file-name: ${{ github.workspace }}/release/DuckDuckGo-${{ env.app-version }}-dSYM.zip
189+
task-url: ${{ env.asana-task-url }}
190+
191+
create-dmg:
192+
193+
name: Create DMG
194+
needs: export-notarized-app
195+
if: ${{ github.event.inputs.create-dmg == 'true' || inputs.create-dmg == 'true' }}
196+
197+
# use macos-12 for creating DMGs as macos-13 beta runners can't run AppleScript: https://app.asana.com/0/0/1204523592790998/f
198+
runs-on: macos-12
199+
200+
env:
201+
app-version: ${{ needs.export-notarized-app.outputs.app-version }}
202+
app-name: ${{ needs.export-notarized-app.outputs.app-name }}
203+
asana-task-url: ${{ github.event.inputs.asana-task-url || inputs.asana-task-url }}
204+
release-type: ${{ github.event.inputs.release-type || inputs.release-type }}
205+
206+
steps:
207+
208+
- name: Fetch app bundle
209+
uses: actions/download-artifact@v3
210+
with:
211+
name: DuckDuckGo-${{ env.release-type }}-${{ env.app-version }}.app
212+
path: ${{ github.workspace }}/dmg
213+
214+
- name: Extract app bundle
215+
run: |
216+
ditto -xk DuckDuckGo-${{ env.app-version }}.zip .
217+
rm -f DuckDuckGo-${{ env.app-version }}.zip
218+
working-directory: ${{ github.workspace }}/dmg
219+
220+
- name: Install create-dmg
221+
run: brew install create-dmg
222+
223+
- name: Create DMG
224+
env:
225+
GH_TOKEN: ${{ github.token }}
226+
run: |
227+
curl -fLSs $(gh api https://api.github.com/repos/${{ github.repository }}/contents/scripts/assets/dmg-background.png?ref=${{ github.ref }} --jq .download_url) \
228+
--output dmg-background.png
229+
create-dmg --volname "${{ env.app-name }}" \
230+
--icon "${{ env.app-name }}.app" 140 160 \
231+
--background "dmg-background.png" \
232+
--window-size 600 400 \
233+
--icon-size 120 \
234+
--app-drop-link 430 160 "duckduckgo-${{ env.app-version }}.dmg" \
235+
"dmg"
184236
185237
- name: Upload DMG artifact
186-
if: env.create-dmg || env.asana-task-url
187238
uses: actions/upload-artifact@v3
188239
with:
189-
name: DuckDuckGo-${{ env.release-type }}-${{ env.app_version }}.dmg
190-
path: ${{ github.workspace }}/release/duckduckgo*-${{ env.app_version }}.dmg
240+
name: DuckDuckGo-${{ env.release-type }}-${{ env.app-version }}.dmg
241+
path: ${{ github.workspace }}/duckduckgo*-${{ env.app-version }}.dmg
191242

192-
- name: Send Mattermost message
243+
- name: Fetch Upload to Asana action
244+
if: env.asana-task-url
193245
env:
194-
WORKFLOW_URL: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}
195-
ASANA_TASK_URL: ${{ env.asana-task-url }}
196-
RELEASE_TYPE: ${{ env.release-type }}
246+
GH_TOKEN: ${{ github.token }}
197247
run: |
198-
export MM_USER_HANDLE=$(base64 -d <<< ${{ secrets.MM_HANDLES_BASE64 }} | jq ".${{ github.actor }}" | tr -d '"')
248+
mkdir -p "${{ github.workspace }}/.github/actions/asana-upload"
249+
curl -fLSs $(gh api https://api.github.com/repos/${{ github.repository }}/contents/.github/actions/asana-upload/action.yml?ref=${{ github.ref }} --jq .download_url) \
250+
--output "${{ github.workspace }}/.github/actions/asana-upload/action.yml"
199251
200-
if [[ -z "${MM_USER_HANDLE}" ]]; then
201-
echo "Mattermost user handle not known for ${{ github.actor }}, skipping sending message"
202-
else
252+
- name: Upload DMG to Asana
253+
if: env.asana-task-url
254+
uses: ./.github/actions/asana-upload
255+
with:
256+
access-token: ${{ secrets.ASANA_ACCESS_TOKEN }}
257+
file-name: ${{ github.workspace }}/duckduckgo-${{ env.app-version }}.dmg
258+
task-url: ${{ env.asana-task-url }}
203259

204-
if [[ -n "${ASANA_TASK_URL}" ]]; then
205-
export ASANA_LINK=" | [:asana: Asana task](${ASANA_TASK_URL})"
206-
fi
260+
mattermost:
207261

208-
curl -s -H 'Content-type: application/json' \
209-
-d "$(envsubst < ./scripts/assets/release-mm-template.json)" \
210-
${{ secrets.MM_WEBHOOK_URL }}
211-
fi
262+
name: Send Mattermost message
263+
264+
needs: [export-notarized-app, create-dmg]
265+
if: ${{ always() && (needs.export-notarized-app.result == 'success') && (needs.create-dmg.result == 'success' || needs.create-dmg.result == 'skipped') }}
266+
267+
runs-on: ubuntu-latest
268+
269+
steps:
270+
- name: Send Mattermost message
271+
env:
272+
ASANA_TASK_URL: ${{ github.event.inputs.asana-task-url || inputs.asana-task-url }}
273+
GH_TOKEN: ${{ github.token }}
274+
RELEASE_TYPE: ${{ github.event.inputs.release-type || inputs.release-type }}
275+
WORKFLOW_URL: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}
276+
run: |
277+
curl -fLSs $(gh api https://api.github.com/repos/${{ github.repository }}/contents/scripts/assets/release-mm-template.json?ref=${{ github.ref }} --jq .download_url) \
278+
--output message-template.json
279+
280+
export MM_USER_HANDLE=$(base64 -d <<< ${{ secrets.MM_HANDLES_BASE64 }} | jq ".${{ github.actor }}" | tr -d '"')
281+
282+
if [[ -z "${MM_USER_HANDLE}" ]]; then
283+
echo "Mattermost user handle not known for ${{ github.actor }}, skipping sending message"
284+
else
285+
286+
if [[ -n "${ASANA_TASK_URL}" ]]; then
287+
export ASANA_LINK=" | [:asana: Asana task](${ASANA_TASK_URL})"
288+
fi
289+
290+
curl -s -H 'Content-type: application/json' \
291+
-d "$(envsubst < message-template.json)" \
292+
${{ secrets.MM_WEBHOOK_URL }}
293+
fi

scripts/archive.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,8 @@ create_dmg() {
297297

298298
export_app_version_to_environment() {
299299
if [[ -n "${GITHUB_ENV}" ]]; then
300-
echo "app_version=${app_version}" >> "${GITHUB_ENV}"
300+
echo "app-version=${app_version}" >> "${GITHUB_ENV}"
301+
echo "app-name=${app_name}" >> "${GITHUB_ENV}"
301302
fi
302303
}
303304

0 commit comments

Comments
 (0)