diff --git a/.github/actions/asana-add-comment/templates/appcast-failed-hotfix.yml b/.github/actions/asana-add-comment/templates/appcast-failed-hotfix.yml new file mode 100644 index 0000000000..0b5a558f09 --- /dev/null +++ b/.github/actions/asana-add-comment/templates/appcast-failed-hotfix.yml @@ -0,0 +1,9 @@ +data: + html_text: | + +

[ACTION NEEDED] Publishing ${TAG} hotfix release to Sparkle failed

+ , please proceed with generating appcast2.xml and uploading files to S3 from your local machine, according to instructions. + + + πŸ”— Workflow URL: ${WORKFLOW_URL}. + \ No newline at end of file diff --git a/.github/actions/asana-add-comment/templates/appcast-failed.yml b/.github/actions/asana-add-comment/templates/appcast-failed-internal.yml similarity index 100% rename from .github/actions/asana-add-comment/templates/appcast-failed.yml rename to .github/actions/asana-add-comment/templates/appcast-failed-internal.yml diff --git a/.github/actions/asana-add-comment/templates/appcast-failed-public.yml b/.github/actions/asana-add-comment/templates/appcast-failed-public.yml new file mode 100644 index 0000000000..5f3b09e29e --- /dev/null +++ b/.github/actions/asana-add-comment/templates/appcast-failed-public.yml @@ -0,0 +1,9 @@ +data: + html_text: | + +

[ACTION NEEDED] Publishing ${TAG} release to Sparkle failed

+ , please proceed with generating appcast2.xml and uploading files to S3 from your local machine, according to instructions. + + + πŸ”— Workflow URL: ${WORKFLOW_URL}. + \ No newline at end of file diff --git a/.github/actions/asana-add-comment/templates/public-release-complete.yml b/.github/actions/asana-add-comment/templates/public-release-complete.yml new file mode 100644 index 0000000000..afd902977a --- /dev/null +++ b/.github/actions/asana-add-comment/templates/public-release-complete.yml @@ -0,0 +1,8 @@ +data: + html_text: | + + Build ${TAG} is now available publicly through Sparkle and TestFlight. + + + πŸ“₯ DMG download link + diff --git a/.github/actions/asana-add-comment/templates/validate-check-for-updates-public.yml b/.github/actions/asana-add-comment/templates/validate-check-for-updates-public.yml new file mode 100644 index 0000000000..d27c1cae3c --- /dev/null +++ b/.github/actions/asana-add-comment/templates/validate-check-for-updates-public.yml @@ -0,0 +1,11 @@ +data: + html_text: | + +

Build ${TAG} is available publicly through Sparkle πŸš€

+ + + πŸ”— Workflow URL: ${WORKFLOW_URL}. + diff --git a/.github/actions/asana-create-action-item/templates/appcast-failed-hotfix.yml b/.github/actions/asana-create-action-item/templates/appcast-failed-hotfix.yml new file mode 100644 index 0000000000..2242993e4c --- /dev/null +++ b/.github/actions/asana-create-action-item/templates/appcast-failed-hotfix.yml @@ -0,0 +1,36 @@ +data: + name: Generate appcast2.xml for ${TAG} hotfix release and upload assets to S3 + assignee: "${ASSIGNEE_ID}" + html_notes: | + + Publishing ${TAG} hotfix release failed in CI. Please follow the steps to generate the appcast file and upload files to S3 from your local machine. + +
    +
  1. Create a new file called release-notes.txt on your disk. +
  2. +
  3. Run appcastManager: +
  4. +
  5. Verify that the new build is in the appcast file with the latest release notes and no internal channel tag. The phased rollout tag should not be present: +
  6. +
  7. Run upload_to_s3.sh script: +
  8. +
+ When done, please verify that "Check for Updates" works correctly: +
    +
  1. Launch a debug version of the app with an old version number.
  2. +
  3. Make sure you're not identified as an internal user in the app.
  4. +
  5. Go to Main Menu β†’ DuckDuckGo β†’ Check for Updates...
  6. +
  7. Verify that you're being offered to update to ${TAG}.
  8. +
  9. Verify that the update works.
  10. +
+ + πŸ”— Workflow URL: ${WORKFLOW_URL}. + diff --git a/.github/actions/asana-create-action-item/templates/appcast-failed.yml b/.github/actions/asana-create-action-item/templates/appcast-failed-internal.yml similarity index 96% rename from .github/actions/asana-create-action-item/templates/appcast-failed.yml rename to .github/actions/asana-create-action-item/templates/appcast-failed-internal.yml index 668083791a..fcd12b1b14 100644 --- a/.github/actions/asana-create-action-item/templates/appcast-failed.yml +++ b/.github/actions/asana-create-action-item/templates/appcast-failed-internal.yml @@ -3,7 +3,7 @@ data: assignee: "${ASSIGNEE_ID}" html_notes: | - Publishing internal release ${TAG} failed in CI. Please follow the steps to generate the appcast file and upload files to S3 from your local machine. + Publishing ${TAG} internal release failed in CI. Please follow the steps to generate the appcast file and upload files to S3 from your local machine.
  1. Download the DMG for ${TAG} release.
  2. diff --git a/.github/actions/asana-create-action-item/templates/appcast-failed-public.yml b/.github/actions/asana-create-action-item/templates/appcast-failed-public.yml new file mode 100644 index 0000000000..0cbe7cb851 --- /dev/null +++ b/.github/actions/asana-create-action-item/templates/appcast-failed-public.yml @@ -0,0 +1,36 @@ +data: + name: Generate appcast2.xml for ${TAG} public release and upload assets to S3 + assignee: "${ASSIGNEE_ID}" + html_notes: | + + Publishing ${TAG} release failed in CI. Please follow the steps to generate the appcast file and upload files to S3 from your local machine. + +
      +
    1. Create a new file called release-notes.txt on your disk. +
        +
      • Add each release note as a separate line and don't add bullet points (β€’) – the script will add them automatically.
      • +
    2. +
    3. Run appcastManager: +
        +
      • ./scripts/appcast_manager/appcastManager.swift --release-to-public-channel --version ${VERSION} --release-notes release-notes.txt
      • +
    4. +
    5. Verify that the new build is in the appcast file with the latest release notes, the phased rollout tag (below) and no internal channel tag: +
        +
      • <sparkle:phasedRolloutInterval>43200</sparkle:phasedRolloutInterval>
      • +
    6. +
    7. Run upload_to_s3.sh script: +
        +
      • ./scripts/upload_to_s3/upload_to_s3.sh --run --overwrite-duckduckgo-dmg ${VERSION}
      • +
    8. +
    + When done, please verify that "Check for Updates" works correctly: +
      +
    1. Launch a debug version of the app with an old version number.
    2. +
    3. Make sure you're not identified as an internal user in the app.
    4. +
    5. Go to Main Menu β†’ DuckDuckGo β†’ Check for Updates...
    6. +
    7. Verify that you're being offered to update to ${TAG}.
    8. +
    9. Verify that the update works.
    10. +
    + + πŸ”— Workflow URL: ${WORKFLOW_URL}. + diff --git a/.github/actions/asana-create-action-item/templates/validate-check-for-updates-public.yml b/.github/actions/asana-create-action-item/templates/validate-check-for-updates-public.yml new file mode 100644 index 0000000000..e973fadd81 --- /dev/null +++ b/.github/actions/asana-create-action-item/templates/validate-check-for-updates-public.yml @@ -0,0 +1,41 @@ +data: + name: Validate that 'Check For Updates' upgrades to ${TAG} + assignee: "${ASSIGNEE_ID}" + html_notes: | + +

    Build ${TAG} has been released publicly via Sparkle πŸŽ‰

    + Please verify that "Check for Updates" works correctly: +
      +
    1. Launch a debug version of the app with an old version number.
    2. +
    3. Make sure you're not identified as an internal user in the app.
    4. +
    5. Go to Main Menu β†’ DuckDuckGo β†’ Check for Updates...
    6. +
    7. Verify that you're being offered to update to ${TAG}.
    8. +
    9. Verify that the update works.
    10. +
    +

    🚨In case "Check for Updates" is broken

    + You can restore previous version of the appcast2.xml: +
      +
    1. Download the ${OLD_APPCAST_NAME} file attached to this task.
    2. +
    3. Log in to AWS session: +
        +
      • aws --profile ddg-macos sso login
      • +
    4. +
    5. Overwrite appcast2.xml with the old version: +
        +
      • aws --profile ddg-macos s3 cp ${OLD_APPCAST_NAME} s3://${RELEASE_BUCKET_NAME}/${RELEASE_BUCKET_PREFIX}/appcast2.xml --acl public-read
      • +
    6. +
    + +
    +

    Summary of automated changes

    +

    Changes to appcast2.xml

    + See the attached ${APPCAST_PATCH_NAME} file. +

    Release notes

    + See the attached ${RELEASE_NOTES_FILE} file for release notes extracted automatically from the release task description. +

    List of files uploaded to S3

    +
      + ${FILES_UPLOADED} +
    + + πŸ”— Workflow URL: ${WORKFLOW_URL}. + diff --git a/.github/workflows/publish_dmg_release.yml b/.github/workflows/publish_dmg_release.yml index 8ccbe6905b..c31f3473fe 100644 --- a/.github/workflows/publish_dmg_release.yml +++ b/.github/workflows/publish_dmg_release.yml @@ -11,12 +11,20 @@ on: description: "Tag to publish" required: true type: string + release-type: + description: "Release type" + required: true + type: choice + options: + - internal + - public + - hotfix jobs: publish-to-sparkle: - name: Publish internal release to Sparkle + name: Publish a release to Sparkle runs-on: macos-13-xlarge timeout-minutes: 10 @@ -37,13 +45,16 @@ jobs: echo "::error::The provided tag ($tag) has incorrect format (attempted to match ${tag_regex})." exit 1 fi - echo "tag-in-filename=${tag//-/.}" >> $GITHUB_OUTPUT + echo "release-version=${tag//-/.}" >> $GITHUB_OUTPUT - name: Check out the code uses: actions/checkout@v4 with: submodules: recursive + - name: Select Xcode + run: sudo xcode-select -s /Applications/Xcode_$(<.xcode-version).app/Contents/Developer + - name: Set up Sparkle tools env: SPARKLE_URL: https://github.com/sparkle-project/Sparkle/releases/download/${{ vars.SPARKLE_VERSION }}/Sparkle-${{ vars.SPARKLE_VERSION }}.tar.xz @@ -53,8 +64,9 @@ jobs: - name: Fetch DMG id: fetch-dmg + if: ${{ github.event.inputs.release-type != 'public' }} env: - DMG_NAME: duckduckgo-${{ steps.verify-tag.outputs.tag-in-filename }}.dmg + DMG_NAME: duckduckgo-${{ steps.verify-tag.outputs.release-version }}.dmg run: | DMG_URL="${{ vars.DMG_URL_ROOT }}${DMG_NAME}" curl -fLSs -o "$DMG_NAME" "$DMG_URL" @@ -78,25 +90,44 @@ jobs: | ./scripts/extract_release_notes.sh > release_notes.txt echo "RELEASE_NOTES_FILE=release_notes.txt" >> $GITHUB_ENV - - name: Select Xcode - run: sudo xcode-select -s /Applications/Xcode_$(<.xcode-version).app/Contents/Developer - - name: Generate appcast id: appcast env: DMG_PATH: ${{ steps.fetch-dmg.outputs.dmg-path }} SPARKLE_PRIVATE_KEY: ${{ secrets.SPARKLE_PRIVATE_KEY }} + RELEASE_TYPE: ${{ github.event.inputs.release-type }} + VERSION: ${{ steps.verify-tag.outputs.release-version }} run: | echo -n "$SPARKLE_PRIVATE_KEY" > sparkle_private_key chmod 600 sparkle_private_key - ./scripts/appcast_manager/appcastManager.swift \ - --release-to-internal-channel \ - --dmg ${DMG_PATH} \ - --release-notes release_notes.txt \ - --key sparkle_private_key + case "$RELEASE_TYPE" in + "internal") + ./scripts/appcast_manager/appcastManager.swift \ + --release-to-internal-channel \ + --dmg ${DMG_PATH} \ + --release-notes release_notes.txt \ + --key sparkle_private_key + ;; + "public") + ./scripts/appcast_manager/appcastManager.swift \ + --release-to-public-channel \ + --version ${VERSION} \ + --release-notes release_notes.txt \ + --key sparkle_private_key + ;; + "hotfix") + ./scripts/appcast_manager/appcastManager.swift \ + --release-hotfix-to-public-channel \ + --dmg ${DMG_PATH} \ + --release-notes release_notes.txt \ + --key sparkle_private_key + ;; + *) + ;; + esac - appcast_patch_name="appcast2-${{ steps.verify-tag.outputs.tag-in-filename }}.patch" + appcast_patch_name="appcast2-${VERSION}.patch" mv -f ${{ env.SPARKLE_DIR }}/appcast_diff.txt ${{ env.SPARKLE_DIR }}/${appcast_patch_name} echo "appcast-patch-name=${appcast_patch_name}" >> $GITHUB_OUTPUT @@ -112,6 +143,8 @@ jobs: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID_RELEASE_S3 }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY_RELEASE_S3 }} AWS_DEFAULT_REGION: ${{ vars.AWS_DEFAULT_REGION }} + RELEASE_TYPE: ${{ github.event.inputs.release-type }} + VERSION: ${{ steps.verify-tag.outputs.release-version }} run: | # Back up existing appcast2.xml OLD_APPCAST_NAME=appcast2_old.xml @@ -119,7 +152,11 @@ jobs: curl -fLSs "${{ vars.DMG_URL_ROOT }}appcast2.xml" --output "${OLD_APPCAST_NAME}" # Upload files to S3 - ./scripts/upload_to_s3/upload_to_s3.sh --run --force + if [[ "${RELEASE_TYPE}" == "internal" ]]; then + ./scripts/upload_to_s3/upload_to_s3.sh --run --force + else + ./scripts/upload_to_s3/upload_to_s3.sh --run --force --overwrite-duckduckgo-dmg "${VERSION}" + fi if [[ -f "${{ env.SPARKLE_DIR }}/uploaded_files_list.txt" ]]; then echo "FILES_UPLOADED=$(awk '{ print "
  3. "$1"
  4. "; }' < ${{ env.SPARKLE_DIR }}/uploaded_files_list.txt | tr '\n' ' ')" >> $GITHUB_ENV @@ -139,19 +176,28 @@ jobs: echo "RELEASE_BUCKET_PREFIX=${{ vars.RELEASE_BUCKET_PREFIX }}" >> $GITHUB_ENV echo "RELEASE_TASK_ID=${{ steps.task-id.outputs.task-id }}" >> $GITHUB_ENV echo "TAG=${{ github.event.inputs.tag }}" >> $GITHUB_ENV + echo "VERSION=${{ steps.verify-tag.outputs.release-version }}" >> $GITHUB_ENV echo "WORKFLOW_URL=https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" >> $GITHUB_ENV - name: Set up Asana templates if: always() id: asana-templates + env: + RELEASE_TYPE: ${{ github.event.inputs.release-type }} run: | - if [[ ${{ steps.upload.outcome }} == "success" ]]; then - echo "task-template=validate-check-for-updates-internal" >> $GITHUB_OUTPUT - echo "comment-template=validate-check-for-updates-internal" >> $GITHUB_OUTPUT - echo "release-task-comment-template=internal-release-complete" >> $GITHUB_OUTPUT + if [[ ${{ steps.upload.outcome }} == "success" ]]; then + if [[ "${RELEASE_TYPE}" == "internal" ]]; then + echo "task-template=validate-check-for-updates-internal" >> $GITHUB_OUTPUT + echo "comment-template=validate-check-for-updates-internal" >> $GITHUB_OUTPUT + echo "release-task-comment-template=internal-release-complete" >> $GITHUB_OUTPUT + else + echo "task-template=validate-check-for-updates-public" >> $GITHUB_OUTPUT + echo "comment-template=validate-check-for-updates-public" >> $GITHUB_OUTPUT + echo "release-task-comment-template=public-release-complete" >> $GITHUB_OUTPUT + fi else - echo "task-template=appcast-failed" >> $GITHUB_OUTPUT - echo "comment-template=appcast-failed" >> $GITHUB_OUTPUT + echo "task-template=appcast-failed-${RELEASE_TYPE}" >> $GITHUB_OUTPUT + echo "comment-template=appcast-failed-${RELEASE_TYPE}" >> $GITHUB_OUTPUT fi - name: Create Asana task @@ -207,4 +253,4 @@ jobs: with: access-token: ${{ secrets.ASANA_ACCESS_TOKEN }} task-url: ${{ github.event.inputs.asana-task-url }} - template-name: internal-release-complete + template-name: ${{ steps.asana-templates.outputs.release-task-comment-template }} diff --git a/.github/workflows/sparkle_internal.yml b/.github/workflows/sparkle_internal.yml deleted file mode 100644 index bfc7293c92..0000000000 --- a/.github/workflows/sparkle_internal.yml +++ /dev/null @@ -1,210 +0,0 @@ -name: Publish Internal Release to Sparkle - -on: - workflow_dispatch: - inputs: - asana-task-url: - description: "Asana release task URL" - required: true - type: string - tag: - description: "Tag to publish" - required: true - type: string - -jobs: - - publish-to-sparkle: - - name: Publish internal release to Sparkle - - runs-on: macos-13-xlarge - timeout-minutes: 10 - - env: - SPARKLE_DIR: ${{ github.workspace }}/sparkle-updates - - steps: - - - name: Verify the tag - id: verify-tag - env: - tag: ${{ github.event.inputs.tag }} - run: | - tag_regex='^[0-9]+\.[0-9]+\.[0-9]+-[0-9]+$' - - if [[ ! "$tag" =~ $tag_regex ]]; then - echo "::error::The provided tag ($tag) has incorrect format (attempted to match ${tag_regex})." - exit 1 - fi - echo "tag-in-filename=${tag//-/.}" >> $GITHUB_OUTPUT - - - name: Check out the code - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Set up Sparkle tools - env: - SPARKLE_URL: https://github.com/sparkle-project/Sparkle/releases/download/${{ vars.SPARKLE_VERSION }}/Sparkle-${{ vars.SPARKLE_VERSION }}.tar.xz - run: | - curl -fLSs $SPARKLE_URL | tar xJ bin - echo "${{ github.workspace }}/bin" >> $GITHUB_PATH - - - name: Fetch DMG - id: fetch-dmg - env: - DMG_NAME: duckduckgo-${{ steps.verify-tag.outputs.tag-in-filename }}.dmg - run: | - DMG_URL="${{ vars.DMG_URL_ROOT }}${DMG_NAME}" - curl -fLSs -o "$DMG_NAME" "$DMG_URL" - echo "dmg-name=$DMG_NAME" >> $GITHUB_OUTPUT - echo "dmg-path=$DMG_NAME" >> $GITHUB_OUTPUT - - - name: Extract Asana Task ID - id: task-id - uses: ./.github/actions/asana-extract-task-id - with: - task-url: ${{ github.event.inputs.asana-task-url }} - - - name: Fetch release notes - env: - TASK_ID: ${{ steps.task-id.outputs.task-id }} - ASANA_ACCESS_TOKEN: ${{ secrets.ASANA_ACCESS_TOKEN }} - run: | - curl -fLSs "https://app.asana.com/api/1.0/tasks/${TASK_ID}?opt_fields=notes" \ - -H "Authorization: Bearer ${ASANA_ACCESS_TOKEN}" \ - | jq -r .data.notes \ - | ./scripts/extract_release_notes.sh > release_notes.txt - echo "RELEASE_NOTES_FILE=release_notes.txt" >> $GITHUB_ENV - - - name: Select Xcode - run: sudo xcode-select -s /Applications/Xcode_$(<.xcode-version).app/Contents/Developer - - - name: Generate appcast - id: appcast - env: - DMG_PATH: ${{ steps.fetch-dmg.outputs.dmg-path }} - SPARKLE_PRIVATE_KEY: ${{ secrets.SPARKLE_PRIVATE_KEY }} - run: | - echo -n "$SPARKLE_PRIVATE_KEY" > sparkle_private_key - chmod 600 sparkle_private_key - - ./scripts/appcast_manager/appcastManager.swift \ - --release-to-internal-channel \ - --dmg ${DMG_PATH} \ - --release-notes release_notes.txt \ - --key sparkle_private_key - - appcast_patch_name="appcast2-${{ steps.verify-tag.outputs.tag-in-filename }}.patch" - mv -f ${{ env.SPARKLE_DIR }}/appcast_diff.txt ${{ env.SPARKLE_DIR }}/${appcast_patch_name} - echo "appcast-patch-name=${appcast_patch_name}" >> $GITHUB_OUTPUT - - - name: Upload appcast diff artifact - uses: actions/upload-artifact@v4 - with: - name: ${{ steps.appcast.outputs.appcast-patch-name }} - path: ${{ env.SPARKLE_DIR }}/${{ steps.appcast.outputs.appcast-patch-name }} - - - name: Upload to S3 - id: upload - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - AWS_DEFAULT_REGION: ${{ vars.AWS_DEFAULT_REGION }} - run: | - # Back up existing appcast2.xml - OLD_APPCAST_NAME=appcast2_old.xml - echo "OLD_APPCAST_NAME=${OLD_APPCAST_NAME}" >> $GITHUB_ENV - curl -fLSs "${{ vars.DMG_URL_ROOT }}appcast2.xml" --output "${OLD_APPCAST_NAME}" - - # Upload files to S3 - ./scripts/upload_to_s3/upload_to_s3.sh --run --force - - if [[ -f "${{ env.SPARKLE_DIR }}/uploaded_files_list.txt" ]]; then - echo "FILES_UPLOADED=$(awk '{ print "
  5. "$1"
  6. "; }' < ${{ env.SPARKLE_DIR }}/uploaded_files_list.txt | tr '\n' ' ')" >> $GITHUB_ENV - else - echo "FILES_UPLOADED='No files uploaded.'" >> $GITHUB_ENV - fi - - - name: Set common environment variables - if: always() - env: - DMG_NAME: ${{ steps.fetch-dmg.outputs.dmg-name }} - run: | - echo "APPCAST_PATCH_NAME=${{ steps.appcast.outputs.appcast-patch-name }}" >> $GITHUB_ENV - echo "DMG_NAME=${DMG_NAME}" >> $GITHUB_ENV - echo "DMG_URL=${{ vars.DMG_URL_ROOT }}${DMG_NAME}" >> $GITHUB_ENV - echo "RELEASE_BUCKET_NAME=${{ vars.RELEASE_BUCKET_NAME }}" >> $GITHUB_ENV - echo "RELEASE_BUCKET_PREFIX=${{ vars.RELEASE_BUCKET_PREFIX }}" >> $GITHUB_ENV - echo "RELEASE_TASK_ID=${{ steps.task-id.outputs.task-id }}" >> $GITHUB_ENV - echo "TAG=${{ github.event.inputs.tag }}" >> $GITHUB_ENV - echo "WORKFLOW_URL=https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" >> $GITHUB_ENV - - - name: Set up Asana templates - if: always() - id: asana-templates - run: | - if [[ ${{ steps.upload.outcome }} == "success" ]]; then - echo "task-template=validate-check-for-updates-internal" >> $GITHUB_OUTPUT - echo "comment-template=validate-check-for-updates-internal" >> $GITHUB_OUTPUT - echo "release-task-comment-template=internal-release-complete" >> $GITHUB_OUTPUT - else - echo "task-template=appcast-failed" >> $GITHUB_OUTPUT - echo "comment-template=appcast-failed" >> $GITHUB_OUTPUT - fi - - - name: Create Asana task - id: create-task - if: always() - uses: ./.github/actions/asana-create-action-item - with: - access-token: ${{ secrets.ASANA_ACCESS_TOKEN }} - release-task-url: ${{ github.event.inputs.asana-task-url }} - template-name: ${{ steps.asana-templates.outputs.task-template }} - - - name: Upload patch to the Asana task - id: upload-patch - if: success() - uses: ./.github/actions/asana-upload - with: - access-token: ${{ secrets.ASANA_ACCESS_TOKEN }} - file-name: ${{ env.SPARKLE_DIR }}/${{ steps.appcast.outputs.appcast-patch-name }} - task-id: ${{ steps.create-task.outputs.new-task-id }} - - - name: Upload old appcast file to the Asana task - id: upload-old-appcast - if: success() - uses: ./.github/actions/asana-upload - with: - access-token: ${{ secrets.ASANA_ACCESS_TOKEN }} - file-name: ${{ env.OLD_APPCAST_NAME }} - task-id: ${{ steps.create-task.outputs.new-task-id }} - - - name: Upload release notes to the Asana task - id: upload-release-notes - if: success() - uses: ./.github/actions/asana-upload - with: - access-token: ${{ secrets.ASANA_ACCESS_TOKEN }} - file-name: ${{ env.RELEASE_NOTES_FILE }} - task-id: ${{ steps.create-task.outputs.new-task-id }} - - - name: Report status - if: always() - uses: ./.github/actions/asana-log-message - env: - ASSIGNEE_ID: ${{ steps.create-task.outputs.assignee-id }} - TASK_ID: ${{ steps.create-task.outputs.new-task-id }} - with: - access-token: ${{ secrets.ASANA_ACCESS_TOKEN }} - task-url: ${{ github.event.inputs.asana-task-url }} - template-name: ${{ steps.asana-templates.outputs.comment-template }} - - - name: Add a comment to the release task - if: success() - uses: ./.github/actions/asana-add-comment - with: - access-token: ${{ secrets.ASANA_ACCESS_TOKEN }} - task-url: ${{ github.event.inputs.asana-task-url }} - template-name: internal-release-complete