From 899ec5f8642aa2862ae1b42ef7e4ea36436b16aa Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Fri, 12 Jul 2024 21:22:38 +0000 Subject: [PATCH 01/24] feat: adds playwright test to create a basic pipeline and check if it succeeds --- .gitignore | 6 ++- tasks.yaml | 4 ++ tasks/test.yaml | 10 ++++ tests/auth.setup.ts | 24 +++++++++ tests/jenkins.test.ts | 97 ++++++++++++++++++++++++++++++++++ tests/package-lock.json | 104 +++++++++++++++++++++++++++++++++++++ tests/package.json | 9 ++++ tests/playwright.config.ts | 44 ++++++++++++++++ tests/tsconfig.json | 10 ++++ 9 files changed, 307 insertions(+), 1 deletion(-) create mode 100644 tests/auth.setup.ts create mode 100644 tests/jenkins.test.ts create mode 100644 tests/package-lock.json create mode 100644 tests/package.json create mode 100644 tests/playwright.config.ts create mode 100644 tests/tsconfig.json diff --git a/.gitignore b/.gitignore index 0099811..c78a6c3 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ defense-unicorns-distro/preflight.sh .terraform tmp zarf-sbom - +.vscode/ .cache/ .idea/ build/ @@ -26,3 +26,7 @@ test/tf/public-ec2-instance/.terraform terraform.tfstate terraform.tfstate.backup .terraform.lock.hcl + +# Tests +node_modules/ +.playwright/ diff --git a/tasks.yaml b/tasks.yaml index df930e7..3c01932 100644 --- a/tasks.yaml +++ b/tasks.yaml @@ -62,8 +62,10 @@ tasks: - task: create-test-bundle - task: setup:k3d-test-cluster - task: deploy:test-bundle + - task: setup:create-doug-user - task: test:health-check - task: test:ingress + - task: test:ui - name: test-upgrade description: Test an upgrade from the latest released package to the current branch @@ -71,7 +73,9 @@ tasks: - task: create-latest-release-bundle - task: setup:k3d-test-cluster - task: deploy:test-bundle + - task: setup:create-doug-user - task: create-test-bundle - task: deploy:test-bundle - task: test:health-check - task: test:ingress + - task: test:ui diff --git a/tasks/test.yaml b/tasks/test.yaml index 4a5b222..ce647b7 100644 --- a/tasks/test.yaml +++ b/tasks/test.yaml @@ -16,3 +16,13 @@ tasks: protocol: https address: jenkins.uds.dev/login code: 200 + + - name: ui + description: Mattermost UI Checks + actions: + - cmd: npm ci + dir: tests + - cmd: npx playwright install --with-deps + dir: tests + - cmd: npx playwright test + dir: tests diff --git a/tests/auth.setup.ts b/tests/auth.setup.ts new file mode 100644 index 0000000..21da279 --- /dev/null +++ b/tests/auth.setup.ts @@ -0,0 +1,24 @@ +import { test as setup, expect } from '@playwright/test'; +import { authFile } from './playwright.config'; + +setup('authenticate', async ({ page, context, baseURL }) => { + await page.goto('/'); + await page.getByLabel("Username or email").fill("doug"); + await page.getByLabel("Password").fill("unicorn123!@#"); + await page.getByRole("button", { name: "Log In" }).click(); + + // ensure auth cookies were set + const cookies = await context.cookies(); + const keycloakCookie = cookies.find( + (cookie) => cookie.name === "KEYCLOAK_SESSION", + ); + + expect(keycloakCookie).toBeDefined(); + expect(keycloakCookie?.value).not.toBe(""); + expect(keycloakCookie?.domain).toContain("sso."); + + await page.context().storageState({ path: authFile }); + + await page.waitForURL('/'); // successful redirect + console.log('Cookies:', cookies); +}) diff --git a/tests/jenkins.test.ts b/tests/jenkins.test.ts new file mode 100644 index 0000000..7928d84 --- /dev/null +++ b/tests/jenkins.test.ts @@ -0,0 +1,97 @@ +import { test, expect, devices } from '@playwright/test'; + +test.describe('Jenkins Pipeline', () => { + const randomSuffix = Math.floor(Math.random() * 10000); // Generate a random number + let defaultBrowserType: string; + + test.beforeEach(async ({ browserName }) => { + // Use browserName provided by Playwright to determine the browser type + defaultBrowserType = browserName; + }); + + test('should create a simple pipeline and check its status', async ({ page }) => { + const pipelineName = `example-pipeline-${defaultBrowserType}-${randomSuffix}`; + // Navigate to Jenkins dashboard + await page.goto('/'); + + // Wait for the dashboard to load and verify login by checking for the logout button + await page.waitForSelector('a[href="/logout"]'); + console.log('Logged in successfully using stored auth state'); + + // Retrieve and print cookies + const cookies = await page.context().cookies(); + console.log('Cookies:', cookies); + + // Wait for the "New Item" link to be visible and click it + await page.waitForSelector('a.task-link[href="/view/all/newJob"]', { timeout: 30000 }); + console.log('New Item link is visible'); + + await page.click('a.task-link[href="/view/all/newJob"]'); + console.log('Clicked on New Item link'); + + // Enter pipeline name + await page.fill('input[name="name"]', pipelineName); + console.log(`Entered pipeline name: ${pipelineName}`); + + // Select 'Pipeline' type + await page.click('li.org_jenkinsci_plugins_workflow_job_WorkflowJob'); + + // Verify if 'Pipeline' type is checked (aria-checked="true") + await page.waitForSelector('li.org_jenkinsci_plugins_workflow_job_WorkflowJob.active[aria-checked="true"]', { timeout: 5000 }); + console.log('Pipeline job type is checked'); + + // Click OK to create the pipeline + await page.click('button[type="submit"]'); + console.log('Clicked OK to create the pipeline'); + + // Wait for the configuration page to load + await page.waitForSelector('div.jenkins-section__title#pipeline'); + console.log('Configuration page loaded'); + + // Enter a simple pipeline script + const pipelineScript = ` + pipeline { + agent any + stages { + stage('Build') { + steps { + echo 'Building...' + } + } + stage('Test') { + steps { + echo 'Testing...' + } + } + stage('Deploy') { + steps { + echo 'Deploying...' + } + } + } + } + `; + await page.fill('.ace_text-input', pipelineScript); + console.log('Entered pipeline script'); + + // Save the pipeline + await page.click('button[name="Submit"]'); + console.log('Saved the pipeline configuration'); + + // Run the pipeline + await page.click(`a[href="/job/${pipelineName}/build?delay=0sec"]`); + console.log('Triggered the pipeline build'); + + // Wait for the build to start and complete + await page.waitForTimeout(10000); // Wait for 10 seconds + console.log('Waited for the build to complete'); + + // Check the build status + await page.goto(`/job/${pipelineName}/lastBuild`); + console.log('Navigated to the last build page'); + + // Assert that the build was successful + await page.waitForSelector('svg[tooltip="Success"][title="Success"]', { timeout: 60000 }); + console.log('Build was successful'); + }); +}); diff --git a/tests/package-lock.json b/tests/package-lock.json new file mode 100644 index 0000000..77651a60 --- /dev/null +++ b/tests/package-lock.json @@ -0,0 +1,104 @@ +{ + "name": "uds-package-mattermost", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "uds-package-mattermost", + "license": "Apache-2.0", + "devDependencies": { + "@playwright/test": "^1.43.1", + "@types/node": "^20.12.12", + "typescript": "^5.4.5" + } + }, + "node_modules/@playwright/test": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.43.1.tgz", + "integrity": "sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==", + "dev": true, + "dependencies": { + "playwright": "1.43.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@types/node": { + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/playwright": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.43.1.tgz", + "integrity": "sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==", + "dev": true, + "dependencies": { + "playwright-core": "1.43.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.43.1.tgz", + "integrity": "sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==", + "dev": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + } + } +} diff --git a/tests/package.json b/tests/package.json new file mode 100644 index 0000000..4b28f77 --- /dev/null +++ b/tests/package.json @@ -0,0 +1,9 @@ +{ + "name": "uds-package-mattermost", + "license": "Apache-2.0", + "devDependencies": { + "@playwright/test": "^1.43.1", + "@types/node": "^20.12.12", + "typescript": "^5.4.5" + } +} diff --git a/tests/playwright.config.ts b/tests/playwright.config.ts new file mode 100644 index 0000000..8b4e5c3 --- /dev/null +++ b/tests/playwright.config.ts @@ -0,0 +1,44 @@ +import { defineConfig, devices } from '@playwright/test'; + +export const playwrightDir = '.playwright'; +export const authFile = `${playwrightDir}/auth/user.json`; + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + timeout: 5 * 60 * 1000, + fullyParallel: true, + forbidOnly: !!process.env.CI, // fail CI if you accidently leave `test.only` in source + retries: process.env.CI ? 1 : 0, + workers: 1, + reporter: [ + // Reporter to use. See https://playwright.dev/docs/test-reporters + ['html', { outputFolder: `${playwrightDir}/reports`, open: 'never' }], + ['json', { outputFile: `${playwrightDir}/reports/test-results.json`, open: 'never' }], + ['list'] + ], + + outputDir: `${playwrightDir}/output`, + + use: { + baseURL: process.env.BASE_URL || 'https://jenkins.uds.dev', // for `await page.goto('/')` etc + trace: 'on-first-retry', // collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer + }, + + projects: [ + { name: 'setup', testMatch: /.*\.setup\.ts/ }, // authentication + + ...[ + 'Desktop Chrome', + 'Desktop Firefox', + ].map((p) => ({ + name: devices[p].defaultBrowserType, + dependencies: ['setup'], + use: { + ...devices[p], + storageState: authFile, + }, + })), + ], +}); diff --git a/tests/tsconfig.json b/tests/tsconfig.json new file mode 100644 index 0000000..a3b60e8 --- /dev/null +++ b/tests/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "module": "commonjs", /* Specify what module code is generated. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + "strict": true, /* Enable all strict type-checking options. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} From 9e37ba2223315bdc512aa53be9864e7a0a8dc42a Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Mon, 15 Jul 2024 17:30:01 +0000 Subject: [PATCH 02/24] cleaning up some things --- tests/auth.setup.ts | 1 - tests/jenkins.test.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/auth.setup.ts b/tests/auth.setup.ts index 21da279..b0023b6 100644 --- a/tests/auth.setup.ts +++ b/tests/auth.setup.ts @@ -20,5 +20,4 @@ setup('authenticate', async ({ page, context, baseURL }) => { await page.context().storageState({ path: authFile }); await page.waitForURL('/'); // successful redirect - console.log('Cookies:', cookies); }) diff --git a/tests/jenkins.test.ts b/tests/jenkins.test.ts index 7928d84..78f4b9d 100644 --- a/tests/jenkins.test.ts +++ b/tests/jenkins.test.ts @@ -9,7 +9,7 @@ test.describe('Jenkins Pipeline', () => { defaultBrowserType = browserName; }); - test('should create a simple pipeline and check its status', async ({ page }) => { + test('Should create a simple pipeline and check its status', async ({ page }) => { const pipelineName = `example-pipeline-${defaultBrowserType}-${randomSuffix}`; // Navigate to Jenkins dashboard await page.goto('/'); From a78cc15f1364bf65944317c0b1bd5744cb8be160 Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Thu, 18 Jul 2024 17:32:01 +0000 Subject: [PATCH 03/24] ci: Upgraded runners --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index b7dd866..5c5bf19 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -34,7 +34,7 @@ permissions: jobs: run-test: name: ${{ matrix.type }} ${{ matrix.flavor }} - runs-on: ubuntu-latest + runs-on: uds-marketplace-ubuntu-big-boy-8-core timeout-minutes: 25 strategy: matrix: From 191f34485968f4301405d05e6141770e552f9eb2 Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Thu, 18 Jul 2024 18:22:26 +0000 Subject: [PATCH 04/24] maybe fix the test by expecting the baseurl instead of a / --- .github/workflows/test.yaml | 24 ++++++++++++++++++++++++ tests/auth.setup.ts | 4 +++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 5c5bf19..c079b81 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -63,3 +63,27 @@ jobs: uses: defenseunicorns/uds-common/.github/actions/save-logs@772b3337950b7c8e0882c527263684306bba7ce4 # v0.7.1 with: suffix: ${{ matrix.type }}-${{ matrix.flavor }}-${{ github.run_id }}-${{ github.run_attempt }} + + - name: Print cluster info + if: always() + shell: bash -e -o pipefail {0} + run: | + kubectl get nodes -o wide + + - name: Print pod info + if: always() + shell: bash -e -o pipefail {0} + run: | + kubectl get pods -A -o wide + + - name: Print service info + if: always() + shell: bash -e -o pipefail {0} + run: | + kubectl get svc -A -o wide + + - name: Print events + if: always() + shell: bash -e -o pipefail {0} + run: | + kubectl get events -A -o wide diff --git a/tests/auth.setup.ts b/tests/auth.setup.ts index b0023b6..b93c3ea 100644 --- a/tests/auth.setup.ts +++ b/tests/auth.setup.ts @@ -19,5 +19,7 @@ setup('authenticate', async ({ page, context, baseURL }) => { await page.context().storageState({ path: authFile }); - await page.waitForURL('/'); // successful redirect + await page.waitForURL(baseURL); // successful redirect + + await expect(page).toHaveURL(baseURL); }) From 6d533ec6d91cb057667538e075df0da8eb9756f1 Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Thu, 18 Jul 2024 18:43:34 +0000 Subject: [PATCH 05/24] swapped urls --- tests/auth.setup.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/auth.setup.ts b/tests/auth.setup.ts index b93c3ea..c63348c 100644 --- a/tests/auth.setup.ts +++ b/tests/auth.setup.ts @@ -2,7 +2,7 @@ import { test as setup, expect } from '@playwright/test'; import { authFile } from './playwright.config'; setup('authenticate', async ({ page, context, baseURL }) => { - await page.goto('/'); + await page.goto(baseURL); await page.getByLabel("Username or email").fill("doug"); await page.getByLabel("Password").fill("unicorn123!@#"); await page.getByRole("button", { name: "Log In" }).click(); From 6f9e39832d5ed9ecafb243f4ec9d61396ee13e54 Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Thu, 18 Jul 2024 19:12:50 +0000 Subject: [PATCH 06/24] CI debug --- tests/auth.setup.ts | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/tests/auth.setup.ts b/tests/auth.setup.ts index c63348c..c9adb62 100644 --- a/tests/auth.setup.ts +++ b/tests/auth.setup.ts @@ -2,24 +2,27 @@ import { test as setup, expect } from '@playwright/test'; import { authFile } from './playwright.config'; setup('authenticate', async ({ page, context, baseURL }) => { - await page.goto(baseURL); - await page.getByLabel("Username or email").fill("doug"); - await page.getByLabel("Password").fill("unicorn123!@#"); - await page.getByRole("button", { name: "Log In" }).click(); + try { + await page.goto(baseURL); + await page.getByLabel("Username or email").fill("doug"); + await page.getByLabel("Password").fill("unicorn123!@#"); + await page.getByRole("button", { name: "Log In" }).click(); - // ensure auth cookies were set - const cookies = await context.cookies(); - const keycloakCookie = cookies.find( - (cookie) => cookie.name === "KEYCLOAK_SESSION", - ); + // ensure auth cookies were set + const cookies = await context.cookies(); + const keycloakCookie = cookies.find( + (cookie) => cookie.name === "KEYCLOAK_SESSION", + ); - expect(keycloakCookie).toBeDefined(); - expect(keycloakCookie?.value).not.toBe(""); - expect(keycloakCookie?.domain).toContain("sso."); + expect(keycloakCookie).toBeDefined(); + expect(keycloakCookie?.value).not.toBe(""); + expect(keycloakCookie?.domain).toContain("sso."); - await page.context().storageState({ path: authFile }); + await page.context().storageState({ path: authFile }); - await page.waitForURL(baseURL); // successful redirect - - await expect(page).toHaveURL(baseURL); + await expect(page).toHaveURL(baseURL); + } catch (error) { + await page.screenshot({ path: 'screenshot.png' }); + throw error; // rethrow the error after taking the screenshot +} }) From ad2a4654228f7caa53dbaadbe6ddf2231800b987 Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Thu, 18 Jul 2024 19:16:24 +0000 Subject: [PATCH 07/24] Upload screenshot artifact on failure --- .github/workflows/test.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index c079b81..e0d13e6 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -87,3 +87,10 @@ jobs: shell: bash -e -o pipefail {0} run: | kubectl get events -A -o wide + + - name: Upload screenshot on failure + if: failure() + uses: actions/upload-artifact@v2 + with: + name: playwright-screenshot + path: screenshot.png From f05fb03723e41d121d9e58b6ec36c5c49307cb5b Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Thu, 18 Jul 2024 19:41:02 +0000 Subject: [PATCH 08/24] ci troubleshooting --- .github/workflows/test.yaml | 2 +- .gitignore | 1 + tests/auth.setup.ts | 20 +++++++++++++------- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index e0d13e6..58cf623 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -93,4 +93,4 @@ jobs: uses: actions/upload-artifact@v2 with: name: playwright-screenshot - path: screenshot.png + path: tests/screenshots/screenshot.png \ No newline at end of file diff --git a/.gitignore b/.gitignore index c78a6c3..81bfb03 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ terraform.tfstate.backup # Tests node_modules/ .playwright/ +screenshots/ diff --git a/tests/auth.setup.ts b/tests/auth.setup.ts index c9adb62..96dab13 100644 --- a/tests/auth.setup.ts +++ b/tests/auth.setup.ts @@ -1,9 +1,13 @@ import { test as setup, expect } from '@playwright/test'; import { authFile } from './playwright.config'; +import path from 'path'; + +const screenshotPath = path.resolve(__dirname, 'screenshots', 'screenshot.png'); setup('authenticate', async ({ page, context, baseURL }) => { - try { - await page.goto(baseURL); + console.log('Current working directory:', process.cwd()); + console.log('Screenshot will be saved to:', screenshotPath); + await page.goto('https://jenkins.uds.dev/'); await page.getByLabel("Username or email").fill("doug"); await page.getByLabel("Password").fill("unicorn123!@#"); await page.getByRole("button", { name: "Log In" }).click(); @@ -20,9 +24,11 @@ setup('authenticate', async ({ page, context, baseURL }) => { await page.context().storageState({ path: authFile }); - await expect(page).toHaveURL(baseURL); - } catch (error) { - await page.screenshot({ path: 'screenshot.png' }); - throw error; // rethrow the error after taking the screenshot -} + try { + await expect(page).toHaveURL('https://jenkins.uds.dev/'); + } catch (error) { + console.log('URL assertion failed'); + await page.screenshot({ path: screenshotPath }); + throw error; // Rethrow the error after taking the screenshot + } }) From f22db527067130d81faaa3a161fced3283627c7b Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Thu, 18 Jul 2024 20:30:17 +0000 Subject: [PATCH 09/24] ci debug --- .github/workflows/test.yaml | 2 +- tests/auth.setup.ts | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 58cf623..4ed0457 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -93,4 +93,4 @@ jobs: uses: actions/upload-artifact@v2 with: name: playwright-screenshot - path: tests/screenshots/screenshot.png \ No newline at end of file + path: tests/screenshots/screenshot.png diff --git a/tests/auth.setup.ts b/tests/auth.setup.ts index 96dab13..86e2808 100644 --- a/tests/auth.setup.ts +++ b/tests/auth.setup.ts @@ -2,7 +2,16 @@ import { test as setup, expect } from '@playwright/test'; import { authFile } from './playwright.config'; import path from 'path'; -const screenshotPath = path.resolve(__dirname, 'screenshots', 'screenshot.png'); +// Function to generate a unique screenshot filename +const getUniqueScreenshotPath = () => { + let index = 1; + let screenshotPath = path.resolve(__dirname, 'screenshots', `screenshot${index}.png`); + while (fs.existsSync(screenshotPath)) { + index++; + screenshotPath = path.resolve(__dirname, 'screenshots', `screenshot${index}.png`); + } + return screenshotPath; +}; setup('authenticate', async ({ page, context, baseURL }) => { console.log('Current working directory:', process.cwd()); @@ -10,6 +19,9 @@ setup('authenticate', async ({ page, context, baseURL }) => { await page.goto('https://jenkins.uds.dev/'); await page.getByLabel("Username or email").fill("doug"); await page.getByLabel("Password").fill("unicorn123!@#"); + const screenshotPath = getUniqueScreenshotPath(); + console.log('Screenshot will be saved to:', screenshotPath); + await page.screenshot({ path: screenshotPath }); await page.getByRole("button", { name: "Log In" }).click(); // ensure auth cookies were set @@ -28,6 +40,9 @@ setup('authenticate', async ({ page, context, baseURL }) => { await expect(page).toHaveURL('https://jenkins.uds.dev/'); } catch (error) { console.log('URL assertion failed'); + const currentURL = page.url(); + const screenshotPath = getUniqueScreenshotPath(); + console.log('Screenshot will be saved to:', screenshotPath); await page.screenshot({ path: screenshotPath }); throw error; // Rethrow the error after taking the screenshot } From a9139212b1923978ccef084836e5d59beb99bdae Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Thu, 18 Jul 2024 20:31:52 +0000 Subject: [PATCH 10/24] added import --- tests/auth.setup.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/auth.setup.ts b/tests/auth.setup.ts index 86e2808..767e508 100644 --- a/tests/auth.setup.ts +++ b/tests/auth.setup.ts @@ -1,6 +1,7 @@ import { test as setup, expect } from '@playwright/test'; import { authFile } from './playwright.config'; import path from 'path'; +import fs from 'fs'; // Function to generate a unique screenshot filename const getUniqueScreenshotPath = () => { From b7c24f43e991a283124b268ff86a6ce7bd565ab5 Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Thu, 18 Jul 2024 20:32:56 +0000 Subject: [PATCH 11/24] ci debug --- tests/auth.setup.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/auth.setup.ts b/tests/auth.setup.ts index 767e508..8c6e0f2 100644 --- a/tests/auth.setup.ts +++ b/tests/auth.setup.ts @@ -16,7 +16,6 @@ const getUniqueScreenshotPath = () => { setup('authenticate', async ({ page, context, baseURL }) => { console.log('Current working directory:', process.cwd()); - console.log('Screenshot will be saved to:', screenshotPath); await page.goto('https://jenkins.uds.dev/'); await page.getByLabel("Username or email").fill("doug"); await page.getByLabel("Password").fill("unicorn123!@#"); From e044fdb0723ebb9294ac429dd35dcab8381bdc34 Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Thu, 18 Jul 2024 20:45:56 +0000 Subject: [PATCH 12/24] Made screenshot names more explicit and added new action to grab that --- .github/workflows/test.yaml | 2 +- tests/auth.setup.ts | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 4ed0457..dc91d54 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -93,4 +93,4 @@ jobs: uses: actions/upload-artifact@v2 with: name: playwright-screenshot - path: tests/screenshots/screenshot.png + path: tests/screenshots/* diff --git a/tests/auth.setup.ts b/tests/auth.setup.ts index 8c6e0f2..d983b5e 100644 --- a/tests/auth.setup.ts +++ b/tests/auth.setup.ts @@ -3,13 +3,13 @@ import { authFile } from './playwright.config'; import path from 'path'; import fs from 'fs'; -// Function to generate a unique screenshot filename -const getUniqueScreenshotPath = () => { +// Function to generate a unique screenshot filename with a custom base name +const getUniqueScreenshotPath = (baseName: string) => { let index = 1; - let screenshotPath = path.resolve(__dirname, 'screenshots', `screenshot${index}.png`); + let screenshotPath = path.resolve(__dirname, 'screenshots', `${baseName}${index}.png`); while (fs.existsSync(screenshotPath)) { index++; - screenshotPath = path.resolve(__dirname, 'screenshots', `screenshot${index}.png`); + screenshotPath = path.resolve(__dirname, 'screenshots', `${baseName}.png`); } return screenshotPath; }; @@ -19,7 +19,7 @@ setup('authenticate', async ({ page, context, baseURL }) => { await page.goto('https://jenkins.uds.dev/'); await page.getByLabel("Username or email").fill("doug"); await page.getByLabel("Password").fill("unicorn123!@#"); - const screenshotPath = getUniqueScreenshotPath(); + const screenshotPath = getUniqueScreenshotPath('beforeLogin'); console.log('Screenshot will be saved to:', screenshotPath); await page.screenshot({ path: screenshotPath }); await page.getByRole("button", { name: "Log In" }).click(); @@ -41,7 +41,7 @@ setup('authenticate', async ({ page, context, baseURL }) => { } catch (error) { console.log('URL assertion failed'); const currentURL = page.url(); - const screenshotPath = getUniqueScreenshotPath(); + const screenshotPath = getUniqueScreenshotPath('afterLogin'); console.log('Screenshot will be saved to:', screenshotPath); await page.screenshot({ path: screenshotPath }); throw error; // Rethrow the error after taking the screenshot From 8e4011c77008434213826cf107ae7c27c98e0c71 Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Thu, 18 Jul 2024 20:46:49 +0000 Subject: [PATCH 13/24] lint --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index dc91d54..a217e21 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -93,4 +93,4 @@ jobs: uses: actions/upload-artifact@v2 with: name: playwright-screenshot - path: tests/screenshots/* + path: tests/screenshots/* From f9a03693a3f4b302657050ab7ffbe5b3e3f47d4e Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Thu, 18 Jul 2024 21:00:26 +0000 Subject: [PATCH 14/24] CI debug --- .github/workflows/test.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index a217e21..2c186d0 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -88,6 +88,12 @@ jobs: run: | kubectl get events -A -o wide + - name: Print Jenkins pod logs + if: always() + shell: bash -e -o pipefail {0} + run: | + kubectl logs jenkins-0 -n jenkins + - name: Upload screenshot on failure if: failure() uses: actions/upload-artifact@v2 From 2c51e5a9c3e198c00d13650d7d08d3753882e92c Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Thu, 18 Jul 2024 22:07:36 +0000 Subject: [PATCH 15/24] messing with some netpols --- chart/templates/uds-package.yaml | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/chart/templates/uds-package.yaml b/chart/templates/uds-package.yaml index b79365c..a072be6 100644 --- a/chart/templates/uds-package.yaml +++ b/chart/templates/uds-package.yaml @@ -23,7 +23,7 @@ spec: network: expose: - service: jenkins - podLabels: + selector: app.kubernetes.io/name: jenkins gateway: tenant host: jenkins @@ -36,19 +36,29 @@ spec: remoteGenerated: IntraNamespace - direction: Egress - podLabels: + remoteGenerated: Anywhere + selector: app.kubernetes.io/name: jenkins port: 443 description: "Jenkins-plugins & SSO" - direction: Egress - podLabels: + remoteNamespace: keycloak + remoteSelector: + app.kubernetes.io/name: keycloak + selector: + app.kubernetes.io/name: jenkins + port: 8080 + description: "SSO Internal" + + - direction: Egress + selector: jenkins/label: jenkins-jenkins-agent port: 443 description: "Jenkins-jobs phone home" - direction: Egress - podLabels: + selector: app.kubernetes.io/name: jenkins remoteGenerated: KubeAPI From e354d58251c8277a48463664d488b7d0d4f4fc6b Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Fri, 19 Jul 2024 16:55:32 +0000 Subject: [PATCH 16/24] extra ci logging --- .github/workflows/test.yaml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 2c186d0..c1fdd95 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -94,6 +94,18 @@ jobs: run: | kubectl logs jenkins-0 -n jenkins + - name: Print Jenkins OIC configmap + if: always() + shell: bash -e -o pipefail {0} + run: | + kubectl get configmap jenkins-jenkins-config-keycloak -n jenkins -o yaml + + - name: Print Jenkins OIC secret + if: always() + shell: bash -e -o pipefail {0} + run: | + kubectl get secrets sso-client-uds-package-jenkins -n jenkins -o=jsonpath='{.data.secret}' | base64 -d + - name: Upload screenshot on failure if: failure() uses: actions/upload-artifact@v2 From 6f66b62e41b4fe57ea2c6270190ffd6e30df5b74 Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Fri, 19 Jul 2024 17:14:09 +0000 Subject: [PATCH 17/24] changed wait behavior to ensure the required secret is present --- common/zarf.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/common/zarf.yaml b/common/zarf.yaml index a1b6a99..498888b 100644 --- a/common/zarf.yaml +++ b/common/zarf.yaml @@ -18,10 +18,9 @@ components: after: - wait: cluster: - kind: package - name: jenkins + kind: secret + name: sso-client-uds-package-jenkins namespace: jenkins - condition: "'{.status.phase}'=Ready" - cmd: zarf tools kubectl get secrets sso-client-uds-package-jenkins -n jenkins -o=jsonpath='{.data.secret}' | base64 -d mute: true setVariables: From c221cc40210a5cd98f7dca91e912f816e6342d7d Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Fri, 19 Jul 2024 17:25:29 +0000 Subject: [PATCH 18/24] moving secret location --- common/zarf.yaml | 4 ++++ zarf.yaml | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/common/zarf.yaml b/common/zarf.yaml index 498888b..759d9c0 100644 --- a/common/zarf.yaml +++ b/common/zarf.yaml @@ -4,6 +4,10 @@ metadata: name: jenkins-common description: "UDS jenkins Common Package" +variables: + - name: JENKINS_CLIENT_SECRET + default: "" + components: - name: jenkins-config required: true diff --git a/zarf.yaml b/zarf.yaml index 201ad3d..f8386d7 100644 --- a/zarf.yaml +++ b/zarf.yaml @@ -11,8 +11,6 @@ metadata: variables: - name: DOMAIN default: "uds.dev" - - name: JENKINS_CLIENT_SECRET - default: "" components: - name: jenkins-config From 4b7456bd7a4f2fa74f0c25606dde8def5aac4071 Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Fri, 19 Jul 2024 17:43:39 +0000 Subject: [PATCH 19/24] throwing stuff at the wall --- common/zarf.yaml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/common/zarf.yaml b/common/zarf.yaml index 759d9c0..ee37df0 100644 --- a/common/zarf.yaml +++ b/common/zarf.yaml @@ -17,9 +17,20 @@ components: namespace: jenkins version: 0.1.0 localPath: ../chart + - name: jenkins + required: true + charts: + - name: jenkins + namespace: jenkins + url: https://charts.jenkins.io + version: 5.3.4 + repoName: jenkins + releaseName: jenkins + valuesFiles: + - ../values/common.yaml actions: onDeploy: - after: + before: - wait: cluster: kind: secret @@ -30,14 +41,3 @@ components: setVariables: - name: JENKINS_CLIENT_SECRET sensitive: true - - name: jenkins - required: true - charts: - - name: jenkins - namespace: jenkins - url: https://charts.jenkins.io - version: 5.3.4 - repoName: jenkins - releaseName: jenkins - valuesFiles: - - ../values/common.yaml From f21d237d933c36ef707244114be9852e0f25fbae Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Fri, 19 Jul 2024 18:53:11 +0000 Subject: [PATCH 20/24] Maybe uds --- common/zarf.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/zarf.yaml b/common/zarf.yaml index ee37df0..fbfdd87 100644 --- a/common/zarf.yaml +++ b/common/zarf.yaml @@ -36,7 +36,7 @@ components: kind: secret name: sso-client-uds-package-jenkins namespace: jenkins - - cmd: zarf tools kubectl get secrets sso-client-uds-package-jenkins -n jenkins -o=jsonpath='{.data.secret}' | base64 -d + - cmd: ./uds zarf tools kubectl get secrets sso-client-uds-package-jenkins -n jenkins -o=jsonpath='{.data.secret}' | base64 -d mute: true setVariables: - name: JENKINS_CLIENT_SECRET From 74ecf729bf3cfb2aa214f4dff78244f8f6f089ee Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Fri, 19 Jul 2024 18:53:27 +0000 Subject: [PATCH 21/24] remove the uds in cmd --- common/zarf.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/zarf.yaml b/common/zarf.yaml index fbfdd87..950c900 100644 --- a/common/zarf.yaml +++ b/common/zarf.yaml @@ -36,7 +36,7 @@ components: kind: secret name: sso-client-uds-package-jenkins namespace: jenkins - - cmd: ./uds zarf tools kubectl get secrets sso-client-uds-package-jenkins -n jenkins -o=jsonpath='{.data.secret}' | base64 -d + - cmd: ./zarf tools kubectl get secrets sso-client-uds-package-jenkins -n jenkins -o=jsonpath='{.data.secret}' | base64 -d mute: true setVariables: - name: JENKINS_CLIENT_SECRET From 3fcfcc21c5d9fbeaa31f0d19d8a7eec16659c406 Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Fri, 19 Jul 2024 20:26:03 +0000 Subject: [PATCH 22/24] updated testing to take more screenshots --- .github/workflows/test.yaml | 12 ------------ common/zarf.yaml | 27 ++++++++++++++------------- tests/auth.setup.ts | 12 +++--------- tests/jenkins.test.ts | 33 +++++++++++++++++++++++++-------- 4 files changed, 42 insertions(+), 42 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index c1fdd95..2c186d0 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -94,18 +94,6 @@ jobs: run: | kubectl logs jenkins-0 -n jenkins - - name: Print Jenkins OIC configmap - if: always() - shell: bash -e -o pipefail {0} - run: | - kubectl get configmap jenkins-jenkins-config-keycloak -n jenkins -o yaml - - - name: Print Jenkins OIC secret - if: always() - shell: bash -e -o pipefail {0} - run: | - kubectl get secrets sso-client-uds-package-jenkins -n jenkins -o=jsonpath='{.data.secret}' | base64 -d - - name: Upload screenshot on failure if: failure() uses: actions/upload-artifact@v2 diff --git a/common/zarf.yaml b/common/zarf.yaml index 950c900..2aacedd 100644 --- a/common/zarf.yaml +++ b/common/zarf.yaml @@ -17,6 +17,20 @@ components: namespace: jenkins version: 0.1.0 localPath: ../chart + actions: + onDeploy: + after: + - wait: + cluster: + kind: package + name: jenkins + namespace: jenkins + condition: "'{.status.phase}'=Ready" + - cmd: ./zarf tools kubectl get secrets sso-client-uds-package-jenkins -n jenkins -o=jsonpath='{.data.secret}' | base64 -d + mute: true + setVariables: + - name: JENKINS_CLIENT_SECRET + sensitive: true - name: jenkins required: true charts: @@ -28,16 +42,3 @@ components: releaseName: jenkins valuesFiles: - ../values/common.yaml - actions: - onDeploy: - before: - - wait: - cluster: - kind: secret - name: sso-client-uds-package-jenkins - namespace: jenkins - - cmd: ./zarf tools kubectl get secrets sso-client-uds-package-jenkins -n jenkins -o=jsonpath='{.data.secret}' | base64 -d - mute: true - setVariables: - - name: JENKINS_CLIENT_SECRET - sensitive: true diff --git a/tests/auth.setup.ts b/tests/auth.setup.ts index d983b5e..fe2742d 100644 --- a/tests/auth.setup.ts +++ b/tests/auth.setup.ts @@ -1,22 +1,16 @@ import { test as setup, expect } from '@playwright/test'; import { authFile } from './playwright.config'; import path from 'path'; -import fs from 'fs'; // Function to generate a unique screenshot filename with a custom base name const getUniqueScreenshotPath = (baseName: string) => { - let index = 1; - let screenshotPath = path.resolve(__dirname, 'screenshots', `${baseName}${index}.png`); - while (fs.existsSync(screenshotPath)) { - index++; - screenshotPath = path.resolve(__dirname, 'screenshots', `${baseName}.png`); - } + let screenshotPath = path.resolve(__dirname, 'screenshots', `${baseName}.png`); return screenshotPath; }; setup('authenticate', async ({ page, context, baseURL }) => { console.log('Current working directory:', process.cwd()); - await page.goto('https://jenkins.uds.dev/'); + await page.goto(baseURL); await page.getByLabel("Username or email").fill("doug"); await page.getByLabel("Password").fill("unicorn123!@#"); const screenshotPath = getUniqueScreenshotPath('beforeLogin'); @@ -37,7 +31,7 @@ setup('authenticate', async ({ page, context, baseURL }) => { await page.context().storageState({ path: authFile }); try { - await expect(page).toHaveURL('https://jenkins.uds.dev/'); + await expect(page).toHaveURL(baseURL); } catch (error) { console.log('URL assertion failed'); const currentURL = page.url(); diff --git a/tests/jenkins.test.ts b/tests/jenkins.test.ts index 78f4b9d..939fa34 100644 --- a/tests/jenkins.test.ts +++ b/tests/jenkins.test.ts @@ -1,18 +1,26 @@ import { test, expect, devices } from '@playwright/test'; +import path from 'path'; + +// Function to generate a unique screenshot filename with a custom base name +const getUniqueScreenshotPath = (baseName: string) => { + let screenshotPath = path.resolve(__dirname, 'screenshots', `${defaultBrowserType}-${baseName}.png`); + return screenshotPath; +}; + +let defaultBrowserType: string; + +test.beforeEach(async ({ browserName }) => { + // Use browserName provided by Playwright to determine the browser type + defaultBrowserType = browserName; +}); test.describe('Jenkins Pipeline', () => { const randomSuffix = Math.floor(Math.random() * 10000); // Generate a random number - let defaultBrowserType: string; - - test.beforeEach(async ({ browserName }) => { - // Use browserName provided by Playwright to determine the browser type - defaultBrowserType = browserName; - }); - test('Should create a simple pipeline and check its status', async ({ page }) => { + test('Should create a simple pipeline and check its status', async ({ page, baseURL }) => { const pipelineName = `example-pipeline-${defaultBrowserType}-${randomSuffix}`; // Navigate to Jenkins dashboard - await page.goto('/'); + await page.goto(baseURL); // Wait for the dashboard to load and verify login by checking for the logout button await page.waitForSelector('a[href="/logout"]'); @@ -30,6 +38,7 @@ test.describe('Jenkins Pipeline', () => { console.log('Clicked on New Item link'); // Enter pipeline name + await page.waitForTimeout(2000); await page.fill('input[name="name"]', pipelineName); console.log(`Entered pipeline name: ${pipelineName}`); @@ -39,6 +48,8 @@ test.describe('Jenkins Pipeline', () => { // Verify if 'Pipeline' type is checked (aria-checked="true") await page.waitForSelector('li.org_jenkinsci_plugins_workflow_job_WorkflowJob.active[aria-checked="true"]', { timeout: 5000 }); console.log('Pipeline job type is checked'); + var screenshotPath = getUniqueScreenshotPath('job-page'); + await page.screenshot({ path: screenshotPath }); // Click OK to create the pipeline await page.click('button[type="submit"]'); @@ -71,8 +82,12 @@ test.describe('Jenkins Pipeline', () => { } } `; + await page.waitForTimeout(2000); await page.fill('.ace_text-input', pipelineScript); console.log('Entered pipeline script'); + await page.waitForTimeout(2000); + screenshotPath = getUniqueScreenshotPath('pipeline-page'); + await page.screenshot({ path: screenshotPath }); // Save the pipeline await page.click('button[name="Submit"]'); @@ -93,5 +108,7 @@ test.describe('Jenkins Pipeline', () => { // Assert that the build was successful await page.waitForSelector('svg[tooltip="Success"][title="Success"]', { timeout: 60000 }); console.log('Build was successful'); + screenshotPath = getUniqueScreenshotPath('results-page'); + await page.screenshot({ path: screenshotPath }); }); }); From a2d6084cca6d68bbbc2ef90ccf92a333bd93428b Mon Sep 17 00:00:00 2001 From: Michael-Kruggel Date: Fri, 19 Jul 2024 20:59:13 +0000 Subject: [PATCH 23/24] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index af8ff01..21e0f1b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 🚚 UDS Jenkins Zarf Package +# 🏪 UDS Jenkins Zarf Package [![Latest Release](https://img.shields.io/github/v/release/defenseunicorns/uds-package-jenkins)](https://github.com/defenseunicorns/uds-package-jenkins/releases) [![Build Status](https://img.shields.io/github/actions/workflow/status/defenseunicorns/uds-package-jenkins/tag-and-release.yaml)](https://github.com/defenseunicorns/uds-package-jenkins/actions/workflows/tag-and-release.yaml) From edef3b461332a445c82b5b3e653a81c99ca17262 Mon Sep 17 00:00:00 2001 From: Michael Kruggel <108417058+Michael-Kruggel@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:00:04 -0700 Subject: [PATCH 24/24] Update test.yaml --- tasks/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/test.yaml b/tasks/test.yaml index ce647b7..dfe00c3 100644 --- a/tasks/test.yaml +++ b/tasks/test.yaml @@ -18,7 +18,7 @@ tasks: code: 200 - name: ui - description: Mattermost UI Checks + description: Jenkins UI Checks actions: - cmd: npm ci dir: tests