From 7a092dc57c54f7b974ddb90356c96a262b80b580 Mon Sep 17 00:00:00 2001 From: Thada Wangthammang Date: Mon, 6 May 2024 17:05:53 +0700 Subject: [PATCH] feat(github-actions): extract deploy & e2e job for deployable flag --- .github/workflows/e2e.yml | 52 ++++++++++++--------- examples/with-node/nammatham.config.mjs | 13 ++++-- infra/azure-functions/src/config.ts | 22 ++++----- infra/azure-functions/src/e2e.test.ts | 3 +- infra/azure-functions/src/github-actions.ts | 3 -- infra/azure-functions/src/utils.ts | 13 +++++- 6 files changed, 65 insertions(+), 41 deletions(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 6ee6bd7..f395f99 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -10,12 +10,14 @@ on: # paths-ignore: # - '**/*.md' + env: pnpm_version: 8 node_version: 20 debug_identifier: nammatham:* RESOURCE_IDENTIFIER_NODE18_LINUX_X64: ${{ secrets.RESOURCE_IDENTIFIER_NODE18_LINUX_X64 }} + RESOURCE_IDENTIFIER_NODE18_WIN_X64: ${{ secrets.RESOURCE_IDENTIFIER_NODE18_WIN_X64 }} jobs: get-matrix: @@ -32,7 +34,7 @@ jobs: uses: actions/setup-node@v4 with: node-version: ${{env.node_version }} - - uses: pnpm/action-setup@v2 + - uses: pnpm/action-setup@v3 name: Install pnpm with: version: ${{ env.pnpm_version }} @@ -56,11 +58,11 @@ jobs: - name: Use Node.js ${{ matrix.version }} if: matrix.runtime == 'node' - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.version }} - - uses: pnpm/action-setup@v2 + - uses: pnpm/action-setup@v3 name: Install pnpm with: version: ${{ env.pnpm_version }} @@ -83,7 +85,7 @@ jobs: path: examples/with-${{ matrix.runtime }}/.nmt/dist retention-days: 1 - e2e: + deploy: runs-on: ubuntu-latest needs: - build @@ -94,21 +96,6 @@ jobs: include: ${{fromJson(needs.get-matrix.outputs.deployable_matrix)}} steps: - - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v1 - - - name: Use Node.js ${{ matrix.version }} - if: matrix.runtime == 'node' - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.version }} - - - uses: pnpm/action-setup@v2 - name: Install pnpm - with: - version: ${{ env.pnpm_version }} - - run: pnpm install - - name: Azure Login uses: azure/login@v2 with: @@ -126,8 +113,31 @@ jobs: app-name: nmt-e2e-${{ matrix.target }}-${{ secrets[matrix.resource_identifier_key] }} package: . - - name: Wait for the deployment to finish - run: sleep 15 + e2e: + runs-on: ubuntu-latest + needs: + - build + - deploy + - get-matrix + timeout-minutes: 10 + strategy: + matrix: + include: ${{fromJson(needs.get-matrix.outputs.deployable_matrix)}} + + steps: + - uses: actions/checkout@v4 + - uses: oven-sh/setup-bun@v1 + + - name: Use Node.js ${{ env.node_version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ env.node_version }} + + - uses: pnpm/action-setup@v3 + name: Install pnpm + with: + version: ${{ env.pnpm_version }} + - run: pnpm install - name: Run E2E tests run: pnpm exec nx run @infra/azure-functions:test diff --git a/examples/with-node/nammatham.config.mjs b/examples/with-node/nammatham.config.mjs index 5b36314..674b144 100644 --- a/examples/with-node/nammatham.config.mjs +++ b/examples/with-node/nammatham.config.mjs @@ -3,6 +3,13 @@ /** @type {import('nammatham').NammathamConfigs} */ const nammathamConfig = { runtime: 'node', + buildOption: { + target: { + arch: 'x64', + platform: 'linux', + runtime: 'node18', + }, + }, hostConfig: { version: '2.0', extensionBundle: { @@ -28,9 +35,9 @@ const nammathamConfig = { excludedTypes: 'Request', }, }, - // logLevel: { - // default: 'Trace', - // }, + logLevel: { + default: 'Trace', + }, }, }, }; diff --git a/infra/azure-functions/src/config.ts b/infra/azure-functions/src/config.ts index 90979aa..47c3148 100644 --- a/infra/azure-functions/src/config.ts +++ b/infra/azure-functions/src/config.ts @@ -13,17 +13,17 @@ export const infraConfigs = createInfraConfig( runtime: 'node18', isDeployable: true, }, - { - platform: 'win', - arch: 'x64', - runtime: 'node18', - isDeployable: true, - }, - { - platform: 'macos', - arch: 'arm64', - runtime: 'node18', - }, + // { + // platform: 'win', + // arch: 'x64', + // runtime: 'node18', + // isDeployable: true, + // }, + // { + // platform: 'macos', + // arch: 'arm64', + // runtime: 'node18', + // }, // --- Bun ---- // { // platform: 'linux', diff --git a/infra/azure-functions/src/e2e.test.ts b/infra/azure-functions/src/e2e.test.ts index 0fb62ab..f02eacc 100644 --- a/infra/azure-functions/src/e2e.test.ts +++ b/infra/azure-functions/src/e2e.test.ts @@ -1,4 +1,5 @@ import { test, expect } from 'bun:test'; +import supertest from 'supertest'; const url = process.env.AZURE_FUNCTIONS_URL; const apiKey = process.env.AZURE_FUNCTIONS_API_KEY; @@ -6,6 +7,6 @@ if (!url) throw new Error('AZURE_FUNCTIONS_URL not set'); if (!apiKey) throw new Error('AZURE_FUNCTIONS_API_KEY not set'); test('e2e', async () => { - const response = await fetch(new URL(`/api/SimpleHttpTrigger?code=${apiKey}`, url).toString()); + const response = await supertest(url).get(`/api/SimpleHttpTrigger?code=${apiKey}`); expect(response.status).toBe(200); }); diff --git a/infra/azure-functions/src/github-actions.ts b/infra/azure-functions/src/github-actions.ts index 4604da2..31bfca7 100644 --- a/infra/azure-functions/src/github-actions.ts +++ b/infra/azure-functions/src/github-actions.ts @@ -47,9 +47,6 @@ export function toGithubActionsMatrix(configs: InfraEnvConfig[]): GithubActionsM */ const version = runtime === 'node18' ? '20' : 'latest'; - if (!config.resourceIdentifier) { - throw new Error('resourceIdentifier is required'); - } return { os: platform === 'linux' ? 'ubuntu-latest' : platform === 'win' ? 'windows-latest' : 'macos-latest', runtime: runtime === 'bun' ? 'bun' : 'node', diff --git a/infra/azure-functions/src/utils.ts b/infra/azure-functions/src/utils.ts index 33a6a5d..5682845 100644 --- a/infra/azure-functions/src/utils.ts +++ b/infra/azure-functions/src/utils.ts @@ -17,8 +17,17 @@ export function createInfraConfig( infraConfigs: InfraEnvConfig[] ): InfraEnvConfig[] { return infraConfigs.map(infraConfig => { - const resourceIdentifier: string = - resourceIdentifiers[toTarget(infraConfig)] ?? fallbackResourceIdentifier(infraConfig); + const resourceIdentifier = resourceIdentifiers[toTarget(infraConfig)]; + + if (!resourceIdentifier && infraConfig.isDeployable) { + throw new Error( + `resourceIdentifier is required for ${toTarget( + infraConfig + )} due to is cannot be deployed. Please provide RESOURCE_IDENTIFIER_${toTarget(infraConfig) + .replaceAll('-', '_') + .toUpperCase()} in env.` + ); + } return { ...infraConfig,