Allow running of "Smoke test release" on draft releases (#36997)

* Conditionally use authorization token when getting WC Zip download URL.

* Exponse error message

* Handle undefined authorization token more gracefully

* Specify GH token in workflow

* Add changelog

* Use E2E_GH_TOKEN instead of default github.token

* Provide GitHub token to other jobs

* Fix getting of tag name from triggered event

* Use "inputs" context instead

* Add release version to workflow name

* Correct concurrency group

* Fix workflow name

* Add --archive option

* Fix output setting

* Fix script for verifying asset

* Remove unnecessary 'uses' line

* Remove node 12 deprecation messages

* Re-add "published" release type
This commit is contained in:
rodelgc 2023-03-08 17:23:56 +08:00 committed by GitHub
parent dbc3cde987
commit b60cc128fd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 100 additions and 53 deletions

View File

@ -1,14 +1,14 @@
name: Smoke test release
on:
release:
types: [published]
types: [released, prereleased, published]
workflow_dispatch:
inputs:
tag:
description: 'WooCommerce Release Tag'
required: true
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
group: ${{ github.workflow }}-${{ github.event.release.tag_name || inputs.tag }}
cancel-in-progress: true
permissions: {}
env:
@ -23,31 +23,31 @@ jobs:
contents: read
runs-on: ubuntu-20.04
outputs:
tag: ${{ steps.tag.outputs.result }}
tag: ${{ steps.get-tag.outputs.tag }}
created: ${{ steps.created-at.outputs.created }}
steps:
- name: Validate tag
if: ${{ github.event_name == 'workflow_dispatch' }}
env:
GH_TOKEN: ${{ github.token }}
run: gh release view "${{ github.event.inputs.tag }}" --repo=woocommerce/woocommerce
GH_TOKEN: ${{ secrets.E2E_GH_TOKEN }}
run: gh release view "${{ inputs.tag }}" --repo=woocommerce/woocommerce
- name: Get tag
uses: actions/github-script@v6
id: tag
with:
result-encoding: string
script: |
console.log( "${{ github.event_name }}" );
return "${{ github.event.release.tag_name }}" || "${{ github.event.inputs.tag }}"
- name: Get tag from triggered event
id: get-tag
env:
RELEASE_TAG: ${{ github.event.release.tag_name || inputs.tag }}
run: |
echo "Triggered event: ${{ github.event_name }}"
echo "Tag from event: $RELEASE_TAG"
echo "tag=$RELEASE_TAG" >> $GITHUB_OUTPUT
- name: Verify woocommerce.zip asset
env:
GITHUB_TOKEN: ${{ github.token }}
RELEASE_TAG: ${{ steps.tag.outputs.result }}
GH_TOKEN: ${{ secrets.E2E_GH_TOKEN }}
RELEASE_TAG: ${{ steps.get-tag.outputs.tag }}
run: |
gh release download $RELEASE_TAG --repo woocommerce/woocommerce
if [[ -f "woocommerce.zip" ]]
ASSET_NAMES=$(gh release view $RELEASE_TAG --repo woocommerce/woocommerce --json assets --jq ".assets[].name")
if [[ $ASSET_NAMES == *"woocommerce.zip"* ]]
then
echo "$RELEASE_TAG has a valid woocommerce.zip asset."
exit 0
@ -59,8 +59,8 @@ jobs:
- name: Get 'created-at' of WooCommerce zip
id: created-at
env:
GH_TOKEN: ${{ github.token }}
run: echo "created=$(gh release view ${{ steps.tag.outputs.result }} --json assets --jq .assets[0].createdAt --repo woocommerce/woocommerce)" >> $GITHUB_OUTPUT
GH_TOKEN: ${{ secrets.E2E_GH_TOKEN }}
run: echo "created=$(gh release view ${{ steps.get-tag.outputs.tag }} --json assets --jq .assets[0].createdAt --repo woocommerce/woocommerce)" >> $GITHUB_OUTPUT
e2e-update-wc:
name: Test WooCommerce update
@ -93,6 +93,7 @@ jobs:
CUSTOMER_PASSWORD: ${{ secrets.RELEASE_TEST_CUSTOMER_PASSWORD }}
CUSTOMER_USER: ${{ secrets.RELEASE_TEST_CUSTOMER_USER }}
DEFAULT_TIMEOUT_OVERRIDE: 120000
GITHUB_TOKEN: ${{ secrets.E2E_GH_TOKEN }}
UPDATE_WC: ${{ needs.get-tag.outputs.tag }}
run: |
pnpm exec playwright test \
@ -106,7 +107,7 @@ jobs:
- name: Configure AWS credentials
if: success() || failure()
uses: aws-actions/configure-aws-credentials@v1
uses: aws-actions/configure-aws-credentials@v1-node16
with:
aws-region: ${{ secrets.REPORTS_AWS_REGION }}
aws-access-key-id: ${{ secrets.REPORTS_AWS_ACCESS_KEY_ID }}
@ -183,7 +184,7 @@ jobs:
- name: Configure AWS credentials
if: success() || failure()
uses: aws-actions/configure-aws-credentials@v1
uses: aws-actions/configure-aws-credentials@v1-node16
with:
aws-region: ${{ secrets.REPORTS_AWS_REGION }}
aws-access-key-id: ${{ secrets.REPORTS_AWS_ACCESS_KEY_ID }}
@ -284,7 +285,7 @@ jobs:
- name: Configure AWS credentials
if: success() || failure()
uses: aws-actions/configure-aws-credentials@v1
uses: aws-actions/configure-aws-credentials@v1-node16
with:
aws-region: ${{ secrets.REPORTS_AWS_REGION }}
aws-access-key-id: ${{ secrets.REPORTS_AWS_ACCESS_KEY_ID }}
@ -393,7 +394,7 @@ jobs:
- name: Download release zip
env:
GITHUB_TOKEN: ${{ github.token }}
GH_TOKEN: ${{ secrets.E2E_GH_TOKEN }}
run: gh release download ${{ needs.get-wp-versions.outputs.tag }} --dir tmp
- name: Replace `plugins/woocommerce` with unzipped woocommerce release build
@ -427,7 +428,7 @@ jobs:
- name: Configure AWS credentials
if: success() || failure()
uses: aws-actions/configure-aws-credentials@v1
uses: aws-actions/configure-aws-credentials@v1-node16
with:
aws-region: ${{ secrets.REPORTS_AWS_REGION }}
aws-access-key-id: ${{ secrets.REPORTS_AWS_ACCESS_KEY_ID }}
@ -567,7 +568,7 @@ jobs:
- name: Download release zip
env:
GITHUB_TOKEN: ${{ github.token }}
GH_TOKEN: ${{ secrets.E2E_GH_TOKEN }}
run: gh release download ${{ needs.get-tag.outputs.tag }} --dir tmp
- name: Replace `plugins/woocommerce` with unzipped woocommerce release build
@ -587,7 +588,7 @@ jobs:
- name: Configure AWS credentials
if: success() || failure()
uses: aws-actions/configure-aws-credentials@v1
uses: aws-actions/configure-aws-credentials@v1-node16
with:
aws-region: ${{ secrets.REPORTS_AWS_REGION }}
aws-access-key-id: ${{ secrets.REPORTS_AWS_ACCESS_KEY_ID }}

View File

@ -0,0 +1,4 @@
Significance: patch
Type: dev
Support E2E testing of draft releases.

View File

@ -1,6 +1,6 @@
const axios = require( 'axios' ).default;
const wcApi = require( '@woocommerce/woocommerce-rest-api' ).default;
const { ADMINSTATE, UPDATE_WC } = process.env;
const { ADMINSTATE, GITHUB_TOKEN, UPDATE_WC } = process.env;
const { downloadZip, deleteZip } = require( '../../utils/plugin-utils' );
const { test, expect } = require( '@playwright/test' );
@ -20,34 +20,67 @@ const skipTestIfUndefined = () => {
}, skipMessage );
};
/**
*
* Get download URL of a WooCommerce ZIP asset by sending a `GET` request to `List releases` GitHub API endpoint in the WooCommerce repository.
*
* If `GITHUB_TOKEN` is defined, use it as `Authorization` header.
*
* @returns Download URL of the WooCommerce ZIP. This URL depends on whether `GITHUB_TOKEN` was specified or not.
*
* If `GITHUB_TOKEN` was defined, this function assumes that you're trying to access all releases, including drafts (as draft releases don't show up in the response of an unauthenticated GET `List releases` request ).
* In this case, the returned value will be the `asset.url`.
*
* Otherwise, the returned value will be the `asset.browser_download_url`.
*
* @throws Error if:
* - 'List releases' request was unsuccessful, or
* - no release with the given tag was found, or
* - when a WooCommerce ZIP asset was not found.
*
*/
const getWCDownloadURL = async () => {
let woocommerceZipAsset;
const requestConfig = {
method: 'get',
url: 'https://api.github.com/repos/woocommerce/woocommerce/releases',
headers: {
Accept: 'application/vnd.github+json',
},
};
const response = await axios
.get(
`https://api.github.com/repos/woocommerce/woocommerce/releases/tags/${ UPDATE_WC }`
)
.catch( ( error ) => {
console.log( error.toJSON() );
return error.response;
} );
if (
response.status === 200 &&
response.data.assets &&
response.data.assets.length > 0 &&
( woocommerceZipAsset = response.data.assets.find(
( { browser_download_url } ) =>
browser_download_url.match(
/woocommerce(-trunk-nightly)?\.zip$/
)
) )
) {
return woocommerceZipAsset.browser_download_url;
} else {
const error = `You're attempting to get the download URL of a WooCommerce release zip with tag "${ UPDATE_WC }". But "${ UPDATE_WC }" is an invalid WooCommerce release tag, or a tag without a WooCommerce release zip asset like "7.2.0-rc.2".`;
throw new Error( error );
if ( GITHUB_TOKEN ) {
requestConfig.headers.Authorization = `Bearer ${ GITHUB_TOKEN }`;
}
const response = await axios( requestConfig ).catch( ( error ) => {
if ( error.response ) {
console.log( error.response.data );
}
throw new Error( error.message );
} );
const releaseWithTagName = response.data.find(
( { tag_name } ) => tag_name === UPDATE_WC
);
if ( ! releaseWithTagName ) {
throw new Error(
`No release with tag_name="${ UPDATE_WC }" found. If "${ UPDATE_WC }" is a draft release, make sure to specify a GITHUB_TOKEN environment variable.`
);
}
const wcZipAsset = releaseWithTagName.assets.find( ( { name } ) =>
name.match( /^woocommerce(-trunk-nightly)?\.zip$/ )
);
if ( wcZipAsset ) {
return GITHUB_TOKEN ? wcZipAsset.url : wcZipAsset.browser_download_url;
}
throw new Error(
`WooCommerce release with tag "${ UPDATE_WC }" found, but does not have a WooCommerce ZIP asset.`
);
};
skipTestIfUndefined();
@ -58,7 +91,13 @@ test.describe.serial( 'WooCommerce update', () => {
test.beforeAll( async () => {
await test.step( 'Download WooCommerce zip from GitHub', async () => {
const url = await getWCDownloadURL();
woocommerceZipPath = await downloadZip( { url } );
const params = { url };
if ( GITHUB_TOKEN ) {
params.authorizationToken = GITHUB_TOKEN;
}
woocommerceZipPath = await downloadZip( params );
} );
} );

View File

@ -147,6 +147,9 @@ export const downloadZip = async ( {
};
response = await axios( options ).catch( ( error ) => {
if ( error.response ) {
console.error( error.response.data );
}
throw new Error( error.message );
} );