From 560e416032bc3fc5510bc5f539316b0ba4fda892 Mon Sep 17 00:00:00 2001 From: Axel Hecht Date: Mon, 7 Dec 2020 16:11:58 +0100 Subject: [PATCH 01/32] Stop checking out workspace (#515) * Stop checking out base branch before deployment, drop option. * Don't check out default branch, as we don't check out base branch, drop option. * Don't stash/unstash as we don't update the workdir, drop preserve option. * Don't init the workspace * Only fetch the remote branch if it exists, only with depth 1. * Rely on previous checkouts to have handled lfs files correctly, drop option. * Update README, action.yml, integration tests --- .github/workflows/integration-beta.yml | 7 -- .github/workflows/integration.yml | 7 -- README.md | 4 - __tests__/git.test.ts | 160 ++----------------------- __tests__/main.test.ts | 5 +- action.yml | 12 -- src/constants.ts | 16 --- src/git.ts | 88 +------------- 8 files changed, 17 insertions(+), 282 deletions(-) diff --git a/.github/workflows/integration-beta.yml b/.github/workflows/integration-beta.yml index 0c9f80e55..373331e0f 100644 --- a/.github/workflows/integration-beta.yml +++ b/.github/workflows/integration-beta.yml @@ -21,7 +21,6 @@ jobs: ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} BRANCH: gh-pages-test FOLDER: integration - BASE_BRANCH: dev TARGET_FOLDER: cat/montezuma GIT_CONFIG_NAME: Montezuma GIT_CONFIG_EMAIL: montezuma@jamesiv.es @@ -49,7 +48,6 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} BRANCH: gh-pages-test FOLDER: integration - BASE_BRANCH: dev TARGET_FOLDER: cat/montezuma2 - name: Cleanup Generated Branch @@ -83,7 +81,6 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} BRANCH: gh-pages-test FOLDER: integration - BASE_BRANCH: dev TARGET_FOLDER: cat/montezuma2 - name: Cleanup Generated Branch @@ -114,7 +111,6 @@ jobs: SSH: true BRANCH: gh-pages-test FOLDER: integration - BASE_BRANCH: dev TARGET_FOLDER: cat/montezuma3 - name: Cleanup Generated Branch @@ -149,7 +145,6 @@ jobs: SSH: true BRANCH: gh-pages-test FOLDER: integration - BASE_BRANCH: dev TARGET_FOLDER: cat/montezuma4 - name: Cleanup Generated Branch @@ -175,7 +170,6 @@ jobs: ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} BRANCH: gh-pages-test FOLDER: integration - BASE_BRANCH: dev CLEAN: true # Deploys to a branch that doesn't exist with SINGLE_COMMIT. @@ -193,7 +187,6 @@ jobs: ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} BRANCH: integration-test-delete-beta FOLDER: integration - BASE_BRANCH: dev SINGLE_COMMIT: true - name: Cleanup Generated Branch diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index e4f42edd8..6db33996b 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -23,7 +23,6 @@ jobs: ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} BRANCH: gh-pages FOLDER: integration - BASE_BRANCH: dev TARGET_FOLDER: cat/montezuma GIT_CONFIG_NAME: Montezuma GIT_CONFIG_EMAIL: montezuma@jamesiv.es @@ -50,7 +49,6 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} BRANCH: gh-pages FOLDER: integration - BASE_BRANCH: dev TARGET_FOLDER: cat/montezuma2 - name: Cleanup Generated Branch @@ -84,7 +82,6 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} BRANCH: gh-pages FOLDER: integration - BASE_BRANCH: dev TARGET_FOLDER: cat/montezuma2 - name: Cleanup Generated Branch @@ -114,7 +111,6 @@ jobs: SSH: true BRANCH: gh-pages FOLDER: integration - BASE_BRANCH: dev TARGET_FOLDER: cat/montezuma3 - name: Cleanup Generated Branch @@ -148,7 +144,6 @@ jobs: SSH: true BRANCH: gh-pages FOLDER: integration - BASE_BRANCH: dev TARGET_FOLDER: cat/montezuma4 - name: Cleanup Generated Branch @@ -173,7 +168,6 @@ jobs: ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} BRANCH: gh-pages FOLDER: integration - BASE_BRANCH: dev CLEAN: true # Deploys to a branch that doesn't exist with SINGLE_COMMIT. @@ -192,7 +186,6 @@ jobs: ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} BRANCH: integration-test-delete-prod FOLDER: integration - BASE_BRANCH: dev SINGLE_COMMIT: true - name: Cleanup Generated Branch diff --git a/README.md b/README.md index bf0f44830..aa00c41f1 100644 --- a/README.md +++ b/README.md @@ -145,13 +145,10 @@ In addition to the deployment options you must also configure the following. | `GIT_CONFIG_EMAIL` | Allows you to customize the email that is attached to the git config which is used when pushing the deployment commits. If this is not included it will use the email in the GitHub context, followed by a generic noreply GitHub email. | `with` | **No** | | `REPOSITORY_NAME` | Allows you to specify a different repository path so long as you have permissions to push to it. This should be formatted like so: `JamesIves/github-pages-deploy-action`. You'll need to use an `ACCESS_TOKEN` for this configuration option to work properly. | `with` | **No** | | `TARGET_FOLDER` | If you'd like to push the contents of the deployment folder into a specific directory on the deployment branch you can specify it here. | `with` | **No** | -| `BASE_BRANCH` | The base branch of your repository which you'd like to checkout prior to deploying. This defaults to the current commit [SHA](http://en.wikipedia.org/wiki/SHA-1) that triggered the build followed by `master` if it doesn't exist. This is useful for making deployments from another branch, and also may be necessary when using a scheduled job. | `with` | **No** | | `COMMIT_MESSAGE` | If you need to customize the commit message for an integration you can do so. | `with` | **No** | | `CLEAN` | If your project generates hashed files on build you can use this option to automatically delete them from the deployment branch with each deploy. This option is turned on by default, and can be toggled off by setting it to `false`. | `with` | **No** | | `CLEAN_EXCLUDE` | If you need to use `CLEAN` but you'd like to preserve certain files or folders you can use this option. This should be formatted as an array but stored as a string. For example: `'["filename.js", "folder"]'` | `with` | **No** | | `SINGLE_COMMIT` | This option can be toggled to `true` if you'd prefer to have a single commit on the deployment branch instead of maintaining the full history. **Using this option will also cause any existing history to be wiped from the deployment branch**. | `with` | **No** | -| `LFS` | If toggled all files will be migrated from [Git LFS](https://git-lfs.github.com/) so they can be comitted to the deployment branch. | `with` | **No** | -| `PRESERVE` | Preserves and restores the workspace prior to deployment. This option is useful if you're modifying files in the worktree that aren't comitted to Git. | `with` | **No** | | `SILENT` | Silences the action output preventing it from displaying git messages. | `with` | **No** | | `WORKSPACE` | This should point to where your project lives on the virtual machine. The GitHub Actions environment will set this for you. It is only necessary to set this variable if you're using the node module. | `with` | **No** | @@ -226,7 +223,6 @@ jobs: - name: Deploy 🚀 uses: JamesIves/github-pages-deploy-action@3.7.1 with: - BASE_BRANCH: master BRANCH: gh-pages FOLDER: build CLEAN: true diff --git a/__tests__/git.test.ts b/__tests__/git.test.ts index baf84d9aa..cdd282aeb 100644 --- a/__tests__/git.test.ts +++ b/__tests__/git.test.ts @@ -5,7 +5,7 @@ process.env['GITHUB_SHA'] = '123' import {mkdirP, rmRF} from '@actions/io' import {action, Status} from '../src/constants' import {execute} from '../src/execute' -import {deploy, generateBranch, init, switchToBaseBranch} from '../src/git' +import {deploy, generateBranch, init} from '../src/git' import fs from 'fs' const originalAction = JSON.stringify(action) @@ -33,25 +33,6 @@ describe('git', () => { }) describe('init', () => { - it('should stash changes if preserve is true', async () => { - Object.assign(action, { - silent: false, - repositoryPath: 'JamesIves/github-pages-deploy-action', - accessToken: '123', - branch: 'branch', - folder: '.', - preserve: true, - isTest: true, - pusher: { - name: 'asd', - email: 'as@cat' - } - }) - - await init(action) - expect(execute).toBeCalledTimes(7) - }) - it('should catch when a function throws an error', async () => { ;(execute as jest.Mock).mockImplementationOnce(() => { throw new Error('Mocked throw') @@ -63,7 +44,6 @@ describe('git', () => { accessToken: '123', branch: 'branch', folder: '.', - preserve: true, isTest: true, pusher: { name: 'asd', @@ -82,7 +62,7 @@ describe('git', () => { }) describe('generateBranch', () => { - it('should execute six commands', async () => { + it('should execute five commands', async () => { Object.assign(action, { silent: false, accessToken: '123', @@ -95,7 +75,7 @@ describe('git', () => { }) await generateBranch(action) - expect(execute).toBeCalledTimes(6) + expect(execute).toBeCalledTimes(5) }) it('should catch when a function throws an error', async () => { @@ -118,68 +98,7 @@ describe('git', () => { await generateBranch(action) } catch (error) { expect(error.message).toBe( - 'There was an error creating the deployment branch: There was an error switching to the base branch: Mocked throw ❌ ❌' - ) - } - }) - }) - - describe('switchToBaseBranch', () => { - it('should execute one command', async () => { - Object.assign(action, { - silent: false, - accessToken: '123', - branch: 'branch', - folder: '.', - pusher: { - name: 'asd', - email: 'as@cat' - } - }) - - await switchToBaseBranch(action) - expect(execute).toBeCalledTimes(1) - }) - - it('should execute one command if using custom baseBranch', async () => { - Object.assign(action, { - silent: false, - baseBranch: '123', - accessToken: '123', - branch: 'branch', - folder: '.', - pusher: { - name: 'asd', - email: 'as@cat' - } - }) - - await switchToBaseBranch(action) - expect(execute).toBeCalledTimes(1) - }) - - it('should catch when a function throws an error', async () => { - ;(execute as jest.Mock).mockImplementationOnce(() => { - throw new Error('Mocked throw') - }) - - Object.assign(action, { - silent: false, - baseBranch: '123', - accessToken: '123', - branch: 'branch', - folder: '.', - pusher: { - name: 'asd', - email: 'as@cat' - } - }) - - try { - await switchToBaseBranch(action) - } catch (error) { - expect(error.message).toBe( - 'There was an error switching to the base branch: Mocked throw ❌' + 'There was an error creating the deployment branch: Mocked throw ❌' ) } }) @@ -192,62 +111,6 @@ describe('git', () => { folder: 'assets', branch: 'branch', gitHubToken: '123', - lfs: true, - pusher: { - name: 'asd', - email: 'as@cat' - } - }) - - const response = await deploy(action) - - // Includes the call to generateBranch - expect(execute).toBeCalledTimes(13) - expect(rmRF).toBeCalledTimes(1) - expect(response).toBe(Status.SUCCESS) - }) - - it('should execute stash apply commands if preserve is true', async () => { - Object.assign(action, { - silent: false, - folder: 'assets', - folderPath: 'assets', - branch: 'branch', - gitHubToken: '123', - lfs: true, - preserve: true, - isTest: true, - pusher: { - name: 'asd', - email: 'as@cat' - } - }) - - const response = await deploy(action) - - // Includes the call to generateBranch - expect(execute).toBeCalledTimes(14) - expect(rmRF).toBeCalledTimes(1) - expect(response).toBe(Status.SUCCESS) - }) - - it('should appropriately move along if git stash errors', async () => { - ;(execute as jest.Mock).mockImplementation(cmd => { - if (cmd === 'git stash apply') { - // Mocks the case where git stash apply errors. - throw new Error() - } - }) - - Object.assign(action, { - silent: false, - folder: 'assets', - folderPath: 'assets', - branch: 'branch', - gitHubToken: '123', - lfs: true, - preserve: true, - isTest: true, pusher: { name: 'asd', email: 'as@cat' @@ -257,7 +120,7 @@ describe('git', () => { const response = await deploy(action) // Includes the call to generateBranch - expect(execute).toBeCalledTimes(14) + expect(execute).toBeCalledTimes(10) expect(rmRF).toBeCalledTimes(1) expect(response).toBe(Status.SUCCESS) }) @@ -280,7 +143,7 @@ describe('git', () => { await deploy(action) // Includes the call to generateBranch - expect(execute).toBeCalledTimes(18) + expect(execute).toBeCalledTimes(16) expect(rmRF).toBeCalledTimes(1) }) @@ -304,7 +167,7 @@ describe('git', () => { const response = await deploy(action) // Includes the call to generateBranch - expect(execute).toBeCalledTimes(12) + expect(execute).toBeCalledTimes(10) expect(rmRF).toBeCalledTimes(1) expect(response).toBe(Status.SUCCESS) }) @@ -329,7 +192,7 @@ describe('git', () => { await deploy(action) // Includes the call to generateBranch - expect(execute).toBeCalledTimes(12) + expect(execute).toBeCalledTimes(10) expect(rmRF).toBeCalledTimes(1) }) @@ -351,7 +214,7 @@ describe('git', () => { await deploy(action) // Includes the call to generateBranch - expect(execute).toBeCalledTimes(12) + expect(execute).toBeCalledTimes(10) expect(rmRF).toBeCalledTimes(1) }) @@ -371,7 +234,7 @@ describe('git', () => { await deploy(action) - expect(execute).toBeCalledTimes(12) + expect(execute).toBeCalledTimes(10) expect(rmRF).toBeCalledTimes(1) expect(mkdirP).toBeCalledTimes(1) }) @@ -390,7 +253,7 @@ describe('git', () => { }) const response = await deploy(action) - expect(execute).toBeCalledTimes(13) + expect(execute).toBeCalledTimes(10) expect(rmRF).toBeCalledTimes(1) expect(response).toBe(Status.SKIPPED) }) @@ -405,7 +268,6 @@ describe('git', () => { folder: 'assets', branch: 'branch', gitHubToken: '123', - lfs: true, pusher: { name: 'asd', email: 'as@cat' diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts index 303e47980..8df7c3a67 100644 --- a/__tests__/main.test.ts +++ b/__tests__/main.test.ts @@ -47,7 +47,7 @@ describe('main', () => { debug: true }) await run(action) - expect(execute).toBeCalledTimes(19) + expect(execute).toBeCalledTimes(12) expect(rmRF).toBeCalledTimes(1) expect(exportVariable).toBeCalledTimes(1) }) @@ -64,7 +64,7 @@ describe('main', () => { } }) await run(action) - expect(execute).toBeCalledTimes(18) + expect(execute).toBeCalledTimes(12) expect(rmRF).toBeCalledTimes(1) expect(exportVariable).toBeCalledTimes(1) }) @@ -73,7 +73,6 @@ describe('main', () => { Object.assign(action, { folder: 'assets', branch: 'branch', - baseBranch: 'master', gitHubToken: null, ssh: null, accessToken: null, diff --git a/action.yml b/action.yml index e2d30ae90..abd495e62 100644 --- a/action.yml +++ b/action.yml @@ -32,10 +32,6 @@ inputs: description: 'If you would like to push the contents of the deployment folder into a specific directory on the deployment branch you can specify it here.' required: false - BASE_BRANCH: - description: 'The base branch of your repository which you would like to checkout prior to deploying. This defaults to the current commit SHA that triggered the build followed by master if it does not exist. This is useful for making deployments from another branch, and also may be necessary when using a scheduled job.' - required: false - COMMIT_MESSAGE: description: 'If you need to customize the commit message for an integration you can do so.' required: false @@ -68,19 +64,11 @@ inputs: SINGLE_COMMIT: description: "This option can be used if you'd prefer to have a single commit on the deployment branch instead of maintaining the full history." required: false - - LFS: - description: "Migrates files from Git LFS so they can be comitted to the deployment branch." - required: false SILENT: description: "Silences the action output preventing it from displaying git messages." required: false - PRESERVE: - description: "Preserves and restores any workspace changes prior to deployment." - required: false - outputs: DEPLOYMENT_STATUS: description: 'The status of the deployment that indicates if the run failed or passed. Possible outputs include: success|failed|skipped' diff --git a/src/constants.ts b/src/constants.ts index af15edcf8..f3ce8c105 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -8,8 +8,6 @@ const {pusher, repository} = github.context.payload export interface ActionInterface { /** Deployment access token. */ accessToken?: string | null - /** The base branch that the deploy should be made from. */ - baseBranch?: string /** The branch that the action should deploy to. */ branch: string /** If your project generates hashed files on build you can use this option to automatically delete them from the deployment branch with each deploy. This option can be toggled on by setting it to true. */ @@ -18,8 +16,6 @@ export interface ActionInterface { cleanExclude?: string | string[] /** If you need to customize the commit message for an integration you can do so. */ commitMessage?: string - /** The default branch of the deployment. Similar to baseBranch if you're using this action as a module. */ - defaultBranch?: string /** The git config email. */ email?: string /** The folder to deploy. */ @@ -30,12 +26,8 @@ export interface ActionInterface { gitHubToken?: string | null /** Determines if the action is running in test mode or not. */ isTest?: boolean | null - /** Removes files from LFS if toggled to allow normal deployment. */ - lfs?: boolean | null /** The git config name. */ name?: string - /** Determines if the workspace should be stashed/restored prior to comitting. */ - preserve?: boolean | null /** The repository path, for example JamesIves/github-pages-deploy-action. */ repositoryName?: string /** The fully qualified repositpory path, this gets auto generated if repositoryName is provided. */ @@ -77,7 +69,6 @@ export interface NodeActionInterface { /* Required action data that gets initialized when running within the GitHub Actions environment. */ export const action: ActionInterface = { accessToken: getInput('ACCESS_TOKEN'), - baseBranch: getInput('BASE_BRANCH'), folder: getInput('FOLDER'), branch: getInput('BRANCH'), commitMessage: getInput('COMMIT_MESSAGE'), @@ -85,13 +76,9 @@ export const action: ActionInterface = { ? getInput('CLEAN').toLowerCase() === 'true' : false, cleanExclude: getInput('CLEAN_EXCLUDE'), - defaultBranch: process.env.GITHUB_SHA ? process.env.GITHUB_SHA : 'master', isTest: process.env.UNIT_TEST ? process.env.UNIT_TEST.toLowerCase() === 'true' : false, - lfs: !isNullOrUndefined(getInput('LFS')) - ? getInput('LFS').toLowerCase() === 'true' - : false, email: !isNullOrUndefined(getInput('GIT_CONFIG_EMAIL')) ? getInput('GIT_CONFIG_EMAIL') : pusher && pusher.email @@ -107,9 +94,6 @@ export const action: ActionInterface = { : process.env.GITHUB_ACTOR ? process.env.GITHUB_ACTOR : 'GitHub Pages Deploy Action', - preserve: !isNullOrUndefined(getInput('PRESERVE')) - ? getInput('PRESERVE').toLowerCase() === 'true' - : false, repositoryName: !isNullOrUndefined(getInput('REPOSITORY_NAME')) ? getInput('REPOSITORY_NAME') : repository && repository.full_name diff --git a/src/git.ts b/src/git.ts index 2c421274d..6ab6131f6 100644 --- a/src/git.ts +++ b/src/git.ts @@ -11,7 +11,6 @@ export async function init(action: ActionInterface): Promise { info(`Deploying using ${action.tokenType}… 🔑`) info('Configuring git…') - await execute(`git init`, action.workspace, action.silent) await execute( `git config user.name "${action.name}"`, action.workspace, @@ -23,33 +22,6 @@ export async function init(action: ActionInterface): Promise { action.silent ) - try { - await execute(`git remote rm origin`, action.workspace, action.silent) - - if (action.isTest) { - throw new Error() - } - } catch { - info('Attempted to remove origin but failed, continuing…') - } - - await execute( - `git remote add origin ${action.repositoryPath}`, - action.workspace, - action.silent - ) - - if (action.preserve) { - info(`Stashing workspace changes… ⬆️`) - await execute(`git stash`, action.workspace, action.silent) - } - - await execute( - `git fetch --no-recurse-submodules`, - action.workspace, - action.silent - ) - info('Git configured… 🔧') } catch (error) { throw new Error( @@ -61,34 +33,11 @@ export async function init(action: ActionInterface): Promise { } } -/* Switches to the base branch. */ -export async function switchToBaseBranch( - action: ActionInterface -): Promise { - try { - await execute( - `git checkout --progress --force ${ - action.baseBranch ? action.baseBranch : action.defaultBranch - }`, - action.workspace, - action.silent - ) - } catch (error) { - throw new Error( - `There was an error switching to the base branch: ${suppressSensitiveInformation( - error.message, - action - )} ❌` - ) - } -} - /* Generates the branch if it doesn't exist on the remote. */ export async function generateBranch(action: ActionInterface): Promise { try { info(`Creating the ${action.branch} branch…`) - await switchToBaseBranch(action) await execute( `git checkout --orphan ${action.branch}`, action.workspace, @@ -131,8 +80,8 @@ export async function deploy(action: ActionInterface): Promise { try { const commitMessage = !isNullOrUndefined(action.commitMessage) ? (action.commitMessage as string) - : `Deploying to ${action.branch} from ${action.baseBranch} ${ - process.env.GITHUB_SHA ? `@ ${process.env.GITHUB_SHA}` : '' + : `Deploying to ${action.branch}${ + process.env.GITHUB_SHA ? ` from @ ${process.env.GITHUB_SHA}` : '' } 🚀` /* @@ -147,37 +96,14 @@ export async function deploy(action: ActionInterface): Promise { if (!branchExists && !action.isTest) { await generateBranch(action) - } - - // Checks out the base branch to begin the deployment process. - await switchToBaseBranch(action) - - await execute( - `git fetch ${action.repositoryPath}`, - action.workspace, - action.silent - ) - - if (action.lfs) { - // Migrates data from LFS so it can be comitted the "normal" way. - info(`Migrating from Git LFS… ⚓`) + } else { await execute( - `git lfs migrate export --include="*" --yes`, + `git fetch --no-recurse-submodules --depth=1 origin ${action.branch}`, action.workspace, action.silent ) } - if (action.preserve) { - info(`Applying stashed workspace changes… ⬆️`) - - try { - await execute(`git stash apply`, action.workspace, action.silent) - } catch { - info('Unable to apply from stash, continuing…') - } - } - await execute( `git worktree add --checkout ${temporaryDeploymentDirectory} origin/${action.branch}`, action.workspace, @@ -307,12 +233,6 @@ export async function deploy(action: ActionInterface): Promise { info('Cleared git history… 🚿') } - await execute( - `git checkout --progress --force ${action.defaultBranch}`, - action.workspace, - action.silent - ) - return Status.SUCCESS } catch (error) { throw new Error( From c4d24de7a0c17f3426dc3bf6a3d558f28319f35d Mon Sep 17 00:00:00 2001 From: Axel Hecht Date: Mon, 7 Dec 2020 16:12:15 +0100 Subject: [PATCH 02/32] Set up eslint for test files. (#517) --- .eslintrc.json | 2 +- __tests__/git.test.ts | 2 ++ __tests__/main.test.ts | 1 + package.json | 2 +- tsconfig.lint.json | 7 +++++++ 5 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 tsconfig.lint.json diff --git a/.eslintrc.json b/.eslintrc.json index fa6b50dc5..7c438075d 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -5,7 +5,7 @@ "parserOptions": { "ecmaVersion": 9, "sourceType": "module", - "project": "./tsconfig.json" + "project": "./tsconfig.lint.json" }, "globals": { "fetch": true diff --git a/__tests__/git.test.ts b/__tests__/git.test.ts index cdd282aeb..990ae0adb 100644 --- a/__tests__/git.test.ts +++ b/__tests__/git.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/first */ // Initial env variable setup for tests. process.env['INPUT_FOLDER'] = 'build' process.env['GITHUB_SHA'] = '123' @@ -23,6 +24,7 @@ jest.mock('@actions/io', () => ({ })) jest.mock('../src/execute', () => ({ + // eslint-disable-next-line @typescript-eslint/naming-convention __esModule: true, execute: jest.fn() })) diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts index 8df7c3a67..7a475eb5b 100644 --- a/__tests__/main.test.ts +++ b/__tests__/main.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/first */ // Initial env variable setup for tests. process.env['INPUT_FOLDER'] = 'build' process.env['GITHUB_SHA'] = '123' diff --git a/package.json b/package.json index 80fe0b03a..5b8de4825 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "scripts": { "build": "rimraf lib && tsc --declaration", "test": "jest", - "lint": "eslint src/**/*.ts", + "lint": "eslint src/**/*.ts __tests__/**/*.ts", "format": "prettier --write './**/*.ts'" }, "repository": { diff --git a/tsconfig.lint.json b/tsconfig.lint.json new file mode 100644 index 000000000..be0508f77 --- /dev/null +++ b/tsconfig.lint.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": "." + }, + "exclude": ["node_modules"] +} From 951989533aa8fa697ba99561c237edef9cb008f1 Mon Sep 17 00:00:00 2001 From: Axel Hecht Date: Tue, 8 Dec 2020 16:14:59 +0100 Subject: [PATCH 03/32] Add DRY_RUN option, passing --dry-run to git push. (#526) See #499 for the proposal. --- README.md | 1 + __tests__/git.test.ts | 33 +++++++++++++++++++++++++++++++++ src/constants.ts | 5 +++++ src/git.ts | 8 +++++--- 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index aa00c41f1..36e310518 100644 --- a/README.md +++ b/README.md @@ -148,6 +148,7 @@ In addition to the deployment options you must also configure the following. | `COMMIT_MESSAGE` | If you need to customize the commit message for an integration you can do so. | `with` | **No** | | `CLEAN` | If your project generates hashed files on build you can use this option to automatically delete them from the deployment branch with each deploy. This option is turned on by default, and can be toggled off by setting it to `false`. | `with` | **No** | | `CLEAN_EXCLUDE` | If you need to use `CLEAN` but you'd like to preserve certain files or folders you can use this option. This should be formatted as an array but stored as a string. For example: `'["filename.js", "folder"]'` | `with` | **No** | +| `DRY_RUN` | Do not actually push back, but use `--dry-run` on `git push` invocations insead. | `with` | **No** | | `SINGLE_COMMIT` | This option can be toggled to `true` if you'd prefer to have a single commit on the deployment branch instead of maintaining the full history. **Using this option will also cause any existing history to be wiped from the deployment branch**. | `with` | **No** | | `SILENT` | Silences the action output preventing it from displaying git messages. | `with` | **No** | | `WORKSPACE` | This should point to where your project lives on the virtual machine. The GitHub Actions environment will set this for you. It is only necessary to set this variable if you're using the node module. | `with` | **No** | diff --git a/__tests__/git.test.ts b/__tests__/git.test.ts index 990ae0adb..ce3fda76f 100644 --- a/__tests__/git.test.ts +++ b/__tests__/git.test.ts @@ -123,6 +123,39 @@ describe('git', () => { // Includes the call to generateBranch expect(execute).toBeCalledTimes(10) + expect(execute).toHaveBeenNthCalledWith( + 9, + expect.not.stringContaining('--dry-run'), + expect.anything(), + false + ) + expect(rmRF).toBeCalledTimes(1) + expect(response).toBe(Status.SUCCESS) + }) + + it('should push with --dry-run', async () => { + Object.assign(action, { + silent: false, + dryRun: true, + folder: 'assets', + branch: 'branch', + gitHubToken: '123', + pusher: { + name: 'asd', + email: 'as@cat' + } + }) + + const response = await deploy(action) + + // Includes the call to generateBranch + expect(execute).toBeCalledTimes(10) + expect(execute).toHaveBeenNthCalledWith( + 9, + expect.stringContaining('--dry-run'), + expect.anything(), + false + ) expect(rmRF).toBeCalledTimes(1) expect(response).toBe(Status.SUCCESS) }) diff --git a/src/constants.ts b/src/constants.ts index f3ce8c105..63558f8b5 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -10,6 +10,8 @@ export interface ActionInterface { accessToken?: string | null /** The branch that the action should deploy to. */ branch: string + /** git push with --dry-run */ + dryRun?: boolean | null /** If your project generates hashed files on build you can use this option to automatically delete them from the deployment branch with each deploy. This option can be toggled on by setting it to true. */ clean?: boolean | null /** If you need to use CLEAN but you'd like to preserve certain files or folders you can use this option. */ @@ -72,6 +74,9 @@ export const action: ActionInterface = { folder: getInput('FOLDER'), branch: getInput('BRANCH'), commitMessage: getInput('COMMIT_MESSAGE'), + dryRun: !isNullOrUndefined(getInput('DRY_RUN')) + ? getInput('DRY_RUN').toLowerCase() === 'true' + : false, clean: !isNullOrUndefined(getInput('CLEAN')) ? getInput('CLEAN').toLowerCase() === 'true' : false, diff --git a/src/git.ts b/src/git.ts index 6ab6131f6..de35d3e7c 100644 --- a/src/git.ts +++ b/src/git.ts @@ -49,8 +49,9 @@ export async function generateBranch(action: ActionInterface): Promise { action.workspace, action.silent ) + const dry = action.dryRun ? '--dry-run ' : '' await execute( - `git push --force ${action.repositoryPath} ${action.branch}`, + `git push --force ${dry}${action.repositoryPath} ${action.branch}`, action.workspace, action.silent ) @@ -74,6 +75,7 @@ export async function deploy(action: ActionInterface): Promise { const temporaryDeploymentBranch = `github-pages-deploy-action/${Math.random() .toString(36) .substr(2, 9)}` + const dry = action.dryRun ? '--dry-run ' : '' info('Starting to commit changes…') @@ -191,7 +193,7 @@ export async function deploy(action: ActionInterface): Promise { action.silent ) await execute( - `git push --force ${action.repositoryPath} ${temporaryDeploymentBranch}:${action.branch}`, + `git push --force ${dry}${action.repositoryPath} ${temporaryDeploymentBranch}:${action.branch}`, `${action.workspace}/${temporaryDeploymentDirectory}`, action.silent ) @@ -225,7 +227,7 @@ export async function deploy(action: ActionInterface): Promise { action.silent ) await execute( - `git push origin ${action.branch} --force`, + `git push origin ${action.branch} ${dry}--force`, `${action.workspace}/${temporaryDeploymentDirectory}`, action.silent ) From 7a948416001d0886e19bd2575d9010b58e721198 Mon Sep 17 00:00:00 2001 From: James Ives Date: Thu, 10 Dec 2020 11:49:37 -0500 Subject: [PATCH 04/32] Simplifies Token Setup (#530) * Token simplification * Access Token / Github Token -> Token * Oops * Typos * Update README.md * Update README.md * Update action.yml Co-authored-by: Axel Hecht * Update README.md Co-authored-by: Axel Hecht * Update README.md Co-authored-by: Axel Hecht --- README.md | 23 +++++------ __tests__/git.test.ts | 24 ++++++------ __tests__/main.test.ts | 7 ++-- __tests__/util.test.ts | 86 +++++++++++------------------------------- action.yml | 15 +++++--- src/constants.ts | 19 ++++------ src/util.ts | 24 ++++-------- 7 files changed, 73 insertions(+), 125 deletions(-) diff --git a/README.md b/README.md index 36e310518..e5a017a59 100644 --- a/README.md +++ b/README.md @@ -64,10 +64,8 @@ jobs: - name: Deploy 🚀 uses: JamesIves/github-pages-deploy-action@3.7.1 with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} BRANCH: gh-pages # The branch the action should deploy to. FOLDER: build # The folder the action should deploy. - CLEAN: true # Automatically remove deleted files from the deploy branch ``` If you'd like to make it so the workflow only triggers on push events to specific branches then you can modify the `on` section. @@ -105,7 +103,7 @@ Calling the functions directly will require you to pass in an object containing import run from "github-pages-deploy-action"; run({ - accessToken: process.env["ACCESS_TOKEN"], + token: process.env["ACCESS_TOKEN"], branch: "gh-pages", folder: "build", repositoryName: "JamesIves/github-pages-deploy-action", @@ -122,28 +120,27 @@ The `with` portion of the workflow **must** be configured before the action will #### Required Setup -One of the following deployment options must be configured. - -| Key | Value Information | Type | Required | -| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | -------- | -| `GITHUB_TOKEN` | In order for GitHub to trigger the rebuild of your page you must provide the action with the repository's provided GitHub token. This can be referenced in the workflow `yml` file by using `${{ secrets.GITHUB_TOKEN }}`. If you experience any issues with your changes not being reflected after the deployment it may be neccersary to use either the `SSH` or `ACCESS_TOKEN` options. | `secrets / with` | **Yes** | -| `SSH` | You can configure the action to deploy using SSH by setting this option to `true`. For more information on how to add your ssh key pair please refer to the [Using a Deploy Key section of this README](https://github.com/JamesIves/github-pages-deploy-action/tree/dev#using-an-ssh-deploy-key-). | `with` | **Yes** | -| `ACCESS_TOKEN` | Depending on the repository's permissions you may need to provide the action with a GitHub personal access token instead of the provided GitHub token in order to deploy. You can [learn more about how to generate one here](https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line). **This should be stored as a secret**. | `secrets / with` | **Yes** | - -In addition to the deployment options you must also configure the following. +The following options must be configured in order to make a deployment. | Key | Value Information | Type | Required | | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | -------- | | `BRANCH` | This is the branch you wish to deploy to, for example `gh-pages` or `docs`. | `with` | **Yes** | | `FOLDER` | The folder in your repository that you want to deploy. If your build script compiles into a directory named `build` you'd put it here. If you wish to deploy the root directory you can place a `.` here. You can also utilize absolute file paths by appending `~` to your folder path. | `with` | **Yes** | +By default the action does not need any token configuration and uses the provided repository scoped GitHub token to make the deployment. If you require most customization you can modify the deployment type using the following options. + +| Key | Value Information | Type | Required | +| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | -------- | +| `TOKEN` | This option defaults to the repository scoped GitHub Token. However if you need more permissions for things such as deploying to another repository, you can add a Personal Access Token (PAT) here. This should be stored in the `secrets / with` menu **as a secret**. We reccomend using a service account with the least permissions neccersary and recommend when generating a new PAT that you select the least permission scopes neccersary. [Learn more about creating and using encrypted secrets here.](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets) | **No** | +| `SSH` | You can configure the action to deploy using SSH by setting this option to `true`. For more information on how to add your ssh key pair please refer to the [Using a Deploy Key section of this README](https://github.com/JamesIves/github-pages-deploy-action/tree/dev#using-an-ssh-deploy-key-). | `with` | **No** | + #### Optional Choices | Key | Value Information | Type | Required | | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | -------- | | `GIT_CONFIG_NAME` | Allows you to customize the name that is attached to the git config which is used when pushing the deployment commits. If this is not included it will use the name in the GitHub context, followed by the name of the action. | `with` | **No** | | `GIT_CONFIG_EMAIL` | Allows you to customize the email that is attached to the git config which is used when pushing the deployment commits. If this is not included it will use the email in the GitHub context, followed by a generic noreply GitHub email. | `with` | **No** | -| `REPOSITORY_NAME` | Allows you to specify a different repository path so long as you have permissions to push to it. This should be formatted like so: `JamesIves/github-pages-deploy-action`. You'll need to use an `ACCESS_TOKEN` for this configuration option to work properly. | `with` | **No** | +| `REPOSITORY_NAME` | Allows you to specify a different repository path so long as you have permissions to push to it. This should be formatted like so: `JamesIves/github-pages-deploy-action`. You'll need to use a PAT in the `TOKEN` input for this configuration option to work properly. | `with` | **No** | | `TARGET_FOLDER` | If you'd like to push the contents of the deployment folder into a specific directory on the deployment branch you can specify it here. | `with` | **No** | | `COMMIT_MESSAGE` | If you need to customize the commit message for an integration you can do so. | `with` | **No** | | `CLEAN` | If your project generates hashed files on build you can use this option to automatically delete them from the deployment branch with each deploy. This option is turned on by default, and can be toggled off by setting it to `false`. | `with` | **No** | diff --git a/__tests__/git.test.ts b/__tests__/git.test.ts index ce3fda76f..6a47a1fd0 100644 --- a/__tests__/git.test.ts +++ b/__tests__/git.test.ts @@ -43,7 +43,7 @@ describe('git', () => { Object.assign(action, { silent: false, repositoryPath: 'JamesIves/github-pages-deploy-action', - accessToken: '123', + token: '123', branch: 'branch', folder: '.', isTest: true, @@ -67,7 +67,7 @@ describe('git', () => { it('should execute five commands', async () => { Object.assign(action, { silent: false, - accessToken: '123', + token: '123', branch: 'branch', folder: '.', pusher: { @@ -87,7 +87,7 @@ describe('git', () => { Object.assign(action, { silent: false, - accessToken: '123', + token: '123', branch: 'branch', folder: '.', pusher: { @@ -112,7 +112,7 @@ describe('git', () => { silent: false, folder: 'assets', branch: 'branch', - gitHubToken: '123', + token: '123', pusher: { name: 'asd', email: 'as@cat' @@ -139,7 +139,7 @@ describe('git', () => { dryRun: true, folder: 'assets', branch: 'branch', - gitHubToken: '123', + token: '123', pusher: { name: 'asd', email: 'as@cat' @@ -166,7 +166,7 @@ describe('git', () => { folder: 'other', folderPath: 'other', branch: 'branch', - gitHubToken: '123', + token: '123', singleCommit: true, pusher: { name: 'asd', @@ -188,7 +188,7 @@ describe('git', () => { folder: 'assets', folderPath: 'assets', branch: 'branch', - gitHubToken: '123', + token: '123', pusher: { name: 'asd', email: 'as@cat' @@ -214,7 +214,7 @@ describe('git', () => { folder: 'other', folderPath: 'other', branch: 'branch', - gitHubToken: '123', + token: '123', pusher: { name: 'asd', email: 'as@cat' @@ -237,7 +237,7 @@ describe('git', () => { folder: 'assets', folderPath: 'assets', branch: 'branch', - gitHubToken: '123', + token: '123', pusher: { name: 'asd', email: 'as@cat' @@ -258,7 +258,7 @@ describe('git', () => { silent: false, folder: '.', branch: 'branch', - gitHubToken: '123', + token: '123', pusher: {}, clean: true, targetFolder: 'new_folder', @@ -279,7 +279,7 @@ describe('git', () => { silent: false, folder: 'assets', branch: 'branch', - gitHubToken: '123', + token: '123', pusher: { name: 'asd', email: 'as@cat' @@ -302,7 +302,7 @@ describe('git', () => { silent: false, folder: 'assets', branch: 'branch', - gitHubToken: '123', + token: '123', pusher: { name: 'asd', email: 'as@cat' diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts index 7a475eb5b..6044032fc 100644 --- a/__tests__/main.test.ts +++ b/__tests__/main.test.ts @@ -39,7 +39,7 @@ describe('main', () => { repositoryPath: 'JamesIves/github-pages-deploy-action', folder: 'assets', branch: 'branch', - gitHubToken: '123', + token: '123', pusher: { name: 'asd', email: 'as@cat' @@ -58,7 +58,7 @@ describe('main', () => { repositoryPath: 'JamesIves/github-pages-deploy-action', folder: 'assets', branch: 'branch', - gitHubToken: '123', + token: '123', pusher: { name: 'asd', email: 'as@cat' @@ -74,9 +74,8 @@ describe('main', () => { Object.assign(action, { folder: 'assets', branch: 'branch', - gitHubToken: null, + token: null, ssh: null, - accessToken: null, pusher: { name: 'asd', email: 'as@cat' diff --git a/__tests__/util.test.ts b/__tests__/util.test.ts index 1f21cf396..dd37eff02 100644 --- a/__tests__/util.test.ts +++ b/__tests__/util.test.ts @@ -37,38 +37,23 @@ describe('util', () => { branch: '123', workspace: 'src/', folder: 'build', - gitHubToken: null, - accessToken: null, + token: null, ssh: true, silent: false } expect(generateTokenType(action)).toEqual('SSH Deploy Key') }) - it('should return access token if access token is provided', async () => { + it('should return deploy token if token is provided', async () => { const action = { branch: '123', workspace: 'src/', folder: 'build', - gitHubToken: null, - accessToken: '123', + token: '123', ssh: null, silent: false } - expect(generateTokenType(action)).toEqual('Access Token') - }) - - it('should return github token if github token is provided', async () => { - const action = { - branch: '123', - workspace: 'src/', - folder: 'build', - gitHubToken: '123', - accessToken: null, - ssh: null, - silent: false - } - expect(generateTokenType(action)).toEqual('GitHub Token') + expect(generateTokenType(action)).toEqual('Deploy Token') }) it('should return ... if no token is provided', async () => { @@ -76,8 +61,7 @@ describe('util', () => { branch: '123', workspace: 'src/', folder: 'build', - gitHubToken: null, - accessToken: null, + token: null, ssh: null, silent: false } @@ -92,8 +76,7 @@ describe('util', () => { branch: '123', workspace: 'src/', folder: 'build', - gitHubToken: null, - accessToken: null, + token: null, ssh: true, silent: false } @@ -102,30 +85,13 @@ describe('util', () => { ) }) - it('should return https if access token is provided', async () => { - const action = { - repositoryName: 'JamesIves/github-pages-deploy-action', - branch: '123', - workspace: 'src/', - folder: 'build', - gitHubToken: null, - accessToken: '123', - ssh: null, - silent: false - } - expect(generateRepositoryPath(action)).toEqual( - 'https://123@github.com/JamesIves/github-pages-deploy-action.git' - ) - }) - - it('should return https with x-access-token if github token is provided', async () => { + it('should return https with x-access-token if deploy token is provided', async () => { const action = { repositoryName: 'JamesIves/github-pages-deploy-action', branch: '123', workspace: 'src/', folder: 'build', - gitHubToken: '123', - accessToken: null, + token: '123', ssh: null, silent: false } @@ -143,14 +109,13 @@ describe('util', () => { branch: '123', workspace: 'src/', folder: 'build', - accessToken: 'supersecret999%%%', - gitHubToken: 'anothersecret123333', + token: 'anothersecret123333', silent: false } - const string = `This is an error message! It contains ${action.accessToken} and ${action.gitHubToken} and ${action.repositoryPath} and ${action.accessToken} again!` + const string = `This is an error message! It contains ${action.token} and ${action.repositoryPath} and ${action.token} again!` expect(suppressSensitiveInformation(string, action)).toBe( - 'This is an error message! It contains *** and *** and *** and *** again!' + 'This is an error message! It contains *** and *** and *** again!' ) }) @@ -162,16 +127,15 @@ describe('util', () => { branch: '123', workspace: 'src/', folder: 'build', - accessToken: 'supersecret999%%%', - gitHubToken: 'anothersecret123333', + token: 'anothersecret123333', silent: false } process.env['RUNNER_DEBUG'] = '1' - const string = `This is an error message! It contains ${action.accessToken} and ${action.gitHubToken} and ${action.repositoryPath}` + const string = `This is an error message! It contains ${action.token} and ${action.repositoryPath}` expect(suppressSensitiveInformation(string, action)).toBe( - 'This is an error message! It contains supersecret999%%% and anothersecret123333 and https://x-access-token:supersecret999%%%@github.com/anothersecret123333' + 'This is an error message! It contains anothersecret123333 and https://x-access-token:supersecret999%%%@github.com/anothersecret123333' ) }) }) @@ -183,8 +147,7 @@ describe('util', () => { branch: '123', workspace: 'src/', folder: 'build', - gitHubToken: null, - accessToken: null, + token: null, ssh: null, silent: false } @@ -196,8 +159,7 @@ describe('util', () => { branch: '123', workspace: 'src/', folder: '/home/user/repo/build', - gitHubToken: null, - accessToken: null, + token: null, ssh: null, silent: false } @@ -209,8 +171,7 @@ describe('util', () => { branch: '123', workspace: 'src/', folder: './build', - gitHubToken: null, - accessToken: null, + token: null, ssh: null, silent: false } @@ -222,8 +183,7 @@ describe('util', () => { branch: '123', workspace: 'src/', folder: '~/repo/build', - gitHubToken: null, - accessToken: null, + token: null, ssh: null, silent: false } @@ -251,11 +211,11 @@ describe('util', () => { } }) - it('should fail if access token is defined but it is an empty string', () => { + it('should fail if token is defined but it is an empty string', () => { const action = { silent: false, repositoryPath: undefined, - accessToken: '', + token: '', branch: 'branch', folder: 'build', workspace: 'src/' @@ -274,7 +234,7 @@ describe('util', () => { const action = { silent: false, repositoryPath: undefined, - accessToken: '123', + token: '123', branch: '', folder: 'build', workspace: 'src/' @@ -291,7 +251,7 @@ describe('util', () => { const action = { silent: false, repositoryPath: undefined, - gitHubToken: '123', + token: '123', branch: 'branch', folder: '', workspace: 'src/' @@ -310,7 +270,7 @@ describe('util', () => { const action: ActionInterface = { silent: false, repositoryPath: undefined, - gitHubToken: '123', + token: '123', branch: 'branch', folder: 'notARealFolder', workspace: '.' diff --git a/action.yml b/action.yml index abd495e62..2383a022a 100644 --- a/action.yml +++ b/action.yml @@ -12,13 +12,18 @@ inputs: description: 'You can configure the action to deploy using SSH by setting this option to true. More more information on how to add your ssh key pair please refer to the Using a Deploy Key section of this README.' required: false - ACCESS_TOKEN: - description: 'Depending on the repository permissions you may need to provide the action with a GitHub personal access token instead of the provided GitHub token in order to deploy. This should be stored as a secret.' - required: false + TOKEN: + description: > + This option defaults to the repository scoped GitHub Token. + However if you need more permissions for things such as deploying to another repository, you can add a Personal Access Token (PAT) here. + This should be stored in the `secrets / with` menu **as a secret**. - GITHUB_TOKEN: - description: 'In order for GitHub to trigger the rebuild of your page you must provide the action with the repositories provided GitHub token.' + We recommend using a service account with the least permissions neccersary + and when generating a new PAT that you select the least permission scopes required. + + [Learn more about creating and using encrypted secrets here.](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets) required: false + default: ${{ github.token }} BRANCH: description: 'This is the branch you wish to deploy to, for example gh-pages or docs.' diff --git a/src/constants.ts b/src/constants.ts index 63558f8b5..0b85dcde8 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -6,8 +6,6 @@ const {pusher, repository} = github.context.payload /* For more information please refer to the README: https://github.com/JamesIves/github-pages-deploy-action */ export interface ActionInterface { - /** Deployment access token. */ - accessToken?: string | null /** The branch that the action should deploy to. */ branch: string /** git push with --dry-run */ @@ -24,8 +22,6 @@ export interface ActionInterface { folder: string /** The auto generated folder path. */ folderPath?: string - /** GitHub deployment token. */ - gitHubToken?: string | null /** Determines if the action is running in test mode or not. */ isTest?: boolean | null /** The git config name. */ @@ -42,7 +38,9 @@ export interface ActionInterface { ssh?: boolean | null /** If you'd like to push the contents of the deployment folder into a specific directory on the deployment branch you can specify it here. */ targetFolder?: string - /** The token type, ie ssh/github token/access token, this gets automatically generated. */ + /** Deployment token. */ + token?: string | null + /** The token type, ie ssh/token, this gets automatically generated. */ tokenType?: string /** The folder where your deployment project lives. */ workspace: string @@ -50,16 +48,14 @@ export interface ActionInterface { /** The minimum required values to run the action as a node module. */ export interface NodeActionInterface { - /** Deployment access token. */ - accessToken?: string | null /** The branch that the action should deploy to. */ branch: string /** The folder to deploy. */ folder: string - /** GitHub deployment token. */ - gitHubToken?: string | null /** The repository path, for example JamesIves/github-pages-deploy-action. */ repositoryName: string + /** GitHub deployment token. */ + token?: string | null /** Determines if the action should run in silent mode or not. */ silent: boolean /** Set to true if you're using an ssh client in your build step. */ @@ -70,7 +66,6 @@ export interface NodeActionInterface { /* Required action data that gets initialized when running within the GitHub Actions environment. */ export const action: ActionInterface = { - accessToken: getInput('ACCESS_TOKEN'), folder: getInput('FOLDER'), branch: getInput('BRANCH'), commitMessage: getInput('COMMIT_MESSAGE'), @@ -91,7 +86,6 @@ export const action: ActionInterface = { : `${ process.env.GITHUB_ACTOR || 'github-pages-deploy-action' }@users.noreply.github.com`, - gitHubToken: getInput('GITHUB_TOKEN'), name: !isNullOrUndefined(getInput('GIT_CONFIG_NAME')) ? getInput('GIT_CONFIG_NAME') : pusher && pusher.name @@ -104,6 +98,7 @@ export const action: ActionInterface = { : repository && repository.full_name ? repository.full_name : process.env.GITHUB_REPOSITORY, + token: getInput('TOKEN'), singleCommit: !isNullOrUndefined(getInput('SINGLE_COMMIT')) ? getInput('SINGLE_COMMIT').toLowerCase() === 'true' : false, @@ -120,7 +115,7 @@ export const action: ActionInterface = { /** Types for the required action parameters. */ export type RequiredActionParameters = Pick< ActionInterface, - 'accessToken' | 'gitHubToken' | 'ssh' | 'branch' | 'folder' + 'token' | 'ssh' | 'branch' | 'folder' > /** Status codes for the action. */ diff --git a/src/util.ts b/src/util.ts index cde4c3de2..d43a1e09b 100644 --- a/src/util.ts +++ b/src/util.ts @@ -13,21 +13,15 @@ export const isNullOrUndefined = (value: any): boolean => /* Generates a token type used for the action. */ export const generateTokenType = (action: ActionInterface): string => - action.ssh - ? 'SSH Deploy Key' - : action.accessToken - ? 'Access Token' - : action.gitHubToken - ? 'GitHub Token' - : '…' + action.ssh ? 'SSH Deploy Key' : action.token ? 'Deploy Token' : '…' /* Generates a the repository path used to make the commits. */ export const generateRepositoryPath = (action: ActionInterface): string => action.ssh ? `git@github.com:${action.repositoryName}` - : `https://${ - action.accessToken || `x-access-token:${action.gitHubToken}` - }@github.com/${action.repositoryName}.git` + : `https://${`x-access-token:${action.token}`}@github.com/${ + action.repositoryName + }.git` /* Genetate absolute folder path by the provided folder name */ export const generateFolderPath = (action: ActionInterface): string => { @@ -52,7 +46,7 @@ const hasRequiredParameters = ( /* Verifies the action has the required parameters to run, otherwise throw an error. */ export const checkParameters = (action: ActionInterface): void => { - if (!hasRequiredParameters(action, ['accessToken', 'gitHubToken', 'ssh'])) { + if (!hasRequiredParameters(action, ['token', 'ssh'])) { throw new Error( 'No deployment token/method was provided. You must provide the action with either a Personal Access Token or the GitHub Token secret in order to deploy. If you wish to use an ssh deploy token then you must set SSH to true.' ) @@ -85,11 +79,9 @@ export const suppressSensitiveInformation = ( return value } - const orderedByLength = ([ - action.accessToken, - action.gitHubToken, - action.repositoryPath - ].filter(Boolean) as string[]).sort((a, b) => b.length - a.length) + const orderedByLength = ([action.token, action.repositoryPath].filter( + Boolean + ) as string[]).sort((a, b) => b.length - a.length) for (const find of orderedByLength) { value = replaceAll(value, find, '***') From a92aacd4ba996245acc0b075ffaf48daf2bf0b7d Mon Sep 17 00:00:00 2001 From: Axel Hecht Date: Fri, 11 Dec 2020 15:36:21 +0100 Subject: [PATCH 05/32] Adjust codeql action to latest recommendations (#540) Also, add the dev and release branches, and drop master. --- .github/workflows/codeql-analysis.yml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index acb70a291..1d7daa307 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -2,10 +2,15 @@ name: "CodeQL" on: push: - branches: [dev, master, releases/v2, releases/v3] + branches: + - dev + - 'dev-v*' + - 'releases/v*' pull_request: # The branches below must be a subset of the branches above - branches: [dev] + branches: + - dev + - 'dev-v*' schedule: - cron: '0 9 * * 4' @@ -17,15 +22,6 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v2 - with: - # We must fetch at least the immediate parents so that if this is - # a pull request then we can checkout the head. - fetch-depth: 2 - - # If this run was triggered by a pull request event, then checkout - # the head of the pull request instead of the merge commit. - - run: git checkout HEAD^2 - if: ${{ github.event_name == 'pull_request' }} # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL From 0da20f04b8c317fc00861e2fe71106a59f4ac38f Mon Sep 17 00:00:00 2001 From: Axel Hecht Date: Mon, 14 Dec 2020 16:26:48 +0100 Subject: [PATCH 06/32] Add workflow to update build and node_modules on release branches (#541) --- .github/workflows/production.yml | 50 ++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 .github/workflows/production.yml diff --git a/.github/workflows/production.yml b/.github/workflows/production.yml new file mode 100644 index 000000000..55247f28a --- /dev/null +++ b/.github/workflows/production.yml @@ -0,0 +1,50 @@ +name: Land production js and modules +on: + workflow_dispatch: + push: + branches: + - 'releases/v*' + tags-ignore: + - '*.*' + +jobs: + build: + name: Build production + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - uses: actions/setup-node@v1.4.4 + with: + node-version: 'v12.18.4' + registry-url: 'https://registry.npmjs.org' + + - name: Install Yarn + run: npm install -g yarn + + - name: Clobber lib + run: rm -rf lib + + - name: Set up .gitignore + run: | + sed -i -e's/^lib/# lib/' -e's/^node_module/# node_modules/' .gitignore + + - name: Build + run: | + yarn install + yarn build + + - name: Production node_modules + run: | + yarn install --production + + - name: Commit and push + # keep the run green if the commit fails for the lack of changes + continue-on-error: True + run: | + git config user.email "iam@jamesiv.es" + git config user.name "James Ives" + git add . + git commit -m"Deploy production js code for ${{ github.sha }}" + git push From 27009d7a9627b0063ec5957bd75621a31a77984f Mon Sep 17 00:00:00 2001 From: James Ives Date: Mon, 14 Dec 2020 10:31:54 -0500 Subject: [PATCH 07/32] Stores username/email in secrets --- .github/workflows/codeql-analysis.yml | 1 - .github/workflows/production.yml | 14 +++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 1d7daa307..4abe55af3 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -1,5 +1,4 @@ name: "CodeQL" - on: push: branches: diff --git a/.github/workflows/production.yml b/.github/workflows/production.yml index 55247f28a..28ea37128 100644 --- a/.github/workflows/production.yml +++ b/.github/workflows/production.yml @@ -1,4 +1,4 @@ -name: Land production js and modules +name: Deploy Production Dependencies and Code on: workflow_dispatch: push: @@ -35,16 +35,16 @@ jobs: yarn install yarn build - - name: Production node_modules + - name: Install Production node_modules run: | yarn install --production - - name: Commit and push - # keep the run green if the commit fails for the lack of changes + - name: Commit and Push + # Keep the run green if the commit fails for the lack of changes continue-on-error: True run: | - git config user.email "iam@jamesiv.es" - git config user.name "James Ives" + git config user.email "${{ secrets.GIT_CONFIG_EMAIL }}" + git config user.name "${{ secrets.GIT_CONFIG_NAME }}" git add . - git commit -m"Deploy production js code for ${{ github.sha }}" + git commit -m "Deploy Production Code for Commit ${{ github.sha }} 🚀" git push From ac885860a854923a477105dc2d46bd33c63f34b7 Mon Sep 17 00:00:00 2001 From: James Ives Date: Mon, 14 Dec 2020 10:33:37 -0500 Subject: [PATCH 08/32] Removing stale bot integration --- .github/stale.yml | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 .github/stale.yml diff --git a/.github/stale.yml b/.github/stale.yml deleted file mode 100644 index dc90e5a1c..000000000 --- a/.github/stale.yml +++ /dev/null @@ -1,17 +0,0 @@ -# Number of days of inactivity before an issue becomes stale -daysUntilStale: 60 -# Number of days of inactivity before a stale issue is closed -daysUntilClose: 7 -# Issues with these labels will never be considered stale -exemptLabels: - - pinned - - security -# Label to use when marking an issue as stale -staleLabel: wontfix -# Comment to post when marking an issue as stale. Set to `false` to disable -markComment: > - This issue has been automatically marked as stale because it has not had - recent activity. It will be closed if no further activity occurs. Thank you - for your contributions. -# Comment to post when closing a stale issue. Set to `false` to disable -closeComment: false From 4e40ddd3f56be95bb196db27a0119da877200e72 Mon Sep 17 00:00:00 2001 From: Axel Hecht Date: Mon, 14 Dec 2020 18:30:22 +0100 Subject: [PATCH 09/32] Test current code base as an integration test for PRs and pushes (#505) * Add a build step to create lib and node_modules artifact * Run integration test with built dist and current SHA as base For pull requests, the github.sha is the sha of the merge to the target branch, not the head of the PR. Special case that. * Use v2 checkout, and DRY_RUN for the integration test. I also made the branches more generic, as there are now more of them. * Fix #536, don't push at all on dryRun Also add tests for dryRun and singleCommit and generateBranch code flows. * Try to fix dryRun on new remote branches, refactor fetch * Try to fix dryRun, only fetch if origin branch exists * Refactor worktree setup to include branch generation and setup for singleCommit This is a continuation of the no-checkout work, and sadly suggested pretty intensive changes. * Set up git config to fix tests, also make debugging easier * Add matrix for existing and non-existing branch * Add matrix for singleCommit and not * Drop GITHUB_TOKEN, add DRY_RUN to action.yml * When deploying existing branch, add a modifcation and deploy again * Force branch checkout to work in redeployment scenarios * Make singleCommit easier to see in job descriptions * Review comments * Add a test-only property to action to test code paths with remote branch. * Introduce TestFlag enum to signal different test scenarios to unit tests * Fix util.test.ts --- .eslintrc.json | 5 +- .github/workflows/build.yml | 85 +++++++++++++- __tests__/env.js | 3 +- __tests__/git.test.ts | 147 ++++++++++++----------- __tests__/main.test.ts | 13 ++- __tests__/util.test.ts | 50 +++++--- __tests__/worktree.error.test.ts | 35 ++++++ __tests__/worktree.test.ts | 195 +++++++++++++++++++++++++++++++ action.yml | 4 + src/constants.ts | 18 ++- src/git.ts | 131 +++++---------------- src/worktree.ts | 85 ++++++++++++++ 12 files changed, 558 insertions(+), 213 deletions(-) create mode 100644 __tests__/worktree.error.test.ts create mode 100644 __tests__/worktree.test.ts create mode 100644 src/worktree.ts diff --git a/.eslintrc.json b/.eslintrc.json index 7c438075d..adf484fbc 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -55,8 +55,9 @@ "@typescript-eslint/type-annotation-spacing": "error", "@typescript-eslint/unbound-method": "error", "no-console": "off", - "no-shadow": ["error", { "builtinGlobals": false, "hoist": "all", "allow": ["Status"] }] - }, + "no-shadow": "off", // replaced by ts-eslint rule below + "@typescript-eslint/no-shadow": "error" + }, "env": { "node": true, "es6": true, diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ef6465a83..2ee7ccb4f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,8 +2,8 @@ name: unit-tests on: pull_request: branches: - - dev - - releases/v3 + - 'dev*' + - 'releases/v*' push: branches: - dev @@ -14,11 +14,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v1 + uses: actions/checkout@v2 - uses: actions/setup-node@v1.4.4 with: - node-version: '10.15.1' + node-version: 'v12.18.4' registry-url: 'https://registry.npmjs.org' - name: Install Yarn @@ -34,3 +34,80 @@ jobs: uses: codecov/codecov-action@v1 with: token: ${{ secrets.CODECOV_TOKEN }} + + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - uses: actions/setup-node@v1.4.4 + with: + node-version: 'v12.18.4' + registry-url: 'https://registry.npmjs.org' + + - name: Install Yarn + run: npm install -g yarn + + - name: Build lib + run: | + yarn install + yarn build + + - name: Rebuild production node_modules + run: | + yarn install --production + ls node_modules + + - name: artifact + uses: actions/upload-artifact@v2 + with: + name: dist + path: | + lib + node_modules + + integration: + runs-on: ubuntu-latest + needs: build + strategy: + matrix: + branch: ["gh-pages", "no-pages"] + commit: ["singleCommit", "add commits"] + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + persist-credentials: false + + - uses: actions/setup-node@v1.4.4 + with: + node-version: 'v12.18.4' + registry-url: 'https://registry.npmjs.org' + + - name: Download artifact + uses: actions/download-artifact@v2 + with: + name: dist + + - name: Deploy + uses: ./ + with: + FOLDER: integration + BRANCH: ${{ matrix.branch }} + SINGLE_COMMIT: ${{ matrix.commit == 'singleCommit' }} + DRY_RUN: true + + - name: Tweak content to publish to existing branch + if: ${{ matrix.branch == 'gh-pages' }} + run: | + echo "" >> integration/index.html + + - name: Deploy with modifications to existing branch + uses: ./ + if: ${{ matrix.branch == 'gh-pages' }} + with: + FOLDER: integration + BRANCH: ${{ matrix.branch }} + SINGLE_COMMIT: ${{ matrix.commit == 'singleCommit' }} + DRY_RUN: true diff --git a/__tests__/env.js b/__tests__/env.js index 67c9c4dca..5c29df783 100644 --- a/__tests__/env.js +++ b/__tests__/env.js @@ -1,2 +1 @@ -process.env.UNIT_TEST = 'true' -process.env.ACTIONS_STEP_DEBUG = 'false' \ No newline at end of file +process.env.ACTIONS_STEP_DEBUG = 'false' diff --git a/__tests__/git.test.ts b/__tests__/git.test.ts index 6a47a1fd0..e86df2afc 100644 --- a/__tests__/git.test.ts +++ b/__tests__/git.test.ts @@ -4,9 +4,9 @@ process.env['INPUT_FOLDER'] = 'build' process.env['GITHUB_SHA'] = '123' import {mkdirP, rmRF} from '@actions/io' -import {action, Status} from '../src/constants' +import {action, Status, TestFlag} from '../src/constants' import {execute} from '../src/execute' -import {deploy, generateBranch, init} from '../src/git' +import {deploy, init} from '../src/git' import fs from 'fs' const originalAction = JSON.stringify(action) @@ -46,11 +46,11 @@ describe('git', () => { token: '123', branch: 'branch', folder: '.', - isTest: true, pusher: { name: 'asd', email: 'as@cat' - } + }, + isTest: TestFlag.HAS_CHANGED_FILES }) try { @@ -63,122 +63,117 @@ describe('git', () => { }) }) - describe('generateBranch', () => { - it('should execute five commands', async () => { + describe('deploy', () => { + it('should execute commands', async () => { Object.assign(action, { silent: false, - token: '123', + folder: 'assets', branch: 'branch', - folder: '.', + token: '123', pusher: { name: 'asd', email: 'as@cat' - } + }, + isTest: TestFlag.HAS_CHANGED_FILES }) - await generateBranch(action) - expect(execute).toBeCalledTimes(5) - }) + const response = await deploy(action) - it('should catch when a function throws an error', async () => { - ;(execute as jest.Mock).mockImplementationOnce(() => { - throw new Error('Mocked throw') - }) + // Includes the call to generateWorktree + expect(execute).toBeCalledTimes(11) + expect(rmRF).toBeCalledTimes(1) + expect(response).toBe(Status.SUCCESS) + }) + it('should not push when asked to dryRun', async () => { Object.assign(action, { silent: false, - token: '123', + dryRun: true, + folder: 'assets', branch: 'branch', - folder: '.', + token: '123', pusher: { name: 'asd', email: 'as@cat' - } + }, + isTest: TestFlag.HAS_CHANGED_FILES }) - try { - await generateBranch(action) - } catch (error) { - expect(error.message).toBe( - 'There was an error creating the deployment branch: Mocked throw ❌' - ) - } + const response = await deploy(action) + + // Includes the call to generateWorktree + expect(execute).toBeCalledTimes(10) + expect(rmRF).toBeCalledTimes(1) + expect(response).toBe(Status.SUCCESS) }) - }) - describe('deploy', () => { - it('should execute commands', async () => { + it('should execute commands with single commit toggled', async () => { Object.assign(action, { silent: false, - folder: 'assets', + folder: 'other', + folderPath: 'other', branch: 'branch', token: '123', + singleCommit: true, pusher: { name: 'asd', email: 'as@cat' - } + }, + clean: true, + isTest: TestFlag.HAS_CHANGED_FILES }) - const response = await deploy(action) + await deploy(action) - // Includes the call to generateBranch + // Includes the call to generateWorktree expect(execute).toBeCalledTimes(10) - expect(execute).toHaveBeenNthCalledWith( - 9, - expect.not.stringContaining('--dry-run'), - expect.anything(), - false - ) expect(rmRF).toBeCalledTimes(1) - expect(response).toBe(Status.SUCCESS) }) - it('should push with --dry-run', async () => { + it('should execute commands with single commit toggled and existing branch', async () => { Object.assign(action, { silent: false, - dryRun: true, - folder: 'assets', + folder: 'other', + folderPath: 'other', branch: 'branch', token: '123', + singleCommit: true, pusher: { name: 'asd', email: 'as@cat' - } + }, + clean: true, + isTest: TestFlag.HAS_CHANGED_FILES | TestFlag.HAS_REMOTE_BRANCH }) - const response = await deploy(action) + await deploy(action) - // Includes the call to generateBranch - expect(execute).toBeCalledTimes(10) - expect(execute).toHaveBeenNthCalledWith( - 9, - expect.stringContaining('--dry-run'), - expect.anything(), - false - ) + // Includes the call to generateWorktree + expect(execute).toBeCalledTimes(9) expect(rmRF).toBeCalledTimes(1) - expect(response).toBe(Status.SUCCESS) }) - it('should execute commands with single commit toggled', async () => { + it('should execute commands with single commit and dryRun toggled', async () => { Object.assign(action, { silent: false, folder: 'other', folderPath: 'other', branch: 'branch', - token: '123', + gitHubToken: '123', singleCommit: true, + dryRun: true, pusher: { name: 'asd', email: 'as@cat' }, - clean: true + clean: true, + isTest: TestFlag.HAS_CHANGED_FILES }) await deploy(action) - // Includes the call to generateBranch - expect(execute).toBeCalledTimes(16) + // Includes the call to generateWorktree + expect(execute).toBeCalledTimes(9) expect(rmRF).toBeCalledTimes(1) }) @@ -193,7 +188,8 @@ describe('git', () => { name: 'asd', email: 'as@cat' }, - clean: true + clean: true, + isTest: TestFlag.HAS_CHANGED_FILES }) fs.createWriteStream('assets/.nojekyll') @@ -201,13 +197,13 @@ describe('git', () => { const response = await deploy(action) - // Includes the call to generateBranch - expect(execute).toBeCalledTimes(10) + // Includes the call to generateWorktree + expect(execute).toBeCalledTimes(11) expect(rmRF).toBeCalledTimes(1) expect(response).toBe(Status.SUCCESS) }) - it('should execute commands with clean options, ommits sha commit message', async () => { + it('should execute commands with clean options, commits sha commit message', async () => { process.env.GITHUB_SHA = '' Object.assign(action, { silent: false, @@ -221,13 +217,14 @@ describe('git', () => { }, clean: true, cleanExclude: '["cat", "montezuma"]', - workspace: 'other' + workspace: 'other', + isTest: TestFlag.NONE }) await deploy(action) - // Includes the call to generateBranch - expect(execute).toBeCalledTimes(10) + // Includes the call to generateWorktree + expect(execute).toBeCalledTimes(8) expect(rmRF).toBeCalledTimes(1) }) @@ -243,13 +240,14 @@ describe('git', () => { email: 'as@cat' }, clean: true, - cleanExclude: ['cat', 'montezuma'] + cleanExclude: ['cat', 'montezuma'], + isTest: TestFlag.NONE }) await deploy(action) - // Includes the call to generateBranch - expect(execute).toBeCalledTimes(10) + // Includes the call to generateWorktree + expect(execute).toBeCalledTimes(8) expect(rmRF).toBeCalledTimes(1) }) @@ -263,13 +261,13 @@ describe('git', () => { clean: true, targetFolder: 'new_folder', commitMessage: 'Hello!', - isTest: true, + isTest: TestFlag.NONE, cleanExclude: '["cat, "montezuma"]' // There is a syntax errror in the string. }) await deploy(action) - expect(execute).toBeCalledTimes(10) + expect(execute).toBeCalledTimes(8) expect(rmRF).toBeCalledTimes(1) expect(mkdirP).toBeCalledTimes(1) }) @@ -284,11 +282,11 @@ describe('git', () => { name: 'asd', email: 'as@cat' }, - isTest: false // Setting this env variable to false means there will never be anything to commit and the action will exit early. + isTest: TestFlag.NONE // Setting this flag to None means there will never be anything to commit and the action will exit early. }) const response = await deploy(action) - expect(execute).toBeCalledTimes(10) + expect(execute).toBeCalledTimes(8) expect(rmRF).toBeCalledTimes(1) expect(response).toBe(Status.SKIPPED) }) @@ -306,7 +304,8 @@ describe('git', () => { pusher: { name: 'asd', email: 'as@cat' - } + }, + isTest: TestFlag.HAS_CHANGED_FILES }) try { diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts index 6044032fc..4d02492fd 100644 --- a/__tests__/main.test.ts +++ b/__tests__/main.test.ts @@ -5,7 +5,7 @@ process.env['GITHUB_SHA'] = '123' process.env['INPUT_DEBUG'] = 'debug' import '../src/main' -import {action} from '../src/constants' +import {action, TestFlag} from '../src/constants' import run from '../src/lib' import {execute} from '../src/execute' import {rmRF} from '@actions/io' @@ -44,11 +44,11 @@ describe('main', () => { name: 'asd', email: 'as@cat' }, - isTest: false, + isTest: TestFlag.NONE, debug: true }) await run(action) - expect(execute).toBeCalledTimes(12) + expect(execute).toBeCalledTimes(10) expect(rmRF).toBeCalledTimes(1) expect(exportVariable).toBeCalledTimes(1) }) @@ -62,10 +62,11 @@ describe('main', () => { pusher: { name: 'asd', email: 'as@cat' - } + }, + isTest: TestFlag.HAS_CHANGED_FILES }) await run(action) - expect(execute).toBeCalledTimes(12) + expect(execute).toBeCalledTimes(13) expect(rmRF).toBeCalledTimes(1) expect(exportVariable).toBeCalledTimes(1) }) @@ -80,7 +81,7 @@ describe('main', () => { name: 'asd', email: 'as@cat' }, - isTest: true + isTest: TestFlag.HAS_CHANGED_FILES }) await run(action) expect(execute).toBeCalledTimes(0) diff --git a/__tests__/util.test.ts b/__tests__/util.test.ts index dd37eff02..7fa92024d 100644 --- a/__tests__/util.test.ts +++ b/__tests__/util.test.ts @@ -1,4 +1,4 @@ -import {ActionInterface} from '../src/constants' +import {ActionInterface, TestFlag} from '../src/constants' import { isNullOrUndefined, generateTokenType, @@ -39,7 +39,8 @@ describe('util', () => { folder: 'build', token: null, ssh: true, - silent: false + silent: false, + isTest: TestFlag.NONE } expect(generateTokenType(action)).toEqual('SSH Deploy Key') }) @@ -51,7 +52,8 @@ describe('util', () => { folder: 'build', token: '123', ssh: null, - silent: false + silent: false, + isTest: TestFlag.NONE } expect(generateTokenType(action)).toEqual('Deploy Token') }) @@ -63,7 +65,8 @@ describe('util', () => { folder: 'build', token: null, ssh: null, - silent: false + silent: false, + isTest: TestFlag.NONE } expect(generateTokenType(action)).toEqual('…') }) @@ -78,7 +81,8 @@ describe('util', () => { folder: 'build', token: null, ssh: true, - silent: false + silent: false, + isTest: TestFlag.NONE } expect(generateRepositoryPath(action)).toEqual( 'git@github.com:JamesIves/github-pages-deploy-action' @@ -93,7 +97,8 @@ describe('util', () => { folder: 'build', token: '123', ssh: null, - silent: false + silent: false, + isTest: TestFlag.NONE } expect(generateRepositoryPath(action)).toEqual( 'https://x-access-token:123@github.com/JamesIves/github-pages-deploy-action.git' @@ -110,7 +115,8 @@ describe('util', () => { workspace: 'src/', folder: 'build', token: 'anothersecret123333', - silent: false + silent: false, + isTest: TestFlag.NONE } const string = `This is an error message! It contains ${action.token} and ${action.repositoryPath} and ${action.token} again!` @@ -128,7 +134,8 @@ describe('util', () => { workspace: 'src/', folder: 'build', token: 'anothersecret123333', - silent: false + silent: false, + isTest: TestFlag.NONE } process.env['RUNNER_DEBUG'] = '1' @@ -149,7 +156,8 @@ describe('util', () => { folder: 'build', token: null, ssh: null, - silent: false + silent: false, + isTest: TestFlag.NONE } expect(generateFolderPath(action)).toEqual('src/build') }) @@ -161,7 +169,8 @@ describe('util', () => { folder: '/home/user/repo/build', token: null, ssh: null, - silent: false + silent: false, + isTest: TestFlag.NONE } expect(generateFolderPath(action)).toEqual('/home/user/repo/build') }) @@ -173,7 +182,8 @@ describe('util', () => { folder: './build', token: null, ssh: null, - silent: false + silent: false, + isTest: TestFlag.NONE } expect(generateFolderPath(action)).toEqual('src/build') }) @@ -185,7 +195,8 @@ describe('util', () => { folder: '~/repo/build', token: null, ssh: null, - silent: false + silent: false, + isTest: TestFlag.NONE } process.env.HOME = '/home/user' expect(generateFolderPath(action)).toEqual('/home/user/repo/build') @@ -199,7 +210,8 @@ describe('util', () => { repositoryPath: undefined, branch: 'branch', folder: 'build', - workspace: 'src/' + workspace: 'src/', + isTest: TestFlag.NONE } try { @@ -218,7 +230,8 @@ describe('util', () => { token: '', branch: 'branch', folder: 'build', - workspace: 'src/' + workspace: 'src/', + isTest: TestFlag.NONE } try { @@ -237,7 +250,8 @@ describe('util', () => { token: '123', branch: '', folder: 'build', - workspace: 'src/' + workspace: 'src/', + isTest: TestFlag.NONE } try { @@ -254,7 +268,8 @@ describe('util', () => { token: '123', branch: 'branch', folder: '', - workspace: 'src/' + workspace: 'src/', + isTest: TestFlag.NONE } try { @@ -273,7 +288,8 @@ describe('util', () => { token: '123', branch: 'branch', folder: 'notARealFolder', - workspace: '.' + workspace: '.', + isTest: TestFlag.NONE } try { diff --git a/__tests__/worktree.error.test.ts b/__tests__/worktree.error.test.ts new file mode 100644 index 000000000..57676ebd5 --- /dev/null +++ b/__tests__/worktree.error.test.ts @@ -0,0 +1,35 @@ +import {TestFlag} from '../src/constants' +import {execute} from '../src/execute' +import {generateWorktree} from '../src/worktree' + +jest.mock('../src/execute', () => ({ + // eslint-disable-next-line @typescript-eslint/naming-convention + __esModule: true, + execute: jest.fn() +})) + +describe('generateWorktree', () => { + it('should catch when a function throws an error', async () => { + ;(execute as jest.Mock).mockImplementationOnce(() => { + throw new Error('Mocked throw') + }) + try { + await generateWorktree( + { + workspace: 'somewhere', + singleCommit: false, + branch: 'gh-pages', + folder: '', + silent: true, + isTest: TestFlag.HAS_CHANGED_FILES + }, + 'worktree', + true + ) + } catch (error) { + expect(error.message).toBe( + 'There was an error creating the worktree: Mocked throw ❌' + ) + } + }) +}) diff --git a/__tests__/worktree.test.ts b/__tests__/worktree.test.ts new file mode 100644 index 000000000..91626f7ca --- /dev/null +++ b/__tests__/worktree.test.ts @@ -0,0 +1,195 @@ +import {rmRF} from '@actions/io' +import {TestFlag} from '../src/constants' +import {generateWorktree} from '../src/worktree' +import {execute} from '../src/execute' +import fs from 'fs' +import os from 'os' +import path from 'path' + +jest.mock('@actions/core', () => ({ + setFailed: jest.fn(), + getInput: jest.fn(), + isDebug: jest.fn(), + info: jest.fn() +})) + +/* + Test generateWorktree against a known git repository. + The upstream repository `origin` is set up once for the test suite, + and for each test run, a new clone is created. + + See workstree.error.test.ts for testing mocked errors from git.*/ + +describe('generateWorktree', () => { + let tempdir: string | null = null + let clonedir: string | null = null + beforeAll(async () => { + // Set up origin repository + const silent = true + tempdir = fs.mkdtempSync(path.join(os.tmpdir(), 'gh-deploy-')) + const origin = path.join(tempdir, 'origin') + await execute('git init origin', tempdir, silent) + await execute('git config user.email "you@example.com"', origin, silent) + await execute('git config user.name "Jane Doe"', origin, silent) + await execute('git checkout -b main', origin, silent) + fs.writeFileSync(path.join(origin, 'f1'), 'hello world\n') + await execute('git add .', origin, silent) + await execute('git commit -mc0', origin, silent) + fs.writeFileSync(path.join(origin, 'f1'), 'hello world\nand planets\n') + await execute('git add .', origin, silent) + await execute('git commit -mc1', origin, silent) + await execute('git checkout --orphan gh-pages', origin, silent) + await execute('git reset --hard', origin, silent) + await fs.promises.writeFile(path.join(origin, 'gh1'), 'pages content\n') + await execute('git add .', origin, silent) + await execute('git commit -mgh0', origin, silent) + await fs.promises.writeFile( + path.join(origin, 'gh1'), + 'pages content\ngoes on\n' + ) + await execute('git add .', origin, silent) + await execute('git commit -mgh1', origin, silent) + }) + beforeEach(async () => { + // Clone origin to our workspace for each test + const silent = true + clonedir = path.join(tempdir as string, 'clone') + await execute('git init clone', tempdir as string, silent) + await execute('git config user.email "you@example.com"', clonedir, silent) + await execute('git config user.name "Jane Doe"', clonedir, silent) + await execute( + `git remote add origin ${path.join(tempdir as string, 'origin')}`, + clonedir, + silent + ) + await execute('git fetch --depth=1 origin main', clonedir, silent) + await execute('git checkout main', clonedir, silent) + }) + afterEach(async () => { + // Tear down workspace + await rmRF(clonedir as string) + }) + afterAll(async () => { + // Tear down origin repository + if (tempdir) { + await rmRF(tempdir) + // console.log(tempdir) + } + }) + describe('with existing branch and new commits', () => { + it('should check out the latest commit', async () => { + const workspace = clonedir as string + await generateWorktree( + { + workspace, + singleCommit: false, + branch: 'gh-pages', + folder: '', + silent: true, + isTest: TestFlag.NONE + }, + 'worktree', + true + ) + const dirEntries = await fs.promises.readdir( + path.join(workspace, 'worktree') + ) + expect(dirEntries.sort((a, b) => a.localeCompare(b))).toEqual([ + '.git', + 'gh1' + ]) + const commitMessages = await execute( + 'git log --format=%s', + path.join(workspace, 'worktree'), + true + ) + expect(commitMessages).toBe('gh1') + }) + }) + describe('with missing branch and new commits', () => { + it('should create initial commit', async () => { + const workspace = clonedir as string + await generateWorktree( + { + workspace, + singleCommit: false, + branch: 'no-pages', + folder: '', + silent: true, + isTest: TestFlag.NONE + }, + 'worktree', + false + ) + const dirEntries = await fs.promises.readdir( + path.join(workspace, 'worktree') + ) + expect(dirEntries).toEqual(['.git']) + const commitMessages = await execute( + 'git log --format=%s', + path.join(workspace, 'worktree'), + true + ) + expect(commitMessages).toBe('Initial no-pages commit') + }) + }) + describe('with existing branch and singleCommit', () => { + it('should check out the latest commit', async () => { + const workspace = clonedir as string + await generateWorktree( + { + workspace, + singleCommit: true, + branch: 'gh-pages', + folder: '', + silent: true, + isTest: TestFlag.NONE + }, + 'worktree', + true + ) + const dirEntries = await fs.promises.readdir( + path.join(workspace, 'worktree') + ) + expect(dirEntries.sort((a, b) => a.localeCompare(b))).toEqual([ + '.git', + 'gh1' + ]) + expect(async () => { + await execute( + 'git log --format=%s', + path.join(workspace, 'worktree'), + true + ) + }).rejects.toThrow() + }) + }) + describe('with missing branch and singleCommit', () => { + it('should create initial commit', async () => { + const workspace = clonedir as string + await generateWorktree( + { + workspace, + singleCommit: true, + branch: 'no-pages', + folder: '', + silent: true, + isTest: TestFlag.NONE + }, + 'worktree', + false + ) + const dirEntries = await fs.promises.readdir( + path.join(workspace, 'worktree') + ) + expect(dirEntries).toEqual(['.git']) + expect(async () => { + await execute( + 'git log --format=%s', + path.join(workspace, 'worktree'), + true + ) + }).rejects.toThrow() + }) + }) +}) diff --git a/action.yml b/action.yml index 2383a022a..746943031 100644 --- a/action.yml +++ b/action.yml @@ -50,6 +50,10 @@ inputs: description: "If you need to use CLEAN but you would like to preserve certain files or folders you can use this option. This should be formatted as an array but stored as a string." required: false + DRY_RUN: + description: "Do not actually push back, but use `--dry-run` on `git push` invocations insead." + required: false + GIT_CONFIG_NAME: description: "Allows you to customize the name that is attached to the GitHub config which is used when pushing the deployment commits. If this is not included it will use the name in the GitHub context, followed by the name of the action." required: false diff --git a/src/constants.ts b/src/constants.ts index 0b85dcde8..91a323050 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -4,6 +4,13 @@ import {isNullOrUndefined} from './util' const {pusher, repository} = github.context.payload +/* Flags to signal different scenarios to test cases */ +export enum TestFlag { + NONE = 0, + HAS_CHANGED_FILES = 1 << 1, // Assume changes to commit + HAS_REMOTE_BRANCH = 1 << 2 // Assume remote repository has existing commits +} + /* For more information please refer to the README: https://github.com/JamesIves/github-pages-deploy-action */ export interface ActionInterface { /** The branch that the action should deploy to. */ @@ -22,8 +29,8 @@ export interface ActionInterface { folder: string /** The auto generated folder path. */ folderPath?: string - /** Determines if the action is running in test mode or not. */ - isTest?: boolean | null + /** Determines test scenarios the action is running in. */ + isTest: TestFlag /** The git config name. */ name?: string /** The repository path, for example JamesIves/github-pages-deploy-action. */ @@ -62,6 +69,7 @@ export interface NodeActionInterface { ssh?: boolean | null /** The folder where your deployment project lives. */ workspace: string + isTest: TestFlag } /* Required action data that gets initialized when running within the GitHub Actions environment. */ @@ -76,9 +84,7 @@ export const action: ActionInterface = { ? getInput('CLEAN').toLowerCase() === 'true' : false, cleanExclude: getInput('CLEAN_EXCLUDE'), - isTest: process.env.UNIT_TEST - ? process.env.UNIT_TEST.toLowerCase() === 'true' - : false, + isTest: TestFlag.NONE, email: !isNullOrUndefined(getInput('GIT_CONFIG_EMAIL')) ? getInput('GIT_CONFIG_EMAIL') : pusher && pusher.email @@ -115,7 +121,7 @@ export const action: ActionInterface = { /** Types for the required action parameters. */ export type RequiredActionParameters = Pick< ActionInterface, - 'token' | 'ssh' | 'branch' | 'folder' + 'token' | 'ssh' | 'branch' | 'folder' | 'isTest' > /** Status codes for the action. */ diff --git a/src/git.ts b/src/git.ts index de35d3e7c..354e4b477 100644 --- a/src/git.ts +++ b/src/git.ts @@ -1,8 +1,9 @@ import {info} from '@actions/core' import {mkdirP, rmRF} from '@actions/io' import fs from 'fs' -import {ActionInterface, Status} from './constants' +import {ActionInterface, Status, TestFlag} from './constants' import {execute} from './execute' +import {generateWorktree} from './worktree' import {isNullOrUndefined, suppressSensitiveInformation} from './util' /* Initializes git in the workspace. */ @@ -33,41 +34,6 @@ export async function init(action: ActionInterface): Promise { } } -/* Generates the branch if it doesn't exist on the remote. */ -export async function generateBranch(action: ActionInterface): Promise { - try { - info(`Creating the ${action.branch} branch…`) - - await execute( - `git checkout --orphan ${action.branch}`, - action.workspace, - action.silent - ) - await execute(`git reset --hard`, action.workspace, action.silent) - await execute( - `git commit --no-verify --allow-empty -m "Initial ${action.branch} commit"`, - action.workspace, - action.silent - ) - const dry = action.dryRun ? '--dry-run ' : '' - await execute( - `git push --force ${dry}${action.repositoryPath} ${action.branch}`, - action.workspace, - action.silent - ) - await execute(`git fetch`, action.workspace, action.silent) - - info(`Created the ${action.branch} branch… 🔧`) - } catch (error) { - throw new Error( - `There was an error creating the deployment branch: ${suppressSensitiveInformation( - error.message, - action - )} ❌` - ) - } -} - /* Runs the necessary steps to make the deployment. */ export async function deploy(action: ActionInterface): Promise { const temporaryDeploymentDirectory = @@ -75,7 +41,6 @@ export async function deploy(action: ActionInterface): Promise { const temporaryDeploymentBranch = `github-pages-deploy-action/${Math.random() .toString(36) .substr(2, 9)}` - const dry = action.dryRun ? '--dry-run ' : '' info('Starting to commit changes…') @@ -86,31 +51,16 @@ export async function deploy(action: ActionInterface): Promise { process.env.GITHUB_SHA ? ` from @ ${process.env.GITHUB_SHA}` : '' } 🚀` - /* - Checks to see if the remote exists prior to deploying. - If the branch doesn't exist it gets created here as an orphan. - */ - const branchExists = await execute( - `git ls-remote --heads ${action.repositoryPath} ${action.branch} | wc -l`, - action.workspace, - action.silent - ) - - if (!branchExists && !action.isTest) { - await generateBranch(action) - } else { - await execute( - `git fetch --no-recurse-submodules --depth=1 origin ${action.branch}`, + // Checks to see if the remote exists prior to deploying. + const branchExists = + action.isTest & TestFlag.HAS_REMOTE_BRANCH || + (await execute( + `git ls-remote --heads ${action.repositoryPath} ${action.branch} | wc -l`, action.workspace, action.silent - ) - } + )) - await execute( - `git worktree add --checkout ${temporaryDeploymentDirectory} origin/${action.branch}`, - action.workspace, - action.silent - ) + await generateWorktree(action, temporaryDeploymentDirectory, branchExists) // Ensures that items that need to be excluded from the clean job get parsed. let excludes = '' @@ -166,13 +116,23 @@ export async function deploy(action: ActionInterface): Promise { action.silent ) - const hasFilesToCommit = await execute( - `git status --porcelain`, - `${action.workspace}/${temporaryDeploymentDirectory}`, - action.silent - ) + // Use git status to check if we have something to commit. + // Special case is singleCommit with existing history, when + // we're really interested if the diff against the upstream branch + // changed. + const checkGitStatus = + branchExists && action.singleCommit + ? `git diff origin/${action.branch}` + : `git status --porcelain` + const hasFilesToCommit = + action.isTest & TestFlag.HAS_CHANGED_FILES || + (await execute( + checkGitStatus, + `${action.workspace}/${temporaryDeploymentDirectory}`, + action.silent + )) - if (!hasFilesToCommit && !action.isTest) { + if (!hasFilesToCommit) { return Status.SKIPPED } @@ -192,49 +152,16 @@ export async function deploy(action: ActionInterface): Promise { `${action.workspace}/${temporaryDeploymentDirectory}`, action.silent ) - await execute( - `git push --force ${dry}${action.repositoryPath} ${temporaryDeploymentBranch}:${action.branch}`, - `${action.workspace}/${temporaryDeploymentDirectory}`, - action.silent - ) - - info(`Changes committed to the ${action.branch} branch… 📦`) - - if (action.singleCommit) { + if (!action.dryRun) { await execute( - `git fetch ${action.repositoryPath}`, - action.workspace, - action.silent - ) - await execute( - `git checkout --orphan ${action.branch}-temp`, + `git push --force ${action.repositoryPath} ${temporaryDeploymentBranch}:${action.branch}`, `${action.workspace}/${temporaryDeploymentDirectory}`, action.silent ) - await execute( - `git add --all .`, - `${action.workspace}/${temporaryDeploymentDirectory}`, - action.silent - ) - await execute( - `git commit -m "${commitMessage}" --quiet --no-verify`, - `${action.workspace}/${temporaryDeploymentDirectory}`, - action.silent - ) - await execute( - `git branch -M ${action.branch}-temp ${action.branch}`, - `${action.workspace}/${temporaryDeploymentDirectory}`, - action.silent - ) - await execute( - `git push origin ${action.branch} ${dry}--force`, - `${action.workspace}/${temporaryDeploymentDirectory}`, - action.silent - ) - - info('Cleared git history… 🚿') } + info(`Changes committed to the ${action.branch} branch… 📦`) + return Status.SUCCESS } catch (error) { throw new Error( diff --git a/src/worktree.ts b/src/worktree.ts new file mode 100644 index 000000000..0fad213e3 --- /dev/null +++ b/src/worktree.ts @@ -0,0 +1,85 @@ +import {info} from '@actions/core' +import {ActionInterface} from './constants' +import {execute} from './execute' +import {suppressSensitiveInformation} from './util' + +export class GitCheckout { + orphan = false + commitish?: string | null = null + branch: string + constructor(branch: string) { + this.branch = branch + } + toString(): string { + return [ + 'git', + 'checkout', + this.orphan ? '--orphan' : '-B', + this.branch, + this.commitish || '' + ].join(' ') + } +} +/* Generate the worktree and set initial content if it exists */ + +export async function generateWorktree( + action: ActionInterface, + worktreedir: string, + branchExists: boolean +): Promise { + try { + info('Creating worktree…') + + if (branchExists) { + await execute( + `git fetch --no-recurse-submodules --depth=1 origin ${action.branch}`, + action.workspace, + action.silent + ) + } + + await execute( + `git worktree add --no-checkout --detach ${worktreedir}`, + action.workspace, + action.silent + ) + const checkout = new GitCheckout(action.branch) + if (branchExists) { + // There's existing data on the branch to check out + checkout.commitish = `origin/${action.branch}` + } + if (!branchExists || action.singleCommit) { + // Create a new history if we don't have the branch, or if we want to reset it + checkout.orphan = true + } + await execute( + checkout.toString(), + `${action.workspace}/${worktreedir}`, + action.silent + ) + if (!branchExists) { + info(`Created the ${action.branch} branch… 🔧`) + // Our index is in HEAD state, reset + await execute( + 'git reset --hard', + `${action.workspace}/${worktreedir}`, + action.silent + ) + if (!action.singleCommit) { + // New history isn't singleCommit, create empty initial commit + await execute( + `git commit --no-verify --allow-empty -m "Initial ${action.branch} commit"`, + `${action.workspace}/${worktreedir}`, + action.silent + ) + } + } + } catch (error) { + throw new Error( + `There was an error creating the worktree: ${suppressSensitiveInformation( + error.message, + action + )} ❌` + ) + } +} From 570f002e7e609191ed3986f71e135d808aa790a5 Mon Sep 17 00:00:00 2001 From: James Ives Date: Mon, 14 Dec 2020 12:41:27 -0500 Subject: [PATCH 10/32] Update worktree.ts --- src/worktree.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/worktree.ts b/src/worktree.ts index 0fad213e3..9a820e747 100644 --- a/src/worktree.ts +++ b/src/worktree.ts @@ -20,8 +20,8 @@ export class GitCheckout { ].join(' ') } } -/* Generate the worktree and set initial content if it exists */ +/* Generate the worktree and set initial content if it exists */ export async function generateWorktree( action: ActionInterface, worktreedir: string, From 2a503ef9b5eda9c70da4b5396390143ae096292c Mon Sep 17 00:00:00 2001 From: Axel Hecht Date: Tue, 15 Dec 2020 16:58:52 +0100 Subject: [PATCH 11/32] =?UTF-8?q?Fix=20a=20few=20nits=20in=20tests=20and?= =?UTF-8?q?=20automation.=20Don't=20try=20to=20wordcount=20ls-rem=E2=80=A6?= =?UTF-8?q?=20(#546)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix a few nits in tests and automation. Don't try to wordcount ls-remote. Nits in tests are around undoing changes made to the environment, and to not modify the checkout. * Describe suite with empty SHA --- .github/workflows/build.yml | 2 +- __tests__/git.test.ts | 62 +++++++++++++++++++++++-------------- src/git.ts | 2 +- 3 files changed, 41 insertions(+), 25 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2ee7ccb4f..a088f6f65 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,7 +6,7 @@ on: - 'releases/v*' push: branches: - - dev + - 'dev*' tags-ignore: - '*.*' jobs: diff --git a/__tests__/git.test.ts b/__tests__/git.test.ts index e86df2afc..4b8bc7e2e 100644 --- a/__tests__/git.test.ts +++ b/__tests__/git.test.ts @@ -11,6 +11,10 @@ import fs from 'fs' const originalAction = JSON.stringify(action) +jest.mock('fs', () => ({ + existsSync: jest.fn() +})) + jest.mock('@actions/core', () => ({ setFailed: jest.fn(), getInput: jest.fn(), @@ -178,6 +182,14 @@ describe('git', () => { }) it('should not ignore CNAME or nojekyll if they exist in the deployment folder', async () => { + ;(fs.existsSync as jest.Mock) + .mockImplementationOnce(() => { + return true + }) + .mockImplementationOnce(() => { + return true + }) + Object.assign(action, { silent: false, folder: 'assets', @@ -192,40 +204,44 @@ describe('git', () => { isTest: TestFlag.HAS_CHANGED_FILES }) - fs.createWriteStream('assets/.nojekyll') - fs.createWriteStream('assets/CNAME') - const response = await deploy(action) // Includes the call to generateWorktree expect(execute).toBeCalledTimes(11) expect(rmRF).toBeCalledTimes(1) + expect(fs.existsSync).toBeCalledTimes(2) expect(response).toBe(Status.SUCCESS) }) - it('should execute commands with clean options, commits sha commit message', async () => { - process.env.GITHUB_SHA = '' - Object.assign(action, { - silent: false, - folder: 'other', - folderPath: 'other', - branch: 'branch', - token: '123', - pusher: { - name: 'asd', - email: 'as@cat' - }, - clean: true, - cleanExclude: '["cat", "montezuma"]', - workspace: 'other', - isTest: TestFlag.NONE + describe('with empty GITHUB_SHA', () => { + const oldSha = process.env.GITHUB_SHA + afterAll(() => { + process.env.GITHUB_SHA = oldSha }) + it('should execute commands with clean options', async () => { + process.env.GITHUB_SHA = '' + Object.assign(action, { + silent: false, + folder: 'other', + folderPath: 'other', + branch: 'branch', + token: '123', + pusher: { + name: 'asd', + email: 'as@cat' + }, + clean: true, + cleanExclude: '["cat", "montezuma"]', + workspace: 'other', + isTest: TestFlag.NONE + }) - await deploy(action) + await deploy(action) - // Includes the call to generateWorktree - expect(execute).toBeCalledTimes(8) - expect(rmRF).toBeCalledTimes(1) + // Includes the call to generateWorktree + expect(execute).toBeCalledTimes(8) + expect(rmRF).toBeCalledTimes(1) + }) }) it('should execute commands with clean options stored as an array instead', async () => { diff --git a/src/git.ts b/src/git.ts index 354e4b477..1c931c188 100644 --- a/src/git.ts +++ b/src/git.ts @@ -55,7 +55,7 @@ export async function deploy(action: ActionInterface): Promise { const branchExists = action.isTest & TestFlag.HAS_REMOTE_BRANCH || (await execute( - `git ls-remote --heads ${action.repositoryPath} ${action.branch} | wc -l`, + `git ls-remote --heads ${action.repositoryPath} ${action.branch}`, action.workspace, action.silent )) From d8c795395d7f9a3dd60de149b1dcf5c4812b6f26 Mon Sep 17 00:00:00 2001 From: James Ives Date: Tue, 15 Dec 2020 18:32:06 -0500 Subject: [PATCH 12/32] Lowercase Inputs (#547) * Lowercases inputs * Adjusts workflow tests and deployment_status --- .github/workflows/build.yml | 14 +- .github/workflows/integration-beta.yml | 196 ------------------------- .github/workflows/integration.yml | 74 +++++----- README.md | 58 ++++---- src/constants.ts | 44 +++--- src/lib.ts | 2 +- 6 files changed, 95 insertions(+), 293 deletions(-) delete mode 100644 .github/workflows/integration-beta.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a088f6f65..ad8d45367 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -93,10 +93,10 @@ jobs: - name: Deploy uses: ./ with: - FOLDER: integration - BRANCH: ${{ matrix.branch }} + folder: integration + branch: ${{ matrix.branch }} SINGLE_COMMIT: ${{ matrix.commit == 'singleCommit' }} - DRY_RUN: true + dry_run: true - name: Tweak content to publish to existing branch if: ${{ matrix.branch == 'gh-pages' }} @@ -107,7 +107,7 @@ jobs: uses: ./ if: ${{ matrix.branch == 'gh-pages' }} with: - FOLDER: integration - BRANCH: ${{ matrix.branch }} - SINGLE_COMMIT: ${{ matrix.commit == 'singleCommit' }} - DRY_RUN: true + folder: integration + branch: ${{ matrix.branch }} + single_commit: ${{ matrix.commit == 'singleCommit' }} + dry_run: true diff --git a/.github/workflows/integration-beta.yml b/.github/workflows/integration-beta.yml deleted file mode 100644 index 373331e0f..000000000 --- a/.github/workflows/integration-beta.yml +++ /dev/null @@ -1,196 +0,0 @@ -name: integration-tests-beta -on: - schedule: - - cron: 30 15 * * 0-6 - push: - branches: - - dev - - releases/v3-test - -jobs: - # Deploys using checkout@v1 with an ACCESS_TOKEN. - integration-checkout-v1: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v1 - - - name: Build and Deploy - uses: JamesIves/github-pages-deploy-action@releases/v3-test - with: - ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} - BRANCH: gh-pages-test - FOLDER: integration - TARGET_FOLDER: cat/montezuma - GIT_CONFIG_NAME: Montezuma - GIT_CONFIG_EMAIL: montezuma@jamesiv.es - - - name: Cleanup Generated Branch - uses: dawidd6/action-delete-branch@v2.0.1 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - branches: gh-pages-test - - - # Deploys using checkout@v2 with a GITHUB_TOKEN. - integration-checkout-v2: - needs: integration-checkout-v1 - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - persist-credentials: false - - - name: Build and Deploy - uses: JamesIves/github-pages-deploy-action@releases/v3-test - with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BRANCH: gh-pages-test - FOLDER: integration - TARGET_FOLDER: cat/montezuma2 - - - name: Cleanup Generated Branch - uses: dawidd6/action-delete-branch@v2.0.1 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - branches: gh-pages-test - - - # Deploys using a container that requires you to install rsync. - integration-container: - needs: integration-checkout-v2 - runs-on: ubuntu-latest - container: - image: ruby:2.6 - env: - LANG: C.UTF-8 - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - persist-credentials: false - - - name: Install rsync - run: | - apt-get update && apt-get install -y rsync - - - name: Build and Deploy - uses: JamesIves/github-pages-deploy-action@releases/v3-test - with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BRANCH: gh-pages-test - FOLDER: integration - TARGET_FOLDER: cat/montezuma2 - - - name: Cleanup Generated Branch - uses: dawidd6/action-delete-branch@v2.0.1 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - branches: gh-pages-test - - - # Deploys using an SSH key. - integration-ssh: - needs: integration-container - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - persist-credentials: false - - - name: Install SSH Client - uses: webfactory/ssh-agent@v0.4.1 - with: - ssh-private-key: ${{ secrets.DEPLOY_KEY }} - - - name: Build and Deploy - uses: JamesIves/github-pages-deploy-action@releases/v3-test - with: - SSH: true - BRANCH: gh-pages-test - FOLDER: integration - TARGET_FOLDER: cat/montezuma3 - - - name: Cleanup Generated Branch - uses: dawidd6/action-delete-branch@v2.0.1 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - branches: gh-pages-test - - - # Deploys using a custom env. - integration-env: - needs: integration-ssh - runs-on: ubuntu-latest - steps: - - uses: actions/setup-node@v1.4.4 - with: - node-version: '10.x' - - - name: Checkout - uses: actions/checkout@v2 - with: - persist-credentials: false - - - name: Install SSH Client - uses: webfactory/ssh-agent@v0.4.1 - with: - ssh-private-key: ${{ secrets.DEPLOY_KEY }} - - - name: Build and Deploy - uses: JamesIves/github-pages-deploy-action@releases/v3-test - with: - SSH: true - BRANCH: gh-pages-test - FOLDER: integration - TARGET_FOLDER: cat/montezuma4 - - - name: Cleanup Generated Branch - uses: dawidd6/action-delete-branch@v2.0.1 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - branches: gh-pages-test - - - # Deploys using the CLEAN option toggled. - integration-clean: - needs: [integration-checkout-v1, integration-checkout-v2, integration-container, integration-ssh, integration-env] - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - persist-credentials: false - - - name: Build and Deploy - uses: JamesIves/github-pages-deploy-action@releases/v3-test - with: - ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} - BRANCH: gh-pages-test - FOLDER: integration - CLEAN: true - - # Deploys to a branch that doesn't exist with SINGLE_COMMIT. - integration-branch-creation: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - persist-credentials: false - - - name: Build and Deploy - uses: JamesIves/github-pages-deploy-action@releases/v3-test - with: - ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} - BRANCH: integration-test-delete-beta - FOLDER: integration - SINGLE_COMMIT: true - - - name: Cleanup Generated Branch - uses: dawidd6/action-delete-branch@v2.0.1 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - branches: integration-test-delete-beta diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 6db33996b..2d1de3f65 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -7,7 +7,7 @@ on: - '*.*' branches: - dev - - releases/v3 + - releases/v4 jobs: # Deploys using checkout@v1 with an ACCESS_TOKEN. @@ -18,14 +18,14 @@ jobs: uses: actions/checkout@v1 - name: Build and Deploy - uses: JamesIves/github-pages-deploy-action@releases/v3 + uses: JamesIves/github-pages-deploy-action@releases/v4 with: - ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} - BRANCH: gh-pages - FOLDER: integration - TARGET_FOLDER: cat/montezuma - GIT_CONFIG_NAME: Montezuma - GIT_CONFIG_EMAIL: montezuma@jamesiv.es + token: ${{ secrets.ACCESS_TOKEN }} + branch: gh-pages + folder: integration + target_folder: cat/montezuma + git_config_name: Montezuma + git_config_email: montezuma@jamesiv.es - name: Cleanup Generated Branch uses: dawidd6/action-delete-branch@v2.0.1 @@ -44,12 +44,11 @@ jobs: persist-credentials: false - name: Build and Deploy - uses: JamesIves/github-pages-deploy-action@releases/v3 + uses: JamesIves/github-pages-deploy-action@releases/v4 with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BRANCH: gh-pages - FOLDER: integration - TARGET_FOLDER: cat/montezuma2 + branch: gh-pages + folder: integration + target_folder: cat/montezuma2 - name: Cleanup Generated Branch uses: dawidd6/action-delete-branch@v2.0.1 @@ -77,12 +76,11 @@ jobs: apt-get update && apt-get install -y rsync - name: Build and Deploy - uses: JamesIves/github-pages-deploy-action@releases/v3 + uses: JamesIves/github-pages-deploy-action@releases/v4 with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BRANCH: gh-pages - FOLDER: integration - TARGET_FOLDER: cat/montezuma2 + branch: gh-pages + folder: integration + target_folder: cat/montezuma2 - name: Cleanup Generated Branch uses: dawidd6/action-delete-branch@v2.0.1 @@ -106,12 +104,12 @@ jobs: ssh-private-key: ${{ secrets.DEPLOY_KEY }} - name: Build and Deploy - uses: JamesIves/github-pages-deploy-action@releases/v3 + uses: JamesIves/github-pages-deploy-action@releases/v4 with: - SSH: true - BRANCH: gh-pages - FOLDER: integration - TARGET_FOLDER: cat/montezuma3 + ssh: true + branch: gh-pages + folder: integration + target_folder: cat/montezuma3 - name: Cleanup Generated Branch uses: dawidd6/action-delete-branch@v2.0.1 @@ -139,12 +137,12 @@ jobs: ssh-private-key: ${{ secrets.DEPLOY_KEY }} - name: Build and Deploy - uses: JamesIves/github-pages-deploy-action@releases/v3 + uses: JamesIves/github-pages-deploy-action@releases/v4 with: - SSH: true - BRANCH: gh-pages - FOLDER: integration - TARGET_FOLDER: cat/montezuma4 + ssh: true + branch: gh-pages + folder: integration + target_folder: cat/montezuma4 - name: Cleanup Generated Branch uses: dawidd6/action-delete-branch@v2.0.1 @@ -163,12 +161,12 @@ jobs: persist-credentials: false - name: Build and Deploy - uses: JamesIves/github-pages-deploy-action@releases/v3 + uses: JamesIves/github-pages-deploy-action@releases/v4 with: - ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} - BRANCH: gh-pages - FOLDER: integration - CLEAN: true + token: ${{ secrets.ACCESS_TOKEN }} + branch: gh-pages + folder: integration + clean: true # Deploys to a branch that doesn't exist with SINGLE_COMMIT. integration-branch-creation: @@ -181,12 +179,12 @@ jobs: persist-credentials: false - name: Build and Deploy - uses: JamesIves/github-pages-deploy-action@releases/v3 + uses: JamesIves/github-pages-deploy-action@releases/v4 with: - ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} - BRANCH: integration-test-delete-prod - FOLDER: integration - SINGLE_COMMIT: true + token: ${{ secrets.ACCESS_TOKEN }} + branch: integration-test-delete-prod + folder: integration + single_commit: true - name: Cleanup Generated Branch uses: dawidd6/action-delete-branch@v2.0.1 diff --git a/README.md b/README.md index e5a017a59..36e1cc3db 100644 --- a/README.md +++ b/README.md @@ -64,8 +64,8 @@ jobs: - name: Deploy 🚀 uses: JamesIves/github-pages-deploy-action@3.7.1 with: - BRANCH: gh-pages # The branch the action should deploy to. - FOLDER: build # The folder the action should deploy. + branch: gh-pages # The branch the action should deploy to. + folder: build # The folder the action should deploy. ``` If you'd like to make it so the workflow only triggers on push events to specific branches then you can modify the `on` section. @@ -124,37 +124,37 @@ The following options must be configured in order to make a deployment. | Key | Value Information | Type | Required | | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | -------- | -| `BRANCH` | This is the branch you wish to deploy to, for example `gh-pages` or `docs`. | `with` | **Yes** | -| `FOLDER` | The folder in your repository that you want to deploy. If your build script compiles into a directory named `build` you'd put it here. If you wish to deploy the root directory you can place a `.` here. You can also utilize absolute file paths by appending `~` to your folder path. | `with` | **Yes** | +| `branch` | This is the branch you wish to deploy to, for example `gh-pages` or `docs`. | `with` | **Yes** | +| `folder` | The folder in your repository that you want to deploy. If your build script compiles into a directory named `build` you'd put it here. If you wish to deploy the root directory you can place a `.` here. You can also utilize absolute file paths by appending `~` to your folder path. | `with` | **Yes** | By default the action does not need any token configuration and uses the provided repository scoped GitHub token to make the deployment. If you require most customization you can modify the deployment type using the following options. | Key | Value Information | Type | Required | | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | -------- | -| `TOKEN` | This option defaults to the repository scoped GitHub Token. However if you need more permissions for things such as deploying to another repository, you can add a Personal Access Token (PAT) here. This should be stored in the `secrets / with` menu **as a secret**. We reccomend using a service account with the least permissions neccersary and recommend when generating a new PAT that you select the least permission scopes neccersary. [Learn more about creating and using encrypted secrets here.](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets) | **No** | -| `SSH` | You can configure the action to deploy using SSH by setting this option to `true`. For more information on how to add your ssh key pair please refer to the [Using a Deploy Key section of this README](https://github.com/JamesIves/github-pages-deploy-action/tree/dev#using-an-ssh-deploy-key-). | `with` | **No** | +| `token` | This option defaults to the repository scoped GitHub Token. However if you need more permissions for things such as deploying to another repository, you can add a Personal Access Token (PAT) here. This should be stored in the `secrets / with` menu **as a secret**. We reccomend using a service account with the least permissions neccersary and recommend when generating a new PAT that you select the least permission scopes neccersary. [Learn more about creating and using encrypted secrets here.](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets) | **No** | +| `ssh` | You can configure the action to deploy using SSH by setting this option to `true`. For more information on how to add your ssh key pair please refer to the [Using a Deploy Key section of this README](https://github.com/JamesIves/github-pages-deploy-action/tree/dev#using-an-ssh-deploy-key-). | `with` | **No** | #### Optional Choices | Key | Value Information | Type | Required | | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | -------- | -| `GIT_CONFIG_NAME` | Allows you to customize the name that is attached to the git config which is used when pushing the deployment commits. If this is not included it will use the name in the GitHub context, followed by the name of the action. | `with` | **No** | -| `GIT_CONFIG_EMAIL` | Allows you to customize the email that is attached to the git config which is used when pushing the deployment commits. If this is not included it will use the email in the GitHub context, followed by a generic noreply GitHub email. | `with` | **No** | -| `REPOSITORY_NAME` | Allows you to specify a different repository path so long as you have permissions to push to it. This should be formatted like so: `JamesIves/github-pages-deploy-action`. You'll need to use a PAT in the `TOKEN` input for this configuration option to work properly. | `with` | **No** | -| `TARGET_FOLDER` | If you'd like to push the contents of the deployment folder into a specific directory on the deployment branch you can specify it here. | `with` | **No** | -| `COMMIT_MESSAGE` | If you need to customize the commit message for an integration you can do so. | `with` | **No** | -| `CLEAN` | If your project generates hashed files on build you can use this option to automatically delete them from the deployment branch with each deploy. This option is turned on by default, and can be toggled off by setting it to `false`. | `with` | **No** | -| `CLEAN_EXCLUDE` | If you need to use `CLEAN` but you'd like to preserve certain files or folders you can use this option. This should be formatted as an array but stored as a string. For example: `'["filename.js", "folder"]'` | `with` | **No** | -| `DRY_RUN` | Do not actually push back, but use `--dry-run` on `git push` invocations insead. | `with` | **No** | -| `SINGLE_COMMIT` | This option can be toggled to `true` if you'd prefer to have a single commit on the deployment branch instead of maintaining the full history. **Using this option will also cause any existing history to be wiped from the deployment branch**. | `with` | **No** | -| `SILENT` | Silences the action output preventing it from displaying git messages. | `with` | **No** | -| `WORKSPACE` | This should point to where your project lives on the virtual machine. The GitHub Actions environment will set this for you. It is only necessary to set this variable if you're using the node module. | `with` | **No** | +| `git_config_name` | Allows you to customize the name that is attached to the git config which is used when pushing the deployment commits. If this is not included it will use the name in the GitHub context, followed by the name of the action. | `with` | **No** | +| `git_config_email` | Allows you to customize the email that is attached to the git config which is used when pushing the deployment commits. If this is not included it will use the email in the GitHub context, followed by a generic noreply GitHub email. | `with` | **No** | +| `repository_name` | Allows you to specify a different repository path so long as you have permissions to push to it. This should be formatted like so: `JamesIves/github-pages-deploy-action`. You'll need to use a PAT in the `token` input for this configuration option to work properly. | `with` | **No** | +| `target_folder` | If you'd like to push the contents of the deployment folder into a specific directory on the deployment branch you can specify it here. | `with` | **No** | +| `commit_message` | If you need to customize the commit message for an integration you can do so. | `with` | **No** | +| `clean` | If your project generates hashed files on build you can use this option to automatically delete them from the deployment branch with each deploy. This option is turned on by default, and can be toggled off by setting it to `false`. | `with` | **No** | +| `clean_exclude` | If you need to use `clean` but you'd like to preserve certain files or folders you can use this option. This should be formatted as an array but stored as a string. For example: `'["filename.js", "folder"]'` | `with` | **No** | +| `dry_run` | Do not actually push back, but use `--dry-run` on `git push` invocations insead. | `with` | **No** | +| `single_commit` | This option can be toggled to `true` if you'd prefer to have a single commit on the deployment branch instead of maintaining the full history. **Using this option will also cause any existing history to be wiped from the deployment branch**. | `with` | **No** | +| `silent` | Silences the action output preventing it from displaying git messages. | `with` | **No** | +| `workspace` | This should point to where your project lives on the virtual machine. The GitHub Actions environment will set this for you. It is only necessary to set this variable if you're using the node module. | `with` | **No** | With the action correctly configured you should see the workflow trigger the deployment under the configured conditions. #### Deployment Status -The action will export an environment variable called `DEPLOYMENT_STATUS` that you can use in your workflow to determine if the deployment was successful or not. You can find an explanation of each status type below. +The action will export an environment variable called `deployment_status` that you can use in your workflow to determine if the deployment was successful or not. You can find an explanation of each status type below. | Status | Description | | ------------- |-------------| @@ -174,7 +174,7 @@ ssh-keygen -t rsa -m pem -b 4096 -C "youremailhere@example.com" -N "" Once you've generated the key pair you must add the contents of the public key within your repository's [deploy keys menu](https://developer.github.com/v3/guides/managing-deploy-keys/). You can find this option by going to `Settings > Deploy Keys`, you can name the public key whatever you want, but you **do** need to give it write access. Afterwards add the contents of the private key to the `Settings > Secrets` menu as `DEPLOY_KEY`. -With this configured you must add the `ssh-agent` step to your workflow and set `SSH` to `true` within the deploy action. There are several SSH actions available on the [GitHub marketplace](https://github.com/marketplace?type=actions) for you to choose from. +With this configured you must add the `ssh-agent` step to your workflow and set `ssh` to `true` within the deploy action. There are several SSH actions available on the [GitHub marketplace](https://github.com/marketplace?type=actions) for you to choose from. ```yml - name: Install SSH Client 🔑 @@ -185,9 +185,9 @@ With this configured you must add the `ssh-agent` step to your workflow and set - name: Deploy 🚀 uses: JamesIves/github-pages-deploy-action@3.7.1 with: - SSH: true - BRANCH: gh-pages - FOLDER: site + ssh: true + branch: gh-pages + folder: site ```
You can view a full example of this here. @@ -221,10 +221,10 @@ jobs: - name: Deploy 🚀 uses: JamesIves/github-pages-deploy-action@3.7.1 with: - BRANCH: gh-pages - FOLDER: build - CLEAN: true - SSH: true # SSH must be set to true so the deploy action knows which protocol to deploy with. + branch: gh-pages + folder: build + clean: true + ssh: true # SSH must be set to true so the deploy action knows which protocol to deploy with. ```

@@ -287,9 +287,9 @@ jobs: - name: Deploy 🚀 uses: JamesIves/github-pages-deploy-action@3.7.1 with: - ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} - BRANCH: gh-pages - FOLDER: "site" # The deployment folder should match the name of the artifact. Even though our project builds into the 'build' folder the artifact name of 'site' must be placed here. + token: ${{ secrets.ACCESS_TOKEN }} + branch: gh-pages + folder: "site" # The deployment folder should match the name of the artifact. Even though our project builds into the 'build' folder the artifact name of 'site' must be placed here. ```

diff --git a/src/constants.ts b/src/constants.ts index 91a323050..4a6b12ed3 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -74,47 +74,47 @@ export interface NodeActionInterface { /* Required action data that gets initialized when running within the GitHub Actions environment. */ export const action: ActionInterface = { - folder: getInput('FOLDER'), - branch: getInput('BRANCH'), - commitMessage: getInput('COMMIT_MESSAGE'), - dryRun: !isNullOrUndefined(getInput('DRY_RUN')) - ? getInput('DRY_RUN').toLowerCase() === 'true' + folder: getInput('folder'), + branch: getInput('branch'), + commitMessage: getInput('commit_message'), + dryRun: !isNullOrUndefined(getInput('dry_run')) + ? getInput('dry_run').toLowerCase() === 'true' : false, - clean: !isNullOrUndefined(getInput('CLEAN')) - ? getInput('CLEAN').toLowerCase() === 'true' + clean: !isNullOrUndefined(getInput('clean')) + ? getInput('clean').toLowerCase() === 'true' : false, - cleanExclude: getInput('CLEAN_EXCLUDE'), + cleanExclude: getInput('clean_exclude'), isTest: TestFlag.NONE, - email: !isNullOrUndefined(getInput('GIT_CONFIG_EMAIL')) - ? getInput('GIT_CONFIG_EMAIL') + email: !isNullOrUndefined(getInput('git_config_email')) + ? getInput('git_config_email') : pusher && pusher.email ? pusher.email : `${ process.env.GITHUB_ACTOR || 'github-pages-deploy-action' }@users.noreply.github.com`, - name: !isNullOrUndefined(getInput('GIT_CONFIG_NAME')) - ? getInput('GIT_CONFIG_NAME') + name: !isNullOrUndefined(getInput('git_config_name')) + ? getInput('git_config_name') : pusher && pusher.name ? pusher.name : process.env.GITHUB_ACTOR ? process.env.GITHUB_ACTOR : 'GitHub Pages Deploy Action', - repositoryName: !isNullOrUndefined(getInput('REPOSITORY_NAME')) - ? getInput('REPOSITORY_NAME') + repositoryName: !isNullOrUndefined(getInput('repository_name')) + ? getInput('repository_name') : repository && repository.full_name ? repository.full_name : process.env.GITHUB_REPOSITORY, - token: getInput('TOKEN'), - singleCommit: !isNullOrUndefined(getInput('SINGLE_COMMIT')) - ? getInput('SINGLE_COMMIT').toLowerCase() === 'true' + token: getInput('token'), + singleCommit: !isNullOrUndefined(getInput('single_commit')) + ? getInput('single_commit').toLowerCase() === 'true' : false, - silent: !isNullOrUndefined(getInput('SILENT')) - ? getInput('SILENT').toLowerCase() === 'true' + silent: !isNullOrUndefined(getInput('silent')) + ? getInput('silent').toLowerCase() === 'true' : false, - ssh: !isNullOrUndefined(getInput('SSH')) - ? getInput('SSH').toLowerCase() === 'true' + ssh: !isNullOrUndefined(getInput('ssh')) + ? getInput('ssh').toLowerCase() === 'true' : false, - targetFolder: getInput('TARGET_FOLDER'), + targetFolder: getInput('target_folder'), workspace: process.env.GITHUB_WORKSPACE || '' } diff --git a/src/lib.ts b/src/lib.ts index 8f7b2c5c7..072b24eac 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -59,6 +59,6 @@ export default async function run( }` ) - exportVariable('DEPLOYMENT_STATUS', status) + exportVariable('deployment_status', status) } } From 7bf80b4b88484642613dcd34fe2cd1f6911f222b Mon Sep 17 00:00:00 2001 From: Axel Hecht Date: Tue, 29 Dec 2020 16:34:23 +0100 Subject: [PATCH 13/32] Use multi-line string for clean-exclude patterns. (#553) As this change is subtle, I'm taking the opportunity to change the underscore for the hyphen, which makes it less likely that users of this action will just pass in an old json array. --- README.md | 5 ++++- __tests__/git.test.ts | 8 +++----- action.yml | 4 ++-- src/constants.ts | 6 ++++-- src/git.ts | 15 ++------------- 5 files changed, 15 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 36e1cc3db..ddeeb655c 100644 --- a/README.md +++ b/README.md @@ -144,7 +144,7 @@ By default the action does not need any token configuration and uses the provide | `target_folder` | If you'd like to push the contents of the deployment folder into a specific directory on the deployment branch you can specify it here. | `with` | **No** | | `commit_message` | If you need to customize the commit message for an integration you can do so. | `with` | **No** | | `clean` | If your project generates hashed files on build you can use this option to automatically delete them from the deployment branch with each deploy. This option is turned on by default, and can be toggled off by setting it to `false`. | `with` | **No** | -| `clean_exclude` | If you need to use `clean` but you'd like to preserve certain files or folders you can use this option. This should be formatted as an array but stored as a string. For example: `'["filename.js", "folder"]'` | `with` | **No** | +| `clean-exclude` | If you need to use `clean` but you'd like to preserve certain files or folders you can use this option. This should contain each pattern as a single line in a multiline string. | `with` | **No** | | `dry_run` | Do not actually push back, but use `--dry-run` on `git push` invocations insead. | `with` | **No** | | `single_commit` | This option can be toggled to `true` if you'd prefer to have a single commit on the deployment branch instead of maintaining the full history. **Using this option will also cause any existing history to be wiped from the deployment branch**. | `with` | **No** | | `silent` | Silences the action output preventing it from displaying git messages. | `with` | **No** | @@ -224,6 +224,9 @@ jobs: branch: gh-pages folder: build clean: true + clean-exclude: | + special-file.txt + some/*.txt ssh: true # SSH must be set to true so the deploy action knows which protocol to deploy with. ``` diff --git a/__tests__/git.test.ts b/__tests__/git.test.ts index 4b8bc7e2e..e621385ab 100644 --- a/__tests__/git.test.ts +++ b/__tests__/git.test.ts @@ -231,7 +231,6 @@ describe('git', () => { email: 'as@cat' }, clean: true, - cleanExclude: '["cat", "montezuma"]', workspace: 'other', isTest: TestFlag.NONE }) @@ -244,7 +243,7 @@ describe('git', () => { }) }) - it('should execute commands with clean options stored as an array instead', async () => { + it('should execute commands with clean options stored as an array', async () => { Object.assign(action, { silent: false, folder: 'assets', @@ -267,7 +266,7 @@ describe('git', () => { expect(rmRF).toBeCalledTimes(1) }) - it('should gracefully handle incorrectly formatted clean exclude items', async () => { + it('should gracefully handle target folder', async () => { Object.assign(action, { silent: false, folder: '.', @@ -277,8 +276,7 @@ describe('git', () => { clean: true, targetFolder: 'new_folder', commitMessage: 'Hello!', - isTest: TestFlag.NONE, - cleanExclude: '["cat, "montezuma"]' // There is a syntax errror in the string. + isTest: TestFlag.NONE }) await deploy(action) diff --git a/action.yml b/action.yml index 746943031..50aaba54e 100644 --- a/action.yml +++ b/action.yml @@ -46,8 +46,8 @@ inputs: required: false default: 'true' - CLEAN_EXCLUDE: - description: "If you need to use CLEAN but you would like to preserve certain files or folders you can use this option. This should be formatted as an array but stored as a string." + clean-exclude: + description: "If you need to use CLEAN but you would like to preserve certain files or folders you can use this option. This should contain each pattern as a single line in a multiline string." required: false DRY_RUN: diff --git a/src/constants.ts b/src/constants.ts index 4a6b12ed3..097612f55 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -20,7 +20,7 @@ export interface ActionInterface { /** If your project generates hashed files on build you can use this option to automatically delete them from the deployment branch with each deploy. This option can be toggled on by setting it to true. */ clean?: boolean | null /** If you need to use CLEAN but you'd like to preserve certain files or folders you can use this option. */ - cleanExclude?: string | string[] + cleanExclude?: string[] /** If you need to customize the commit message for an integration you can do so. */ commitMessage?: string /** The git config email. */ @@ -83,7 +83,9 @@ export const action: ActionInterface = { clean: !isNullOrUndefined(getInput('clean')) ? getInput('clean').toLowerCase() === 'true' : false, - cleanExclude: getInput('clean_exclude'), + cleanExclude: (getInput('clean-exclude') || '') + .split('\n') + .filter(l => l !== ''), isTest: TestFlag.NONE, email: !isNullOrUndefined(getInput('git_config_email')) ? getInput('git_config_email') diff --git a/src/git.ts b/src/git.ts index 1c931c188..ea432fbf4 100644 --- a/src/git.ts +++ b/src/git.ts @@ -65,19 +65,8 @@ export async function deploy(action: ActionInterface): Promise { // Ensures that items that need to be excluded from the clean job get parsed. let excludes = '' if (action.clean && action.cleanExclude) { - try { - const excludedItems = - typeof action.cleanExclude === 'string' - ? JSON.parse(action.cleanExclude) - : action.cleanExclude - - for (const item of excludedItems) { - excludes += `--exclude ${item} ` - } - } catch { - info( - 'There was an error parsing your CLEAN_EXCLUDE items. Please refer to the README for more details. ❌' - ) + for (const item of action.cleanExclude) { + excludes += `--exclude ${item} ` } } From 291c5c792e28160dd5f6cdb7b1137477d15641cd Mon Sep 17 00:00:00 2001 From: Axel Hecht Date: Tue, 5 Jan 2021 16:39:10 +0100 Subject: [PATCH 14/32] Hyphenate inputs and outputs, add step output, fix #558 (#559) * Hyphenate inputs and outputs, add step output, fix #558 I've also tried to make the clean docs a bit clearer, and consistent about clean being on my default. Still not totally happy with the intro of the docs there, though. * Add testing of step outputs to build integration tests --- .github/workflows/build.yml | 27 +++++++++++++++++++---- .github/workflows/integration.yml | 16 +++++++------- README.md | 18 +++++++++------- __tests__/git.test.ts | 1 + __tests__/main.test.ts | 1 + action.yml | 36 +++++++++++++++---------------- src/constants.ts | 24 ++++++++++----------- src/lib.ts | 3 ++- 8 files changed, 75 insertions(+), 51 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ad8d45367..199f72911 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -91,12 +91,22 @@ jobs: name: dist - name: Deploy + id: unmodified uses: ./ with: folder: integration branch: ${{ matrix.branch }} - SINGLE_COMMIT: ${{ matrix.commit == 'singleCommit' }} - dry_run: true + single-commit: ${{ matrix.commit == 'singleCommit' }} + dry-run: true + + # Usually, this should be skipped, but if the upstream gh-pages + # branch doesn't match ours, it should still be a success. + - name: Check step output + run: | + [[ \ + ${{steps.unmodified.outputs.deployment-status}} = skipped || \ + ${{steps.unmodified.outputs.deployment-status}} = success \ + ]] - name: Tweak content to publish to existing branch if: ${{ matrix.branch == 'gh-pages' }} @@ -104,10 +114,19 @@ jobs: echo "" >> integration/index.html - name: Deploy with modifications to existing branch + id: modified uses: ./ if: ${{ matrix.branch == 'gh-pages' }} with: folder: integration branch: ${{ matrix.branch }} - single_commit: ${{ matrix.commit == 'singleCommit' }} - dry_run: true + single-commit: ${{ matrix.commit == 'singleCommit' }} + dry-run: true + + # The modified deployment should be a success, and not skipped. + - name: Check step output + if: ${{ matrix.branch == 'gh-pages' }} + run: | + [[ \ + ${{steps.modified.outputs.deployment-status}} = success \ + ]] diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 2d1de3f65..f46ad8b63 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -23,9 +23,9 @@ jobs: token: ${{ secrets.ACCESS_TOKEN }} branch: gh-pages folder: integration - target_folder: cat/montezuma - git_config_name: Montezuma - git_config_email: montezuma@jamesiv.es + target-folder: cat/montezuma + git-config-name: Montezuma + git-config-email: montezuma@jamesiv.es - name: Cleanup Generated Branch uses: dawidd6/action-delete-branch@v2.0.1 @@ -48,7 +48,7 @@ jobs: with: branch: gh-pages folder: integration - target_folder: cat/montezuma2 + target-folder: cat/montezuma2 - name: Cleanup Generated Branch uses: dawidd6/action-delete-branch@v2.0.1 @@ -80,7 +80,7 @@ jobs: with: branch: gh-pages folder: integration - target_folder: cat/montezuma2 + target-folder: cat/montezuma2 - name: Cleanup Generated Branch uses: dawidd6/action-delete-branch@v2.0.1 @@ -109,7 +109,7 @@ jobs: ssh: true branch: gh-pages folder: integration - target_folder: cat/montezuma3 + target-folder: cat/montezuma3 - name: Cleanup Generated Branch uses: dawidd6/action-delete-branch@v2.0.1 @@ -142,7 +142,7 @@ jobs: ssh: true branch: gh-pages folder: integration - target_folder: cat/montezuma4 + target-folder: cat/montezuma4 - name: Cleanup Generated Branch uses: dawidd6/action-delete-branch@v2.0.1 @@ -184,7 +184,7 @@ jobs: token: ${{ secrets.ACCESS_TOKEN }} branch: integration-test-delete-prod folder: integration - single_commit: true + single-commit: true - name: Cleanup Generated Branch uses: dawidd6/action-delete-branch@v2.0.1 diff --git a/README.md b/README.md index ddeeb655c..9de870103 100644 --- a/README.md +++ b/README.md @@ -138,15 +138,15 @@ By default the action does not need any token configuration and uses the provide | Key | Value Information | Type | Required | | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | -------- | -| `git_config_name` | Allows you to customize the name that is attached to the git config which is used when pushing the deployment commits. If this is not included it will use the name in the GitHub context, followed by the name of the action. | `with` | **No** | -| `git_config_email` | Allows you to customize the email that is attached to the git config which is used when pushing the deployment commits. If this is not included it will use the email in the GitHub context, followed by a generic noreply GitHub email. | `with` | **No** | -| `repository_name` | Allows you to specify a different repository path so long as you have permissions to push to it. This should be formatted like so: `JamesIves/github-pages-deploy-action`. You'll need to use a PAT in the `token` input for this configuration option to work properly. | `with` | **No** | -| `target_folder` | If you'd like to push the contents of the deployment folder into a specific directory on the deployment branch you can specify it here. | `with` | **No** | -| `commit_message` | If you need to customize the commit message for an integration you can do so. | `with` | **No** | -| `clean` | If your project generates hashed files on build you can use this option to automatically delete them from the deployment branch with each deploy. This option is turned on by default, and can be toggled off by setting it to `false`. | `with` | **No** | +| `git-config-name` | Allows you to customize the name that is attached to the git config which is used when pushing the deployment commits. If this is not included it will use the name in the GitHub context, followed by the name of the action. | `with` | **No** | +| `git-config-email` | Allows you to customize the email that is attached to the git config which is used when pushing the deployment commits. If this is not included it will use the email in the GitHub context, followed by a generic noreply GitHub email. | `with` | **No** | +| `repository-name` | Allows you to specify a different repository path so long as you have permissions to push to it. This should be formatted like so: `JamesIves/github-pages-deploy-action`. You'll need to use a PAT in the `token` input for this configuration option to work properly. | `with` | **No** | +| `target-folder` | If you'd like to push the contents of the deployment folder into a specific directory on the deployment branch you can specify it here. | `with` | **No** | +| `commit-message` | If you need to customize the commit message for an integration you can do so. | `with` | **No** | +| `clean` | If your project generates hashed files on build you can use this option to automatically delete them from the target folder on the deployment branch with each deploy. This option is turned on by default, and can be toggled off by setting it to `false`. | `with` | **No** | | `clean-exclude` | If you need to use `clean` but you'd like to preserve certain files or folders you can use this option. This should contain each pattern as a single line in a multiline string. | `with` | **No** | -| `dry_run` | Do not actually push back, but use `--dry-run` on `git push` invocations insead. | `with` | **No** | -| `single_commit` | This option can be toggled to `true` if you'd prefer to have a single commit on the deployment branch instead of maintaining the full history. **Using this option will also cause any existing history to be wiped from the deployment branch**. | `with` | **No** | +| `dry-run` | Do not actually push back, but use `--dry-run` on `git push` invocations insead. | `with` | **No** | +| `single-commit` | This option can be toggled to `true` if you'd prefer to have a single commit on the deployment branch instead of maintaining the full history. **Using this option will also cause any existing history to be wiped from the deployment branch**. | `with` | **No** | | `silent` | Silences the action output preventing it from displaying git messages. | `with` | **No** | | `workspace` | This should point to where your project lives on the virtual machine. The GitHub Actions environment will set this for you. It is only necessary to set this variable if you're using the node module. | `with` | **No** | @@ -162,6 +162,8 @@ The action will export an environment variable called `deployment_status` that y | `failed` | The `failed` status indicates that the action encountered an error while trying to deploy. | | `skipped` | The `skipped` status indicates that the action exited early as there was nothing new to deploy. | +This value is also set as a step output as `deployment-status`. + --- ### Using an SSH Deploy Key 🔑 diff --git a/__tests__/git.test.ts b/__tests__/git.test.ts index e621385ab..b6d38e761 100644 --- a/__tests__/git.test.ts +++ b/__tests__/git.test.ts @@ -18,6 +18,7 @@ jest.mock('fs', () => ({ jest.mock('@actions/core', () => ({ setFailed: jest.fn(), getInput: jest.fn(), + setOutput: jest.fn(), isDebug: jest.fn(), info: jest.fn() })) diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts index 4d02492fd..fc5b9d3b4 100644 --- a/__tests__/main.test.ts +++ b/__tests__/main.test.ts @@ -24,6 +24,7 @@ jest.mock('@actions/io', () => ({ jest.mock('@actions/core', () => ({ setFailed: jest.fn(), getInput: jest.fn(), + setOutput: jest.fn(), exportVariable: jest.fn(), isDebug: jest.fn(), info: jest.fn() diff --git a/action.yml b/action.yml index 50aaba54e..00e1398e9 100644 --- a/action.yml +++ b/action.yml @@ -8,11 +8,11 @@ branding: icon: 'git-commit' color: 'orange' inputs: - SSH: + ssh: description: 'You can configure the action to deploy using SSH by setting this option to true. More more information on how to add your ssh key pair please refer to the Using a Deploy Key section of this README.' required: false - TOKEN: + token: description: > This option defaults to the repository scoped GitHub Token. However if you need more permissions for things such as deploying to another repository, you can add a Personal Access Token (PAT) here. @@ -25,59 +25,59 @@ inputs: required: false default: ${{ github.token }} - BRANCH: + branch: description: 'This is the branch you wish to deploy to, for example gh-pages or docs.' required: true - FOLDER: + folder: description: 'The folder in your repository that you want to deploy. If your build script compiles into a directory named build you would put it here. Folder paths cannot have a leading / or ./. If you wish to deploy the root directory you can place a . here.' required: true - TARGET_FOLDER: + target-folder: description: 'If you would like to push the contents of the deployment folder into a specific directory on the deployment branch you can specify it here.' required: false - COMMIT_MESSAGE: + commit-message: description: 'If you need to customize the commit message for an integration you can do so.' required: false - CLEAN: - description: 'If your project generates hashed files on build you can use this option to automatically delete them from the deployment branch with each deploy. This option can be toggled on by setting it to true.' + clean: + description: 'If your project generates hashed files on build you can use this option to automatically delete them from the target folder on the deployment branch with each deploy. This option is on by default and can be toggled off by setting it to false.' required: false - default: 'true' + default: true clean-exclude: - description: "If you need to use CLEAN but you would like to preserve certain files or folders you can use this option. This should contain each pattern as a single line in a multiline string." + description: "If you need to use clean but you would like to preserve certain files or folders you can use this option. This should contain each pattern as a single line in a multiline string." required: false - DRY_RUN: + dry-run: description: "Do not actually push back, but use `--dry-run` on `git push` invocations insead." required: false - GIT_CONFIG_NAME: + git-config-name: description: "Allows you to customize the name that is attached to the GitHub config which is used when pushing the deployment commits. If this is not included it will use the name in the GitHub context, followed by the name of the action." required: false - GIT_CONFIG_EMAIL: + git-config-email: description: "Allows you to customize the email that is attached to the GitHub config which is used when pushing the deployment commits. If this is not included it will use the email in the GitHub context, followed by a generic noreply GitHub email." required: false - REPOSITORY_NAME: + repository-name: description: "Allows you to speicfy a different repository path so long as you have permissions to push to it. This should be formatted like so: JamesIves/github-pages-deploy-action" required: false - WORKSPACE: + workspace: description: "This should point to where your project lives on the virtual machine. The GitHub Actions environment will set this for you. It is only neccersary to set this variable if you're using the node module." required: false - SINGLE_COMMIT: + single-commit: description: "This option can be used if you'd prefer to have a single commit on the deployment branch instead of maintaining the full history." required: false - SILENT: + silent: description: "Silences the action output preventing it from displaying git messages." required: false outputs: - DEPLOYMENT_STATUS: + deployment-status: description: 'The status of the deployment that indicates if the run failed or passed. Possible outputs include: success|failed|skipped' diff --git a/src/constants.ts b/src/constants.ts index 097612f55..2990871e6 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -76,9 +76,9 @@ export interface NodeActionInterface { export const action: ActionInterface = { folder: getInput('folder'), branch: getInput('branch'), - commitMessage: getInput('commit_message'), - dryRun: !isNullOrUndefined(getInput('dry_run')) - ? getInput('dry_run').toLowerCase() === 'true' + commitMessage: getInput('commit-message'), + dryRun: !isNullOrUndefined(getInput('dry-run')) + ? getInput('dry-run').toLowerCase() === 'true' : false, clean: !isNullOrUndefined(getInput('clean')) ? getInput('clean').toLowerCase() === 'true' @@ -87,28 +87,28 @@ export const action: ActionInterface = { .split('\n') .filter(l => l !== ''), isTest: TestFlag.NONE, - email: !isNullOrUndefined(getInput('git_config_email')) - ? getInput('git_config_email') + email: !isNullOrUndefined(getInput('git-config-email')) + ? getInput('git-config-email') : pusher && pusher.email ? pusher.email : `${ process.env.GITHUB_ACTOR || 'github-pages-deploy-action' }@users.noreply.github.com`, - name: !isNullOrUndefined(getInput('git_config_name')) - ? getInput('git_config_name') + name: !isNullOrUndefined(getInput('git-config-name')) + ? getInput('git-config-name') : pusher && pusher.name ? pusher.name : process.env.GITHUB_ACTOR ? process.env.GITHUB_ACTOR : 'GitHub Pages Deploy Action', - repositoryName: !isNullOrUndefined(getInput('repository_name')) - ? getInput('repository_name') + repositoryName: !isNullOrUndefined(getInput('repository-name')) + ? getInput('repository-name') : repository && repository.full_name ? repository.full_name : process.env.GITHUB_REPOSITORY, token: getInput('token'), - singleCommit: !isNullOrUndefined(getInput('single_commit')) - ? getInput('single_commit').toLowerCase() === 'true' + singleCommit: !isNullOrUndefined(getInput('single-commit')) + ? getInput('single-commit').toLowerCase() === 'true' : false, silent: !isNullOrUndefined(getInput('silent')) ? getInput('silent').toLowerCase() === 'true' @@ -116,7 +116,7 @@ export const action: ActionInterface = { ssh: !isNullOrUndefined(getInput('ssh')) ? getInput('ssh').toLowerCase() === 'true' : false, - targetFolder: getInput('target_folder'), + targetFolder: getInput('target-folder'), workspace: process.env.GITHUB_WORKSPACE || '' } diff --git a/src/lib.ts b/src/lib.ts index 072b24eac..9b3a3434a 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -1,4 +1,4 @@ -import {exportVariable, info, setFailed} from '@actions/core' +import {exportVariable, info, setFailed, setOutput} from '@actions/core' import {ActionInterface, Status, NodeActionInterface} from './constants' import {deploy, init} from './git' import { @@ -60,5 +60,6 @@ export default async function run( ) exportVariable('deployment_status', status) + setOutput('deployment-status', status) } } From 58cb667763d2eb5808facaf19631635d2cd18099 Mon Sep 17 00:00:00 2001 From: James Ives Date: Mon, 18 Jan 2021 09:54:40 -0500 Subject: [PATCH 15/32] Security Docs --- SECURITY.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index 3890d4eed..a0811c8f0 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -2,12 +2,12 @@ ## Supported Versions -The current versions are actively maintained and will receieve frequent updates and security patches. +The current version is actively maintained and will receive frequent updates and security patches. | Version | Supported | | ------- | ------------------ | -| 3.0.x | :white_check_mark: | -| < 2.0 | :x: | +| 4.0.x | :white_check_mark: | +| < 3.0 | :x: | ## Reporting a Vulnerability From 639ff537d5bf88b668efb3a56d361e2a03f008c9 Mon Sep 17 00:00:00 2001 From: James Ives Date: Mon, 18 Jan 2021 09:56:42 -0500 Subject: [PATCH 16/32] Integration tests --- .github/workflows/integration.yml | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index f46ad8b63..331ab91a3 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -98,15 +98,10 @@ jobs: with: persist-credentials: false - - name: Install SSH Client - uses: webfactory/ssh-agent@v0.4.1 - with: - ssh-private-key: ${{ secrets.DEPLOY_KEY }} - - name: Build and Deploy uses: JamesIves/github-pages-deploy-action@releases/v4 with: - ssh: true + ssh-key: ${{ secrets.DEPLOY_KEY }} branch: gh-pages folder: integration target-folder: cat/montezuma3 @@ -131,15 +126,10 @@ jobs: with: persist-credentials: false - - name: Install SSH Client - uses: webfactory/ssh-agent@v0.4.1 - with: - ssh-private-key: ${{ secrets.DEPLOY_KEY }} - - name: Build and Deploy uses: JamesIves/github-pages-deploy-action@releases/v4 with: - ssh: true + ssh-key: ${{ secrets.DEPLOY_KEY }} branch: gh-pages folder: integration target-folder: cat/montezuma4 From e00d6bfda7446e15323592103729e8a25d931d1a Mon Sep 17 00:00:00 2001 From: James Ives Date: Mon, 18 Jan 2021 09:56:53 -0500 Subject: [PATCH 17/32] Revert "Integration tests" This reverts commit 639ff537d5bf88b668efb3a56d361e2a03f008c9. --- .github/workflows/integration.yml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 331ab91a3..f46ad8b63 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -98,10 +98,15 @@ jobs: with: persist-credentials: false + - name: Install SSH Client + uses: webfactory/ssh-agent@v0.4.1 + with: + ssh-private-key: ${{ secrets.DEPLOY_KEY }} + - name: Build and Deploy uses: JamesIves/github-pages-deploy-action@releases/v4 with: - ssh-key: ${{ secrets.DEPLOY_KEY }} + ssh: true branch: gh-pages folder: integration target-folder: cat/montezuma3 @@ -126,10 +131,15 @@ jobs: with: persist-credentials: false + - name: Install SSH Client + uses: webfactory/ssh-agent@v0.4.1 + with: + ssh-private-key: ${{ secrets.DEPLOY_KEY }} + - name: Build and Deploy uses: JamesIves/github-pages-deploy-action@releases/v4 with: - ssh-key: ${{ secrets.DEPLOY_KEY }} + ssh: true branch: gh-pages folder: integration target-folder: cat/montezuma4 From 64eb7112e478f1fea16def2dabef32ec9119c3e8 Mon Sep 17 00:00:00 2001 From: James Ives Date: Thu, 21 Jan 2021 09:08:31 -0500 Subject: [PATCH 18/32] Native SSH Key Support (#569) * SSH Key Support :key: * Update ssh.ts * Update src/ssh.ts Co-authored-by: Axel Hecht * README fixes/etc * Unit Tests & README * ssh key * Update README.md * Update ssh.test.ts * Update ssh.test.ts * Update ssh.test.ts * Update ssh.test.ts * Update ssh.test.ts * Update ssh.test.ts * Update integration.yml Co-authored-by: Axel Hecht --- .github/workflows/integration.yml | 33 ++++++++-- README.md | 20 ++---- __tests__/main.test.ts | 3 +- __tests__/ssh.test.ts | 103 ++++++++++++++++++++++++++++++ __tests__/util.test.ts | 18 +++--- action.yml | 10 ++- src/constants.ts | 20 +++--- src/lib.ts | 9 ++- src/ssh.ts | 47 ++++++++++++++ src/util.ts | 8 +-- 10 files changed, 224 insertions(+), 47 deletions(-) create mode 100644 __tests__/ssh.test.ts create mode 100644 src/ssh.ts diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index f46ad8b63..5ced59be3 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -90,6 +90,30 @@ jobs: # Deploys using an SSH key. integration-ssh: + needs: integration-container + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + persist-credentials: false + + - name: Build and Deploy + uses: JamesIves/github-pages-deploy-action@releases/v4 + with: + ssh-key: ${{ secrets.DEPLOY_KEY }} + branch: gh-pages + folder: integration + target-folder: cat/montezuma3 + + - name: Cleanup Generated Branch + uses: dawidd6/action-delete-branch@v2.0.1 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + branches: gh-pages + + # Deploys using an SSH key. + integration-ssh-third-party-client: needs: integration-container runs-on: ubuntu-latest steps: @@ -109,7 +133,7 @@ jobs: ssh: true branch: gh-pages folder: integration - target-folder: cat/montezuma3 + target-folder: cat/montezuma4 - name: Cleanup Generated Branch uses: dawidd6/action-delete-branch@v2.0.1 @@ -131,15 +155,10 @@ jobs: with: persist-credentials: false - - name: Install SSH Client - uses: webfactory/ssh-agent@v0.4.1 - with: - ssh-private-key: ${{ secrets.DEPLOY_KEY }} - - name: Build and Deploy uses: JamesIves/github-pages-deploy-action@releases/v4 with: - ssh: true + ssh-key: ${{ secrets.DEPLOY_KEY }} branch: gh-pages folder: integration target-folder: cat/montezuma4 diff --git a/README.md b/README.md index 9de870103..9325313d7 100644 --- a/README.md +++ b/README.md @@ -132,7 +132,7 @@ By default the action does not need any token configuration and uses the provide | Key | Value Information | Type | Required | | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | -------- | | `token` | This option defaults to the repository scoped GitHub Token. However if you need more permissions for things such as deploying to another repository, you can add a Personal Access Token (PAT) here. This should be stored in the `secrets / with` menu **as a secret**. We reccomend using a service account with the least permissions neccersary and recommend when generating a new PAT that you select the least permission scopes neccersary. [Learn more about creating and using encrypted secrets here.](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets) | **No** | -| `ssh` | You can configure the action to deploy using SSH by setting this option to `true`. For more information on how to add your ssh key pair please refer to the [Using a Deploy Key section of this README](https://github.com/JamesIves/github-pages-deploy-action/tree/dev#using-an-ssh-deploy-key-). | `with` | **No** | +| `ssh-key` | You can configure the action to deploy using SSH by setting this option to a private SSH key stored **as a secret**. It can also be set to `true` to use an existing SSH client configuration. For more detailed information on how to add your ssh key pair please refer to the [Using a Deploy Key section of this README](https://github.com/JamesIves/github-pages-deploy-action/tree/dev#using-an-ssh-deploy-key-). | `with` | **No** | #### Optional Choices @@ -176,20 +176,15 @@ ssh-keygen -t rsa -m pem -b 4096 -C "youremailhere@example.com" -N "" Once you've generated the key pair you must add the contents of the public key within your repository's [deploy keys menu](https://developer.github.com/v3/guides/managing-deploy-keys/). You can find this option by going to `Settings > Deploy Keys`, you can name the public key whatever you want, but you **do** need to give it write access. Afterwards add the contents of the private key to the `Settings > Secrets` menu as `DEPLOY_KEY`. -With this configured you must add the `ssh-agent` step to your workflow and set `ssh` to `true` within the deploy action. There are several SSH actions available on the [GitHub marketplace](https://github.com/marketplace?type=actions) for you to choose from. +With this configured you can then set the `ssh-key` part of the action to your private key stored as a secret. ```yml -- name: Install SSH Client 🔑 - uses: webfactory/ssh-agent@v0.4.1 - with: - ssh-private-key: ${{ secrets.DEPLOY_KEY }} - - name: Deploy 🚀 uses: JamesIves/github-pages-deploy-action@3.7.1 with: - ssh: true branch: gh-pages folder: site + ssh-key: ${{ secrets.DEPLOY_KEY }} ```
You can view a full example of this here. @@ -215,11 +210,6 @@ jobs: npm install npm run build - - name: Install SSH Client 🔑 - uses: webfactory/ssh-agent@v0.4.1 # This step installs the ssh client into the workflow run. There's many options available for this on the action marketplace. - with: - ssh-private-key: ${{ secrets.DEPLOY_KEY }} - - name: Deploy 🚀 uses: JamesIves/github-pages-deploy-action@3.7.1 with: @@ -229,12 +219,14 @@ jobs: clean-exclude: | special-file.txt some/*.txt - ssh: true # SSH must be set to true so the deploy action knows which protocol to deploy with. + ssh-key: ${{ secrets.DEPLOY_KEY }} ```

+Alternatively if you've already configured the SSH client within a previous step you can set the `ssh-key` option to `true` to allow it to deploy using an existing SSH client. Instead of adjusting the client configuration it will simply switch to using GitHub's SSH endpoints. + --- ### Operating System Support 💿 diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts index fc5b9d3b4..3f3f499fe 100644 --- a/__tests__/main.test.ts +++ b/__tests__/main.test.ts @@ -60,6 +60,7 @@ describe('main', () => { folder: 'assets', branch: 'branch', token: '123', + sshKey: true, pusher: { name: 'asd', email: 'as@cat' @@ -77,7 +78,7 @@ describe('main', () => { folder: 'assets', branch: 'branch', token: null, - ssh: null, + sshKey: null, pusher: { name: 'asd', email: 'as@cat' diff --git a/__tests__/ssh.test.ts b/__tests__/ssh.test.ts new file mode 100644 index 000000000..b1d97a480 --- /dev/null +++ b/__tests__/ssh.test.ts @@ -0,0 +1,103 @@ +import {mkdirP} from '@actions/io' +import {appendFileSync} from 'fs' +import {action, TestFlag} from '../src/constants' +import {execute} from '../src/execute' +import {configureSSH} from '../src/ssh' + +const originalAction = JSON.stringify(action) + +jest.mock('fs', () => ({ + appendFileSync: jest.fn(), + existsSync: jest.fn() +})) + +jest.mock('@actions/io', () => ({ + rmRF: jest.fn(), + mkdirP: jest.fn() +})) + +jest.mock('@actions/core', () => ({ + setFailed: jest.fn(), + getInput: jest.fn(), + setOutput: jest.fn(), + isDebug: jest.fn(), + info: jest.fn() +})) + +jest.mock('../src/execute', () => ({ + // eslint-disable-next-line @typescript-eslint/naming-convention + __esModule: true, + execute: jest.fn() +})) + +describe('configureSSH', () => { + afterEach(() => { + Object.assign(action, JSON.parse(originalAction)) + }) + + it('should skip client configuration if sshKey is set to true', async () => { + Object.assign(action, { + silent: false, + folder: 'assets', + branch: 'branch', + sshKey: true, + pusher: { + name: 'asd', + email: 'as@cat' + }, + isTest: TestFlag.HAS_CHANGED_FILES + }) + + await configureSSH(action) + + expect(execute).toBeCalledTimes(0) + expect(mkdirP).toBeCalledTimes(0) + expect(appendFileSync).toBeCalledTimes(0) + }) + + it('should configure the ssh client if a key is defined', async () => { + Object.assign(action, { + silent: false, + folder: 'assets', + branch: 'branch', + sshKey: '?=-----BEGIN 123 456\n 789', + pusher: { + name: 'asd', + email: 'as@cat' + }, + isTest: TestFlag.HAS_CHANGED_FILES + }) + + await configureSSH(action) + + expect(execute).toBeCalledTimes(4) + expect(mkdirP).toBeCalledTimes(1) + expect(appendFileSync).toBeCalledTimes(2) + }) + + it('should throw if something errors', async () => { + ;(execute as jest.Mock).mockImplementationOnce(() => { + throw new Error('Mocked throw') + }) + + Object.assign(action, { + silent: false, + folder: 'assets', + branch: 'branch', + sshKey: 'real_key', + pusher: { + name: 'asd', + email: 'as@cat' + }, + isTest: TestFlag.HAS_CHANGED_FILES + }) + + try { + await configureSSH(action) + } catch (error) { + expect(error.message).toBe( + 'The ssh client configuration encountered an error: Mocked throw ❌' + ) + } + }) +}) diff --git a/__tests__/util.test.ts b/__tests__/util.test.ts index 7fa92024d..c06798494 100644 --- a/__tests__/util.test.ts +++ b/__tests__/util.test.ts @@ -38,7 +38,7 @@ describe('util', () => { workspace: 'src/', folder: 'build', token: null, - ssh: true, + sshKey: 'real_token', silent: false, isTest: TestFlag.NONE } @@ -51,7 +51,7 @@ describe('util', () => { workspace: 'src/', folder: 'build', token: '123', - ssh: null, + sshKey: null, silent: false, isTest: TestFlag.NONE } @@ -64,7 +64,7 @@ describe('util', () => { workspace: 'src/', folder: 'build', token: null, - ssh: null, + sshKey: null, silent: false, isTest: TestFlag.NONE } @@ -80,7 +80,7 @@ describe('util', () => { workspace: 'src/', folder: 'build', token: null, - ssh: true, + sshKey: 'real_token', silent: false, isTest: TestFlag.NONE } @@ -96,7 +96,7 @@ describe('util', () => { workspace: 'src/', folder: 'build', token: '123', - ssh: null, + sshKey: null, silent: false, isTest: TestFlag.NONE } @@ -155,7 +155,7 @@ describe('util', () => { workspace: 'src/', folder: 'build', token: null, - ssh: null, + sshKey: null, silent: false, isTest: TestFlag.NONE } @@ -168,7 +168,7 @@ describe('util', () => { workspace: 'src/', folder: '/home/user/repo/build', token: null, - ssh: null, + sshKey: null, silent: false, isTest: TestFlag.NONE } @@ -181,7 +181,7 @@ describe('util', () => { workspace: 'src/', folder: './build', token: null, - ssh: null, + sshKey: null, silent: false, isTest: TestFlag.NONE } @@ -194,7 +194,7 @@ describe('util', () => { workspace: 'src/', folder: '~/repo/build', token: null, - ssh: null, + sshKey: null, silent: false, isTest: TestFlag.NONE } diff --git a/action.yml b/action.yml index 00e1398e9..8c1786c35 100644 --- a/action.yml +++ b/action.yml @@ -8,8 +8,14 @@ branding: icon: 'git-commit' color: 'orange' inputs: - ssh: - description: 'You can configure the action to deploy using SSH by setting this option to true. More more information on how to add your ssh key pair please refer to the Using a Deploy Key section of this README.' + ssh-key: + description: > + This option allows you to define a private SSH key to be used in conjunction with a repository deployment key to deploy using SSH. + The private key should be stored in the `secrets / with` menu **as a secret**. The public should be stored in the repositories deployment + keys menu and be given write access. + + Alternatively you can set this field to `true` to enable SSH endpoints for deployment without configuring the ssh client. This can be useful if you've + already setup the SSH client using another package or action in a previous step. required: false token: diff --git a/src/constants.ts b/src/constants.ts index 2990871e6..6f3a66ef8 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -41,8 +41,8 @@ export interface ActionInterface { singleCommit?: boolean | null /** Determines if the action should run in silent mode or not. */ silent: boolean - /** Set to true if you're using an ssh client in your build step. */ - ssh?: boolean | null + /** Defines an SSH private key that can be used during deployment. This can also be set to true to use SSH deployment endpoints if you've already configured the SSH client outside of this package. */ + sshKey?: string | boolean | null /** If you'd like to push the contents of the deployment folder into a specific directory on the deployment branch you can specify it here. */ targetFolder?: string /** Deployment token. */ @@ -65,10 +65,11 @@ export interface NodeActionInterface { token?: string | null /** Determines if the action should run in silent mode or not. */ silent: boolean - /** Set to true if you're using an ssh client in your build step. */ - ssh?: boolean | null + /** Defines an SSH private key that can be used during deployment. This can also be set to true to use SSH deployment endpoints if you've already configured the SSH client outside of this package. */ + sshKey?: string | boolean | null /** The folder where your deployment project lives. */ workspace: string + /** Determines test scenarios the action is running in. */ isTest: TestFlag } @@ -113,9 +114,12 @@ export const action: ActionInterface = { silent: !isNullOrUndefined(getInput('silent')) ? getInput('silent').toLowerCase() === 'true' : false, - ssh: !isNullOrUndefined(getInput('ssh')) - ? getInput('ssh').toLowerCase() === 'true' - : false, + sshKey: isNullOrUndefined(getInput('ssh-key')) + ? false + : !isNullOrUndefined(getInput('ssh-key')) && + getInput('ssh-key').toLowerCase() === 'true' + ? true + : getInput('ssh-key'), targetFolder: getInput('target-folder'), workspace: process.env.GITHUB_WORKSPACE || '' } @@ -123,7 +127,7 @@ export const action: ActionInterface = { /** Types for the required action parameters. */ export type RequiredActionParameters = Pick< ActionInterface, - 'token' | 'ssh' | 'branch' | 'folder' | 'isTest' + 'token' | 'sshKey' | 'branch' | 'folder' | 'isTest' > /** Status codes for the action. */ diff --git a/src/lib.ts b/src/lib.ts index 9b3a3434a..94738cf8b 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -1,9 +1,10 @@ import {exportVariable, info, setFailed, setOutput} from '@actions/core' -import {ActionInterface, Status, NodeActionInterface} from './constants' +import {ActionInterface, NodeActionInterface, Status} from './constants' import {deploy, init} from './git' +import {configureSSH} from './ssh' import { - generateFolderPath, checkParameters, + generateFolderPath, generateRepositoryPath, generateTokenType } from './util' @@ -43,6 +44,10 @@ export default async function run( settings.repositoryPath = generateRepositoryPath(settings) settings.tokenType = generateTokenType(settings) + if (settings.sshKey) { + await configureSSH(settings) + } + await init(settings) status = await deploy(settings) } catch (error) { diff --git a/src/ssh.ts b/src/ssh.ts new file mode 100644 index 000000000..ebe6780a0 --- /dev/null +++ b/src/ssh.ts @@ -0,0 +1,47 @@ +import {info} from '@actions/core' +import {mkdirP} from '@actions/io' +import {appendFileSync} from 'fs' +import {ActionInterface} from './constants' +import {execute} from './execute' +import {suppressSensitiveInformation} from './util' + +export async function configureSSH(action: ActionInterface): Promise { + try { + if (typeof action.sshKey === 'string') { + const sshDirectory = `${process.env['HOME']}/.ssh` + const sshKnownHostsDirectory = `${sshDirectory}/known_hosts` + + // SSH fingerprints provided by GitHub: https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/githubs-ssh-key-fingerprints + const sshGitHubKnownHostRsa = + '\ngithub.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==\n' + const sshGitHubKnownHostDss = + '\ngithub.com ssh-dss AAAAB3NzaC1kc3MAAACBANGFW2P9xlGU3zWrymJgI/lKo//ZW2WfVtmbsUZJ5uyKArtlQOT2+WRhcg4979aFxgKdcsqAYW3/LS1T2km3jYW/vr4Uzn+dXWODVk5VlUiZ1HFOHf6s6ITcZvjvdbp6ZbpM+DuJT7Bw+h5Fx8Qt8I16oCZYmAPJRtu46o9C2zk1AAAAFQC4gdFGcSbp5Gr0Wd5Ay/jtcldMewAAAIATTgn4sY4Nem/FQE+XJlyUQptPWMem5fwOcWtSXiTKaaN0lkk2p2snz+EJvAGXGq9dTSWHyLJSM2W6ZdQDqWJ1k+cL8CARAqL+UMwF84CR0m3hj+wtVGD/J4G5kW2DBAf4/bqzP4469lT+dF2FRQ2L9JKXrCWcnhMtJUvua8dvnwAAAIB6C4nQfAA7x8oLta6tT+oCk2WQcydNsyugE8vLrHlogoWEicla6cWPk7oXSspbzUcfkjN3Qa6e74PhRkc7JdSdAlFzU3m7LMkXo1MHgkqNX8glxWNVqBSc0YRdbFdTkL0C6gtpklilhvuHQCdbgB3LBAikcRkDp+FCVkUgPC/7Rw==\n' + + info(`Configuring SSH client… 🔑`) + + await mkdirP(sshDirectory) + + appendFileSync(sshKnownHostsDirectory, sshGitHubKnownHostRsa) + appendFileSync(sshKnownHostsDirectory, sshGitHubKnownHostDss) + + // Initializes SSH agent. + await execute(`ssh-agent`, sshDirectory, action.silent) + + // Adds the SSH key to the agent. + action.sshKey.split(/(?=-----BEGIN)/).map(async line => { + await execute(`ssh-add - ${line.trim()}\n`, sshDirectory, action.silent) + }) + + await execute(`ssh-add -l`, sshDirectory, action.silent) + } else { + info(`Skipping SSH client configuration… ⌚`) + } + } catch (error) { + throw new Error( + `The ssh client configuration encountered an error: ${suppressSensitiveInformation( + error.message, + action + )} ❌` + ) + } +} diff --git a/src/util.ts b/src/util.ts index d43a1e09b..8db99d65a 100644 --- a/src/util.ts +++ b/src/util.ts @@ -1,6 +1,6 @@ +import {isDebug} from '@actions/core' import {existsSync} from 'fs' import path from 'path' -import {isDebug} from '@actions/core' import {ActionInterface, RequiredActionParameters} from './constants' /* Replaces all instances of a match in a string. */ @@ -13,11 +13,11 @@ export const isNullOrUndefined = (value: any): boolean => /* Generates a token type used for the action. */ export const generateTokenType = (action: ActionInterface): string => - action.ssh ? 'SSH Deploy Key' : action.token ? 'Deploy Token' : '…' + action.sshKey ? 'SSH Deploy Key' : action.token ? 'Deploy Token' : '…' /* Generates a the repository path used to make the commits. */ export const generateRepositoryPath = (action: ActionInterface): string => - action.ssh + action.sshKey ? `git@github.com:${action.repositoryName}` : `https://${`x-access-token:${action.token}`}@github.com/${ action.repositoryName @@ -46,7 +46,7 @@ const hasRequiredParameters = ( /* Verifies the action has the required parameters to run, otherwise throw an error. */ export const checkParameters = (action: ActionInterface): void => { - if (!hasRequiredParameters(action, ['token', 'ssh'])) { + if (!hasRequiredParameters(action, ['token', 'sshKey'])) { throw new Error( 'No deployment token/method was provided. You must provide the action with either a Personal Access Token or the GitHub Token secret in order to deploy. If you wish to use an ssh deploy token then you must set SSH to true.' ) From a099e5db8b1ed2751daff5653efcfcc377d918d1 Mon Sep 17 00:00:00 2001 From: James Ives Date: Wed, 3 Feb 2021 21:26:28 -0500 Subject: [PATCH 19/32] Deployment Issues (#583) * Update git.ts * Tests * Update git.ts * Formatting * Update src/git.ts Co-authored-by: Axel Hecht * TestFlag * Logging * Update git.ts Co-authored-by: Axel Hecht --- __tests__/git.test.ts | 37 +++++++++++++++++++++++++++++++++++++ __tests__/main.test.ts | 4 ++-- src/constants.ts | 3 ++- src/git.ts | 23 +++++++++++++++++++++-- 4 files changed, 62 insertions(+), 5 deletions(-) diff --git a/__tests__/git.test.ts b/__tests__/git.test.ts index b6d38e761..4b882304c 100644 --- a/__tests__/git.test.ts +++ b/__tests__/git.test.ts @@ -40,6 +40,24 @@ describe('git', () => { }) describe('init', () => { + it('should execute commands', async () => { + Object.assign(action, { + silent: false, + repositoryPath: 'JamesIves/github-pages-deploy-action', + token: '123', + branch: 'branch', + folder: '.', + pusher: { + name: 'asd', + email: 'as@cat' + }, + isTest: TestFlag.HAS_CHANGED_FILES + }) + + await init(action) + expect(execute).toBeCalledTimes(4) + }) + it('should catch when a function throws an error', async () => { ;(execute as jest.Mock).mockImplementationOnce(() => { throw new Error('Mocked throw') @@ -66,6 +84,24 @@ describe('git', () => { ) } }) + + it('should correctly continue when it cannot remove origin', async () => { + Object.assign(action, { + silent: false, + repositoryPath: 'JamesIves/github-pages-deploy-action', + token: '123', + branch: 'branch', + folder: '.', + pusher: { + name: 'asd', + email: 'as@cat' + }, + isTest: TestFlag.UNABLE_TO_REMOVE_ORIGIN + }) + + await init(action) + expect(execute).toBeCalledTimes(4) + }) }) describe('deploy', () => { @@ -75,6 +111,7 @@ describe('git', () => { folder: 'assets', branch: 'branch', token: '123', + repositoryName: 'JamesIves/montezuma', pusher: { name: 'asd', email: 'as@cat' diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts index 3f3f499fe..87c3a98d0 100644 --- a/__tests__/main.test.ts +++ b/__tests__/main.test.ts @@ -49,7 +49,7 @@ describe('main', () => { debug: true }) await run(action) - expect(execute).toBeCalledTimes(10) + expect(execute).toBeCalledTimes(12) expect(rmRF).toBeCalledTimes(1) expect(exportVariable).toBeCalledTimes(1) }) @@ -68,7 +68,7 @@ describe('main', () => { isTest: TestFlag.HAS_CHANGED_FILES }) await run(action) - expect(execute).toBeCalledTimes(13) + expect(execute).toBeCalledTimes(15) expect(rmRF).toBeCalledTimes(1) expect(exportVariable).toBeCalledTimes(1) }) diff --git a/src/constants.ts b/src/constants.ts index 6f3a66ef8..648eae36a 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -8,7 +8,8 @@ const {pusher, repository} = github.context.payload export enum TestFlag { NONE = 0, HAS_CHANGED_FILES = 1 << 1, // Assume changes to commit - HAS_REMOTE_BRANCH = 1 << 2 // Assume remote repository has existing commits + HAS_REMOTE_BRANCH = 1 << 2, // Assume remote repository has existing commits + UNABLE_TO_REMOVE_ORIGIN = 1 << 3 // Assume we can't remove origin } /* For more information please refer to the README: https://github.com/JamesIves/github-pages-deploy-action */ diff --git a/src/git.ts b/src/git.ts index ea432fbf4..272b9b1e1 100644 --- a/src/git.ts +++ b/src/git.ts @@ -23,6 +23,22 @@ export async function init(action: ActionInterface): Promise { action.silent ) + try { + await execute(`git remote rm origin`, action.workspace, action.silent) + + if (action.isTest === TestFlag.UNABLE_TO_REMOVE_ORIGIN) { + throw new Error() + } + } catch { + info('Attempted to remove origin but failed, continuing…') + } + + await execute( + `git remote add origin ${action.repositoryPath}`, + action.workspace, + action.silent + ) + info('Git configured… 🔧') } catch (error) { throw new Error( @@ -48,7 +64,9 @@ export async function deploy(action: ActionInterface): Promise { const commitMessage = !isNullOrUndefined(action.commitMessage) ? (action.commitMessage as string) : `Deploying to ${action.branch}${ - process.env.GITHUB_SHA ? ` from @ ${process.env.GITHUB_SHA}` : '' + process.env.GITHUB_SHA + ? ` from @ ${process.env.GITHUB_REPOSITORY}@${process.env.GITHUB_SHA}` + : '' } 🚀` // Checks to see if the remote exists prior to deploying. @@ -113,12 +131,13 @@ export async function deploy(action: ActionInterface): Promise { branchExists && action.singleCommit ? `git diff origin/${action.branch}` : `git status --porcelain` + info(`Checking if there are files to commit…`) const hasFilesToCommit = action.isTest & TestFlag.HAS_CHANGED_FILES || (await execute( checkGitStatus, `${action.workspace}/${temporaryDeploymentDirectory}`, - action.silent + true // This output is always silenced due to the large output it creates. )) if (!hasFilesToCommit) { From eace78eb8288477dd52e8923bed96b9004019ae0 Mon Sep 17 00:00:00 2001 From: James Ives Date: Wed, 3 Feb 2021 21:27:35 -0500 Subject: [PATCH 20/32] Codespace Support (#584) --- .devcontainer/Dockerfile | 2 ++ .devcontainer/base.Dockerfile | 7 +++++++ .devcontainer/devcontainer.json | 18 ++++++++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/base.Dockerfile create mode 100644 .devcontainer/devcontainer.json diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 000000000..9cb1cdc9f --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,2 @@ +ARG VARIANT=12 +FROM mcr.microsoft.com/vscode/devcontainers/typescript-node:${VARIANT} \ No newline at end of file diff --git a/.devcontainer/base.Dockerfile b/.devcontainer/base.Dockerfile new file mode 100644 index 000000000..16313f77e --- /dev/null +++ b/.devcontainer/base.Dockerfile @@ -0,0 +1,7 @@ +ARG VARIANT=12-buster +FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:dev-${VARIANT} + +# Install tslint, typescript. eslint is installed by javascript image +ARG NODE_MODULES="tslint-to-eslint-config typescript" +RUN su node -c "umask 0002 && npm install -g ${NODE_MODULES}" \ + && npm cache clean --force > /dev/null 2>&1 \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 000000000..b72d84679 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,18 @@ +// https://github.com/microsoft/vscode-dev-containers/tree/master/containers/typescript-node +{ + "name": "Node.js & TypeScript", + "build": { + "dockerfile": "Dockerfile", + // Update 'VARIANT' to pick a Node version: 10, 12, 14 + "args": { + "VARIANT": "14" + } + }, + "settings": { + "terminal.integrated.shell.linux": "/bin/bash" + }, + "extensions": [ + "dbaeumer.vscode-eslint" + ], + "remoteUser": "node" +} \ No newline at end of file From 9b18761c06a24a109330ca37f6f89a9081c441a4 Mon Sep 17 00:00:00 2001 From: James Ives Date: Wed, 3 Feb 2021 22:21:36 -0500 Subject: [PATCH 21/32] Add files via upload --- .github/screenshot.png | Bin 0 -> 10800 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/screenshot.png diff --git a/.github/screenshot.png b/.github/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..086a0a43bcc1fd07d1bb7f1921fd97e88873882f GIT binary patch literal 10800 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 Ku2jbC#eV?`^fQwH literal 0 HcmV?d00001 From d0c0cc0d21c4cc6a626c2ad575b4e02a656014a9 Mon Sep 17 00:00:00 2001 From: James Ives Date: Wed, 3 Feb 2021 22:22:10 -0500 Subject: [PATCH 22/32] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9325313d7..7c20ff2d1 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@

- +

## Getting Started :airplane: From 156d91fbff900d4326443628b4b58d936438c770 Mon Sep 17 00:00:00 2001 From: James Ives Date: Wed, 3 Feb 2021 22:36:41 -0500 Subject: [PATCH 23/32] Add files via upload --- .github/logo.png | Bin 0 -> 64156 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/logo.png diff --git a/.github/logo.png b/.github/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f1b729fd1fdb1b8d2a930a04f0e2d4eec14fd2d2 GIT binary patch literal 64156 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

p|Is6IcDSEl0!-7(J&$17LeT^;%$0 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¬Jge)8>-T4`lhiV&rm6TNMRcE zQ%7N0j^P_kr;kOLaYw2G>O+D0j%=w=csow%IBGX25lMLUk4=4^f6eXHP2Z{yk2-HecqaAf$yRo2paD2fBpW}kj z$HB?QnkG{%z$P)O^`m-UWNKY*tMxQ9@Oh`9eyocF`2T={CAo&zavodxfB0${?1mo+rv`=xjM(E zPehMwPXd`>H^D^YW=A0=$nEK)01)-S#7IrO?f+IEkrT330-5f2QdF3}*WWELq&1g5 z;FybiM?{;{o-;YUb}cFC&BR%EPvhIHs4yp-HUl_ZDu-AzcdBFTLMqyjZnsnt357W2 zZaabvbe)^r?iMZ^@lQ~;9pmOJtp7dV5>+(^fPBLN;zV#Tt#Gv2NRnH^KIu;p@^{Nf z=ZU!p(oF>eh^fs`@F{S$h4Rf|@3aowVHrvI^-s9z z-(@2q?>xz1^*AE=b9$n+w0BB)svjx0T8cA`@<<;_(plY!{oiG0A@(JZ`z6tW25uK} z8@>`*{vtrz1V=rHW%8RBwgAGJYD&KBWf5e8MnS+ Date: Wed, 3 Feb 2021 22:37:09 -0500 Subject: [PATCH 24/32] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7c20ff2d1..107a74a0e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

- +

From bc821012e1bb709c3651c33d22b5539eefdbb344 Mon Sep 17 00:00:00 2001 From: James Ives Date: Wed, 3 Feb 2021 22:37:49 -0500 Subject: [PATCH 25/32] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 107a74a0e..78790f156 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

- +

From 7644ba3bc6699912fe34e85b75cb8ef8d1e337dd Mon Sep 17 00:00:00 2001 From: James Ives Date: Wed, 3 Feb 2021 23:07:37 -0500 Subject: [PATCH 26/32] Update README.md --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 78790f156..82ce541da 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

- +

@@ -10,23 +10,23 @@

- + Unit test status badge - + Integration test status badge - + Code coverage status badge - + Release version badge - + >
   </a>
 </p>
 
@@ -131,7 +131,7 @@ By default the action does not need any token configuration and uses the provide
 
 | Key            | Value Information                                                                                                                                                                                                                                                                                                                                                                                                                                              | Type             | Required |
 | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | -------- |
-| `token` | This option defaults to the repository scoped GitHub Token. However if you need more permissions for things such as deploying to another repository, you can add a Personal Access Token (PAT) here. This should be stored in the `secrets / with` menu **as a secret**. We reccomend using a service account with the least permissions neccersary and recommend when generating a new PAT that you select the least permission scopes neccersary. [Learn more about creating and using encrypted secrets here.](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets)  | **No**  |
+| `token` | This option defaults to the repository scoped GitHub Token. However if you need more permissions for things such as deploying to another repository, you can add a Personal Access Token (PAT) here. This should be stored in the `secrets / with` menu **as a secret**. We reccomend using a service account with the least permissions neccersary and recommend when generating a new PAT that you select the least permission scopes neccersary. [Learn more about creating and using encrypted secrets here.](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets)  | `with` | **No**  |
 | `ssh-key`          | You can configure the action to deploy using SSH by setting this option to a private SSH key stored **as a secret**. It can also be set to `true` to use an existing SSH client configuration. For more detailed information on how to add your ssh key pair please refer to the [Using a Deploy Key section of this README](https://github.com/JamesIves/github-pages-deploy-action/tree/dev#using-an-ssh-deploy-key-).                                                                                                                                                            | `with`           | **No**  |
 
 #### Optional Choices

From 86419a863890e6bb4512910f6fcb549cbbc42ef2 Mon Sep 17 00:00:00 2001
From: James Ives <iam@jamesiv.es>
Date: Wed, 3 Feb 2021 23:07:53 -0500
Subject: [PATCH 27/32] Update README.md

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 82ce541da..7f9d1df68 100644
--- a/README.md
+++ b/README.md
@@ -26,7 +26,7 @@
   </a>
   
   <a href= - >
+    <img src=

From 00910a99dbd80474d66697206aae9d33f1e9d1d8 Mon Sep 17 00:00:00 2001 From: James Ives Date: Wed, 3 Feb 2021 23:21:53 -0500 Subject: [PATCH 28/32] Update README.md --- README.md | 59 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 7f9d1df68..9ed6db96e 100644 --- a/README.md +++ b/README.md @@ -52,9 +52,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout 🛎️ - uses: actions/checkout@v2.3.1 # If you're using actions/checkout@v2 you must set persist-credentials to false in most cases for the deployment to work correctly. - with: - persist-credentials: false + uses: actions/checkout@v2.3.1 - name: Install and Build 🔧 # This example project is built using npm and outputs the result to the 'build' folder. Replace with the commands required to build your project, or remove this step entirely if your site is pre-built. run: | @@ -62,7 +60,7 @@ jobs: npm run build - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@3.7.1 + uses: JamesIves/github-pages-deploy-action@4.0.0 with: branch: gh-pages # The branch the action should deploy to. folder: build # The folder the action should deploy. @@ -180,7 +178,7 @@ With this configured you can then set the `ssh-key` part of the action to your p ```yml - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@3.7.1 + uses: JamesIves/github-pages-deploy-action@4.0.0 with: branch: gh-pages folder: site @@ -202,8 +200,6 @@ jobs: steps: - name: Checkout 🛎️ uses: actions/checkout@v2 - with: - persist-credentials: false - name: Install and Build 🔧 # This example project is built using npm and outputs the result to the 'build' folder. Replace with the commands required to build your project, or remove this step entirely if your site is pre-built. run: | @@ -211,7 +207,7 @@ jobs: npm run build - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@3.7.1 + uses: JamesIves/github-pages-deploy-action@4.0.0 with: branch: gh-pages folder: build @@ -253,8 +249,6 @@ jobs: steps: - name: Checkout 🛎️ uses: actions/checkout@v2 - with: - persist-credentials: false - name: Install and Build 🔧 # This example project is built using npm and outputs the result to the 'build' folder. Replace with the commands required to build your project, or remove this step entirely if your site is pre-built. run: | @@ -273,8 +267,6 @@ jobs: steps: - name: Checkout 🛎️ uses: actions/checkout@v2 - with: - persist-credentials: false - name: Download Artifacts 🔻 # The built project is downloaded into the 'site' folder. uses: actions/download-artifact@v1 @@ -282,7 +274,7 @@ jobs: name: site - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@3.7.1 + uses: JamesIves/github-pages-deploy-action@4.0.0 with: token: ${{ secrets.ACCESS_TOKEN }} branch: gh-pages @@ -304,22 +296,51 @@ If you use a [container](https://help.github.com/en/actions/automating-your-work apt-get update && apt-get install -y rsync - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@3.7.1 + uses: JamesIves/github-pages-deploy-action@4.0.0 ``` --- ### Additional Build Files 📁 -If you're using a custom domain and require a `CNAME` file, or if you require the use of a `.nojekyll` file, you can safely commit these files directly into deployment branch without them being overridden after each deployment. Additionally you can include these files in your deployment folder to update them. +If you're using a custom domain and require a `CNAME` file, or if you require the use of a `.nojekyll` file, you can safely commit these files directly into deployment branch without them being overridden after each deployment, additionally you can include these files in your deployment folder to update them. If you need to add additional files to the deployment that should be ignored by the build clean-up steps you can utilize the `clean-exclude` option. -If you wish to remove these files you must go into the deployment branch directly to remove them. This is to prevent accidental changes in your deployment script from creating breaking changes. ---- +
Click here to view an exmaple of this. +

-### Debugging 🐝 +```yml +name: Build and Deploy +on: + push: + branches: + - master +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout 🛎️ + uses: actions/checkout@v2 -If you'd like to enable action debugging you can set the `ACTIONS_STEP_DEBUG` environment variable to true within the [Settings/Secrets](https://help.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets#creating-encrypted-secrets) menu. If you're using this action in your own project as a node module via yarn or npm **you may expose your secrets if you toggle this on in a production environment**. You can learn more about debugging GitHub actions [here](https://github.com/actions/toolkit/blob/master/docs/action-debugging.md). + - name: Install and Build 🔧 # This example project is built using npm and outputs the result to the 'build' folder. Replace with the commands required to build your project, or remove this step entirely if your site is pre-built. + run: | + npm install + npm run build + + - name: Deploy 🚀 + uses: JamesIves/github-pages-deploy-action@4.0.0 + with: + branch: gh-pages + folder: build + clean: true + clean-exclude: | + special-file.txt + some/*.txt +``` +

+
+ +If you wish to remove these files you must go into the deployment branch directly to remove them. This is to prevent accidental changes in your deployment script from creating breaking changes. --- From 2963e5ecf17f4eed3cc2363c835a39a7a2c8d18d Mon Sep 17 00:00:00 2001 From: James Ives Date: Thu, 4 Feb 2021 12:50:35 -0500 Subject: [PATCH 29/32] SSH Issues (#588) --- __tests__/ssh.test.ts | 48 ++++++++++++++++++++++++++++++++++++------- src/ssh.ts | 20 +++++++++++++----- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/__tests__/ssh.test.ts b/__tests__/ssh.test.ts index b1d97a480..17cc90f45 100644 --- a/__tests__/ssh.test.ts +++ b/__tests__/ssh.test.ts @@ -1,4 +1,6 @@ +import {exportVariable} from '@actions/core' import {mkdirP} from '@actions/io' +import child_process, {execFileSync, execSync} from 'child_process' import {appendFileSync} from 'fs' import {action, TestFlag} from '../src/constants' import {execute} from '../src/execute' @@ -11,6 +13,11 @@ jest.mock('fs', () => ({ existsSync: jest.fn() })) +jest.mock('child_process', () => ({ + execFileSync: jest.fn(), + execSync: jest.fn() +})) + jest.mock('@actions/io', () => ({ rmRF: jest.fn(), mkdirP: jest.fn() @@ -21,12 +28,11 @@ jest.mock('@actions/core', () => ({ getInput: jest.fn(), setOutput: jest.fn(), isDebug: jest.fn(), - info: jest.fn() + info: jest.fn(), + exportVariable: jest.fn() })) jest.mock('../src/execute', () => ({ - // eslint-disable-next-line @typescript-eslint/naming-convention - __esModule: true, execute: jest.fn() })) @@ -56,6 +62,34 @@ describe('configureSSH', () => { }) it('should configure the ssh client if a key is defined', async () => { + ;(child_process.execFileSync as jest.Mock).mockImplementationOnce(() => { + return 'SSH_AUTH_SOCK=/some/random/folder/agent.123; export SSH_AUTH_SOCK;\nSSH_AGENT_PID=123; export SSH_AGENT_PID;' + }) + + Object.assign(action, { + silent: false, + folder: 'assets', + branch: 'branch', + sshKey: '?=-----BEGIN 123 456\n 789', + pusher: { + name: 'asd', + email: 'as@cat' + }, + isTest: TestFlag.HAS_CHANGED_FILES + }) + + await configureSSH(action) + + expect(execFileSync).toBeCalledTimes(1) + expect(exportVariable).toBeCalledTimes(2) + expect(execSync).toBeCalledTimes(3) + }) + + it('should not export variables if the return from ssh-agent is skewed', async () => { + ;(child_process.execFileSync as jest.Mock).mockImplementationOnce(() => { + return 'useless nonsense here;' + }) + Object.assign(action, { silent: false, folder: 'assets', @@ -70,13 +104,13 @@ describe('configureSSH', () => { await configureSSH(action) - expect(execute).toBeCalledTimes(4) - expect(mkdirP).toBeCalledTimes(1) - expect(appendFileSync).toBeCalledTimes(2) + expect(execFileSync).toBeCalledTimes(1) + expect(exportVariable).toBeCalledTimes(0) + expect(execSync).toBeCalledTimes(3) }) it('should throw if something errors', async () => { - ;(execute as jest.Mock).mockImplementationOnce(() => { + ;(child_process.execFileSync as jest.Mock).mockImplementationOnce(() => { throw new Error('Mocked throw') }) diff --git a/src/ssh.ts b/src/ssh.ts index ebe6780a0..1a05e4d75 100644 --- a/src/ssh.ts +++ b/src/ssh.ts @@ -1,8 +1,8 @@ -import {info} from '@actions/core' +import {exportVariable, info} from '@actions/core' import {mkdirP} from '@actions/io' +import {execFileSync, execSync} from 'child_process' import {appendFileSync} from 'fs' import {ActionInterface} from './constants' -import {execute} from './execute' import {suppressSensitiveInformation} from './util' export async function configureSSH(action: ActionInterface): Promise { @@ -25,14 +25,24 @@ export async function configureSSH(action: ActionInterface): Promise { appendFileSync(sshKnownHostsDirectory, sshGitHubKnownHostDss) // Initializes SSH agent. - await execute(`ssh-agent`, sshDirectory, action.silent) + const agentOutput = execFileSync('ssh-agent').toString().split('\n') + + agentOutput.map(line => { + const exportableVariables = /^(SSH_AUTH_SOCK|SSH_AGENT_PID)=(.*); export \1/.exec( + line + ) + + if (exportableVariables && exportableVariables.length) { + exportVariable(exportableVariables[1], exportableVariables[2]) + } + }) // Adds the SSH key to the agent. action.sshKey.split(/(?=-----BEGIN)/).map(async line => { - await execute(`ssh-add - ${line.trim()}\n`, sshDirectory, action.silent) + execSync('ssh-add -', {input: `${line.trim()}\n`}) }) - await execute(`ssh-add -l`, sshDirectory, action.silent) + execSync('ssh-add -l') } else { info(`Skipping SSH client configuration… ⌚`) } From 7fe0750a4564c8df529aee0a75b8da9901dd1eb8 Mon Sep 17 00:00:00 2001 From: James Ives Date: Fri, 5 Feb 2021 10:00:51 -0500 Subject: [PATCH 30/32] Unsets Persisted Credentials (#587) * Persist * Config Setup/Tests * Assets * Update git.ts * Spacing * Update integration.yml --- .github/ISSUE_TEMPLATE/BUG_REPORT.md | 14 ++++++--- .github/PULL_REQUEST_TEMPLATE.md | 16 ++++++---- .github/logo.png | Bin 64156 -> 0 bytes .github/screenshot.png | Bin 10800 -> 0 bytes .github/workflows/integration.yml | 17 ++++++++++ README.md | 4 +-- __tests__/git.test.ts | 45 +++++++++++++++++++++++++-- __tests__/main.test.ts | 4 +-- assets/icon.png | Bin 109109 -> 64156 bytes assets/screenshot.png | Bin 45944 -> 10800 bytes src/constants.ts | 7 +++-- src/git.ts | 22 ++++++++++++- 12 files changed, 109 insertions(+), 20 deletions(-) delete mode 100644 .github/logo.png delete mode 100644 .github/screenshot.png diff --git a/.github/ISSUE_TEMPLATE/BUG_REPORT.md b/.github/ISSUE_TEMPLATE/BUG_REPORT.md index b6eac4021..aaf9f1ac0 100644 --- a/.github/ISSUE_TEMPLATE/BUG_REPORT.md +++ b/.github/ISSUE_TEMPLATE/BUG_REPORT.md @@ -8,14 +8,20 @@ labels: -**Describe the bug** +### Describe the bug -**Reproduce** +--- + +### Reproduction Steps -**Logs** +--- + +### Logs -**Additional Comments** +--- + +### Additional Comments diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 94d2cd7cb..1d19c4678 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,8 +1,12 @@ -**Description** -> Provide a description of what your changes do. +### Description + -**Testing Instructions** -> Give us step by step instructions on how to test your changes. +--- -**Additional Notes** -> Anything else that will help us test the pull request. \ No newline at end of file +### Testing Instructions + + +--- + +### Additional Notes + \ No newline at end of file diff --git a/.github/logo.png b/.github/logo.png deleted file mode 100644 index f1b729fd1fdb1b8d2a930a04f0e2d4eec14fd2d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64156 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

p|Is6IcDSEl0!-7(J&$17LeT^;%$0 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¬Jge)8>-T4`lhiV&rm6TNMRcE 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 Ku2jbC#eV?`^fQwH diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 5ced59be3..c505bc7eb 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -112,6 +112,23 @@ jobs: github_token: ${{ secrets.GITHUB_TOKEN }} branches: gh-pages + # Deploys cross repo with an access token. + integration-cross-repo-push: + needs: integration-container + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Build and Deploy + uses: JamesIves/github-pages-deploy-action@releases/v4 + with: + repository-name: MontezumaIves/lab + token: ${{ secrets.CROSS_REPO_PUSH_TOKEN }} + branch: gh-pages + folder: integration + single-commit: true + # Deploys using an SSH key. integration-ssh-third-party-client: needs: integration-container diff --git a/README.md b/README.md index 9ed6db96e..555370be8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

- +

@@ -35,7 +35,7 @@

- +

## Getting Started :airplane: diff --git a/__tests__/git.test.ts b/__tests__/git.test.ts index 4b882304c..5331158b8 100644 --- a/__tests__/git.test.ts +++ b/__tests__/git.test.ts @@ -55,7 +55,7 @@ describe('git', () => { }) await init(action) - expect(execute).toBeCalledTimes(4) + expect(execute).toBeCalledTimes(5) }) it('should catch when a function throws an error', async () => { @@ -85,6 +85,47 @@ describe('git', () => { } }) + it('should correctly continue when it cannot unset a git config value', async () => { + Object.assign(action, { + silent: false, + repositoryPath: 'JamesIves/github-pages-deploy-action', + token: '123', + branch: 'branch', + folder: '.', + pusher: { + name: 'asd', + email: 'as@cat' + }, + isTest: TestFlag.UNABLE_TO_UNSET_GIT_CONFIG + }) + + await init(action) + expect(execute).toBeCalledTimes(5) + }) + + it('should not unset git config if a user is using ssh', async () => { + // Sets and unsets the CI condition. + process.env.CI = 'true' + + Object.assign(action, { + silent: false, + repositoryPath: 'JamesIves/github-pages-deploy-action', + sshKey: true, + branch: 'branch', + folder: '.', + pusher: { + name: 'asd', + email: 'as@cat' + }, + isTest: false + }) + + await init(action) + expect(execute).toBeCalledTimes(4) + + process.env.CI = undefined + }) + it('should correctly continue when it cannot remove origin', async () => { Object.assign(action, { silent: false, @@ -100,7 +141,7 @@ describe('git', () => { }) await init(action) - expect(execute).toBeCalledTimes(4) + expect(execute).toBeCalledTimes(5) }) }) diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts index 87c3a98d0..e7d85d22c 100644 --- a/__tests__/main.test.ts +++ b/__tests__/main.test.ts @@ -49,7 +49,7 @@ describe('main', () => { debug: true }) await run(action) - expect(execute).toBeCalledTimes(12) + expect(execute).toBeCalledTimes(13) expect(rmRF).toBeCalledTimes(1) expect(exportVariable).toBeCalledTimes(1) }) @@ -68,7 +68,7 @@ describe('main', () => { isTest: TestFlag.HAS_CHANGED_FILES }) await run(action) - expect(execute).toBeCalledTimes(15) + expect(execute).toBeCalledTimes(16) expect(rmRF).toBeCalledTimes(1) expect(exportVariable).toBeCalledTimes(1) }) diff --git a/assets/icon.png b/assets/icon.png index 79c91af79a68cb7e7882a31162cefbed6ee8f414..f1b729fd1fdb1b8d2a930a04f0e2d4eec14fd2d2 100644 GIT binary patch literal 64156 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

p|Is6IcDSEl0!-7(J&$17LeT^;%$0 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¬Jge)8>-T4`lhiV&rm6TNMRcE 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 I1Od`M^3QS0bytw4GSEpgMi6Vc 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 literal 45944 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 diff --git a/src/constants.ts b/src/constants.ts index 648eae36a..cfcefbb82 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -7,9 +7,10 @@ const {pusher, repository} = github.context.payload /* Flags to signal different scenarios to test cases */ export enum TestFlag { NONE = 0, - HAS_CHANGED_FILES = 1 << 1, // Assume changes to commit - HAS_REMOTE_BRANCH = 1 << 2, // Assume remote repository has existing commits - UNABLE_TO_REMOVE_ORIGIN = 1 << 3 // Assume we can't remove origin + HAS_CHANGED_FILES = 1 << 1, // Assume changes to commit. + HAS_REMOTE_BRANCH = 1 << 2, // Assume remote repository has existing commits. + UNABLE_TO_REMOVE_ORIGIN = 1 << 3, // Assume we can't remove origin. + UNABLE_TO_UNSET_GIT_CONFIG = 1 << 4 // Assume we can't remove previously set git configs. } /* For more information please refer to the README: https://github.com/JamesIves/github-pages-deploy-action */ diff --git a/src/git.ts b/src/git.ts index 272b9b1e1..7760c8f9d 100644 --- a/src/git.ts +++ b/src/git.ts @@ -23,6 +23,27 @@ export async function init(action: ActionInterface): Promise { action.silent ) + try { + if ((process.env.CI && !action.sshKey) || action.isTest) { + /* Ensures that previously set Git configs do not interfere with the deployment. + Only runs in the GitHub Actions CI environment if a user is not using an SSH key. + */ + await execute( + `git config --local --unset-all http.https://github.com/.extraheader`, + action.workspace, + action.silent + ) + } + + if (action.isTest === TestFlag.UNABLE_TO_UNSET_GIT_CONFIG) { + throw new Error() + } + } catch { + info( + 'Unable to unset previous git config authentication as it may not exist, continuing…' + ) + } + try { await execute(`git remote rm origin`, action.workspace, action.silent) @@ -38,7 +59,6 @@ export async function init(action: ActionInterface): Promise { action.workspace, action.silent ) - info('Git configured… 🔧') } catch (error) { throw new Error( From 3a9b795240681ea05c44a2365a588345e0cca5d5 Mon Sep 17 00:00:00 2001 From: James Ives Date: Fri, 5 Feb 2021 10:13:30 -0500 Subject: [PATCH 31/32] Update README.md --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 555370be8..f6d4c05a0 100644 --- a/README.md +++ b/README.md @@ -125,12 +125,12 @@ The following options must be configured in order to make a deployment. | `branch` | This is the branch you wish to deploy to, for example `gh-pages` or `docs`. | `with` | **Yes** | | `folder` | The folder in your repository that you want to deploy. If your build script compiles into a directory named `build` you'd put it here. If you wish to deploy the root directory you can place a `.` here. You can also utilize absolute file paths by appending `~` to your folder path. | `with` | **Yes** | -By default the action does not need any token configuration and uses the provided repository scoped GitHub token to make the deployment. If you require most customization you can modify the deployment type using the following options. +By default the action does not need any token configuration and uses the provided repository scoped GitHub token to make the deployment. If you require more customization you can modify the deployment type using the following options. | Key | Value Information | Type | Required | | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | -------- | | `token` | This option defaults to the repository scoped GitHub Token. However if you need more permissions for things such as deploying to another repository, you can add a Personal Access Token (PAT) here. This should be stored in the `secrets / with` menu **as a secret**. We reccomend using a service account with the least permissions neccersary and recommend when generating a new PAT that you select the least permission scopes neccersary. [Learn more about creating and using encrypted secrets here.](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets) | `with` | **No** | -| `ssh-key` | You can configure the action to deploy using SSH by setting this option to a private SSH key stored **as a secret**. It can also be set to `true` to use an existing SSH client configuration. For more detailed information on how to add your ssh key pair please refer to the [Using a Deploy Key section of this README](https://github.com/JamesIves/github-pages-deploy-action/tree/dev#using-an-ssh-deploy-key-). | `with` | **No** | +| `ssh-key` | You can configure the action to deploy using SSH by setting this option to a private SSH key stored **as a secret**. It can also be set to `true` to use an existing SSH client configuration. For more detailed information on how to add your public/private ssh key pair please refer to the [Using a Deploy Key section of this README](https://github.com/JamesIves/github-pages-deploy-action/tree/dev#using-an-ssh-deploy-key-). | `with` | **No** | #### Optional Choices @@ -199,7 +199,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout 🛎️ - uses: actions/checkout@v2 + uses: actions/checkout@v2.3.1 - name: Install and Build 🔧 # This example project is built using npm and outputs the result to the 'build' folder. Replace with the commands required to build your project, or remove this step entirely if your site is pre-built. run: | @@ -248,7 +248,7 @@ jobs: runs-on: windows-latest # The first job utilizes windows-latest steps: - name: Checkout 🛎️ - uses: actions/checkout@v2 + uses: actions/checkout@v2.3.1 - name: Install and Build 🔧 # This example project is built using npm and outputs the result to the 'build' folder. Replace with the commands required to build your project, or remove this step entirely if your site is pre-built. run: | @@ -266,7 +266,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout 🛎️ - uses: actions/checkout@v2 + uses: actions/checkout@v2.3.1 - name: Download Artifacts 🔻 # The built project is downloaded into the 'site' folder. uses: actions/download-artifact@v1 @@ -320,7 +320,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout 🛎️ - uses: actions/checkout@v2 + uses: actions/checkout@v2.3.1 - name: Install and Build 🔧 # This example project is built using npm and outputs the result to the 'build' folder. Replace with the commands required to build your project, or remove this step entirely if your site is pre-built. run: | @@ -346,6 +346,6 @@ If you wish to remove these files you must go into the deployment branch directl ## Support 💖 -This project would not be possible without all of our fantastic [contributors](https://github.com/JamesIves/github-pages-deploy-action/graphs/contributors). +This project would not be possible without all of our fantastic [contributors](https://github.com/JamesIves/github-pages-deploy-action/graphs/contributors). The project logo was created by [Paganini](https://twitter.com/paganiniart). If you'd like to support the maintenance and upkeep of this project you can [donate via GitHub Sponsors](https://github.com/sponsors/JamesIves). This project is distributed under the [MIT](https://github.com/JamesIves/github-pages-deploy-action/blob/dev/LICENSE) license. From cb95e7b918536d4a1426c79f5e56ff0e27613797 Mon Sep 17 00:00:00 2001 From: James Ives Date: Fri, 5 Feb 2021 21:38:08 -0500 Subject: [PATCH 32/32] Update devcontainer.json --- .devcontainer/devcontainer.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index b72d84679..eb04e5b13 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -3,9 +3,8 @@ "name": "Node.js & TypeScript", "build": { "dockerfile": "Dockerfile", - // Update 'VARIANT' to pick a Node version: 10, 12, 14 "args": { - "VARIANT": "14" + "VARIANT": "12" } }, "settings": {