mirror of
https://github.com/JamesIves/github-pages-deploy-action.git
synced 2023-12-15 20:03:39 +08:00
Some additional integration test fixes
This commit is contained in:
parent
d51113f1c1
commit
41de4b88ee
2
.github/workflows/integration.yml
vendored
2
.github/workflows/integration.yml
vendored
@ -36,7 +36,7 @@ jobs:
|
|||||||
- name: Build and Deploy
|
- name: Build and Deploy
|
||||||
uses: JamesIves/github-pages-deploy-action@releases/v3-test
|
uses: JamesIves/github-pages-deploy-action@releases/v3-test
|
||||||
with:
|
with:
|
||||||
ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
BRANCH: gh-pages
|
BRANCH: gh-pages
|
||||||
FOLDER: integration
|
FOLDER: integration
|
||||||
BASE_BRANCH: dev
|
BASE_BRANCH: dev
|
||||||
|
23
__tests__/execute.test.ts
Normal file
23
__tests__/execute.test.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import {execute} from '../src/execute';
|
||||||
|
import {exec} from '@actions/exec';
|
||||||
|
|
||||||
|
jest.mock('@actions/exec', () => ({
|
||||||
|
exec: jest.fn()
|
||||||
|
}))
|
||||||
|
|
||||||
|
describe('execute', () => {
|
||||||
|
describe('execute', () => {
|
||||||
|
it('should be called with the correct arguements', async() => {
|
||||||
|
await execute('echo Montezuma', './')
|
||||||
|
|
||||||
|
expect(exec).toBeCalledWith(
|
||||||
|
"echo Montezuma", [], {
|
||||||
|
cwd: "./",
|
||||||
|
listeners: {
|
||||||
|
stdout: expect.any(Function)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
});
|
||||||
|
})
|
||||||
|
})
|
@ -5,11 +5,11 @@ process.env["GITHUB_SHA"] = "123";
|
|||||||
import _ from "lodash";
|
import _ from "lodash";
|
||||||
import { action } from "../src/constants";
|
import { action } from "../src/constants";
|
||||||
import { deploy, generateBranch, init, switchToBaseBranch } from "../src/git";
|
import { deploy, generateBranch, init, switchToBaseBranch } from "../src/git";
|
||||||
import { execute } from "../src/util";
|
import { execute } from "../src/execute";
|
||||||
|
|
||||||
const originalAction = _.cloneDeep(action);
|
const originalAction = _.cloneDeep(action);
|
||||||
|
|
||||||
jest.mock("../src/util", () => ({
|
jest.mock("../src/execute", () => ({
|
||||||
execute: jest.fn()
|
execute: jest.fn()
|
||||||
}));
|
}));
|
||||||
|
|
||||||
@ -30,7 +30,7 @@ describe("git", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const call = await init();
|
const call = await init();
|
||||||
expect(execute).toBeCalledTimes(3);
|
expect(execute).toBeCalledTimes(4);
|
||||||
expect(call).toBe("Initialization step complete...");
|
expect(call).toBe("Initialization step complete...");
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ describe("git", () => {
|
|||||||
|
|
||||||
const call = await init();
|
const call = await init();
|
||||||
|
|
||||||
expect(execute).toBeCalledTimes(3);
|
expect(execute).toBeCalledTimes(4);
|
||||||
expect(call).toBe("Initialization step complete...");
|
expect(call).toBe("Initialization step complete...");
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -109,7 +109,7 @@ describe("git", () => {
|
|||||||
|
|
||||||
const call = await init();
|
const call = await init();
|
||||||
|
|
||||||
expect(execute).toBeCalledTimes(3);
|
expect(execute).toBeCalledTimes(4);
|
||||||
expect(call).toBe("Initialization step complete...");
|
expect(call).toBe("Initialization step complete...");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -1,23 +1,20 @@
|
|||||||
import {execute} from '../src/util';
|
import {isNullOrUndefined} from '../src/util';
|
||||||
import {exec} from '@actions/exec';
|
|
||||||
|
|
||||||
jest.mock('@actions/exec', () => ({
|
|
||||||
exec: jest.fn()
|
|
||||||
}))
|
|
||||||
|
|
||||||
describe('util', () => {
|
describe('util', () => {
|
||||||
describe('execute', () => {
|
describe('isNullOrUndefined', () => {
|
||||||
it('should be called with the correct arguements', async() => {
|
it('should return true if the value is null', async() => {
|
||||||
await execute('echo Montezuma', './')
|
const value = null;
|
||||||
|
expect(isNullOrUndefined(value)).toBeTruthy()
|
||||||
|
|
||||||
expect(exec).toBeCalledWith(
|
it('should return true if the value is undefined', async() => {
|
||||||
"echo Montezuma", [], {
|
const value = undefined;
|
||||||
cwd: "./",
|
expect(isNullOrUndefined(value)).toBeTruthy()
|
||||||
listeners: {
|
});
|
||||||
stdout: expect.any(Function)
|
|
||||||
}
|
it('should return false if the value is defined', async() => {
|
||||||
}
|
const value = 'montezuma';
|
||||||
)
|
expect(isNullOrUndefined(value)).toBeFalsy()
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
})
|
})
|
33
lib/execute.js
Normal file
33
lib/execute.js
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
"use strict";
|
||||||
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||||
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||||
|
return new (P || (P = Promise))(function (resolve, reject) {
|
||||||
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||||
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||||
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||||
|
});
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
const exec_1 = require("@actions/exec");
|
||||||
|
/** Wrapper around the GitHub toolkit exec command which returns the output.
|
||||||
|
* Also allows you to easily toggle the current working directory.
|
||||||
|
* @param {String} cmd = The command to execute.
|
||||||
|
* @param {String} cwd - The current working directory.
|
||||||
|
* @returns {Promise} - The output from the command.
|
||||||
|
*/
|
||||||
|
function execute(cmd, cwd) {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
let output = "";
|
||||||
|
yield exec_1.exec(cmd, [], {
|
||||||
|
cwd,
|
||||||
|
listeners: {
|
||||||
|
stdout: (data) => {
|
||||||
|
output += data.toString().trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return Promise.resolve(output);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
exports.execute = execute;
|
47
lib/git.js
47
lib/git.js
@ -17,6 +17,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|||||||
};
|
};
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const core = __importStar(require("@actions/core"));
|
const core = __importStar(require("@actions/core"));
|
||||||
|
const execute_1 = require("./execute");
|
||||||
const util_1 = require("./util");
|
const util_1 = require("./util");
|
||||||
const constants_1 = require("./constants");
|
const constants_1 = require("./constants");
|
||||||
/** Generates the branch if it doesn't exist on the remote.
|
/** Generates the branch if it doesn't exist on the remote.
|
||||||
@ -25,16 +26,18 @@ const constants_1 = require("./constants");
|
|||||||
function init() {
|
function init() {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
try {
|
try {
|
||||||
if (!constants_1.action.accessToken && !constants_1.action.gitHubToken) {
|
if (util_1.isNullOrUndefined(constants_1.action.accessToken) &&
|
||||||
|
util_1.isNullOrUndefined(constants_1.action.gitHubToken)) {
|
||||||
return core.setFailed("You must provide the action with either a Personal Access Token or the GitHub Token secret in order to deploy.");
|
return core.setFailed("You must provide the action with either a Personal Access Token or the GitHub Token secret in order to deploy.");
|
||||||
}
|
}
|
||||||
if (constants_1.action.build.startsWith("/") || constants_1.action.build.startsWith("./")) {
|
if (constants_1.action.build.startsWith("/") || constants_1.action.build.startsWith("./")) {
|
||||||
|
console.log("2");
|
||||||
return core.setFailed(`The deployment folder cannot be prefixed with '/' or './'. Instead reference the folder name directly.`);
|
return core.setFailed(`The deployment folder cannot be prefixed with '/' or './'. Instead reference the folder name directly.`);
|
||||||
}
|
}
|
||||||
yield util_1.execute(`git init`, constants_1.workspace);
|
yield execute_1.execute(`git init`, constants_1.workspace);
|
||||||
yield util_1.execute(`git config user.name ${constants_1.action.name}`, constants_1.workspace);
|
yield execute_1.execute(`git config user.name ${constants_1.action.name}`, constants_1.workspace);
|
||||||
yield util_1.execute(`git config user.email ${constants_1.action.email}`, constants_1.workspace);
|
yield execute_1.execute(`git config user.email ${constants_1.action.email}`, constants_1.workspace);
|
||||||
yield util_1.execute(`git fetch`, constants_1.workspace);
|
yield execute_1.execute(`git fetch`, constants_1.workspace);
|
||||||
}
|
}
|
||||||
catch (error) {
|
catch (error) {
|
||||||
core.setFailed(`There was an error initializing the repository: ${error}`);
|
core.setFailed(`There was an error initializing the repository: ${error}`);
|
||||||
@ -50,7 +53,7 @@ exports.init = init;
|
|||||||
*/
|
*/
|
||||||
function switchToBaseBranch() {
|
function switchToBaseBranch() {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
yield util_1.execute(constants_1.action.baseBranch
|
yield execute_1.execute(constants_1.action.baseBranch
|
||||||
? `git switch ${constants_1.action.baseBranch}`
|
? `git switch ${constants_1.action.baseBranch}`
|
||||||
: `git checkout --progress --force ${constants_1.action.defaultBranch}`, constants_1.workspace);
|
: `git checkout --progress --force ${constants_1.action.defaultBranch}`, constants_1.workspace);
|
||||||
return Promise.resolve("Switched to the base branch...");
|
return Promise.resolve("Switched to the base branch...");
|
||||||
@ -65,11 +68,11 @@ function generateBranch() {
|
|||||||
try {
|
try {
|
||||||
console.log(`Creating ${constants_1.action.branch} branch... 🔧`);
|
console.log(`Creating ${constants_1.action.branch} branch... 🔧`);
|
||||||
yield switchToBaseBranch();
|
yield switchToBaseBranch();
|
||||||
yield util_1.execute(`git switch --orphan ${constants_1.action.branch}`, constants_1.workspace);
|
yield execute_1.execute(`git switch --orphan ${constants_1.action.branch}`, constants_1.workspace);
|
||||||
yield util_1.execute(`git reset --hard`, constants_1.workspace);
|
yield execute_1.execute(`git reset --hard`, constants_1.workspace);
|
||||||
yield util_1.execute(`git commit --allow-empty -m "Initial ${constants_1.action.branch} commit."`, constants_1.workspace);
|
yield execute_1.execute(`git commit --allow-empty -m "Initial ${constants_1.action.branch} commit."`, constants_1.workspace);
|
||||||
yield util_1.execute(`git push ${constants_1.repositoryPath} ${constants_1.action.branch}`, constants_1.workspace);
|
yield execute_1.execute(`git push ${constants_1.repositoryPath} ${constants_1.action.branch}`, constants_1.workspace);
|
||||||
yield util_1.execute(`git fetch`, constants_1.workspace);
|
yield execute_1.execute(`git fetch`, constants_1.workspace);
|
||||||
}
|
}
|
||||||
catch (error) {
|
catch (error) {
|
||||||
core.setFailed(`There was an error creating the deployment branch: ${error} ❌`);
|
core.setFailed(`There was an error creating the deployment branch: ${error} ❌`);
|
||||||
@ -91,15 +94,15 @@ function deploy() {
|
|||||||
Checks to see if the remote exists prior to deploying.
|
Checks to see if the remote exists prior to deploying.
|
||||||
If the branch doesn't exist it gets created here as an orphan.
|
If the branch doesn't exist it gets created here as an orphan.
|
||||||
*/
|
*/
|
||||||
const branchExists = yield util_1.execute(`git ls-remote --heads ${constants_1.repositoryPath} ${constants_1.action.branch} | wc -l`, constants_1.workspace);
|
const branchExists = yield execute_1.execute(`git ls-remote --heads ${constants_1.repositoryPath} ${constants_1.action.branch} | wc -l`, constants_1.workspace);
|
||||||
if (!branchExists) {
|
if (!branchExists) {
|
||||||
console.log("Deployment branch does not exist. Creating....");
|
console.log("Deployment branch does not exist. Creating....");
|
||||||
yield generateBranch();
|
yield generateBranch();
|
||||||
}
|
}
|
||||||
// Checks out the base branch to begin the deployment process.
|
// Checks out the base branch to begin the deployment process.
|
||||||
yield switchToBaseBranch();
|
yield switchToBaseBranch();
|
||||||
yield util_1.execute(`git fetch ${constants_1.repositoryPath}`, constants_1.workspace);
|
yield execute_1.execute(`git fetch ${constants_1.repositoryPath}`, constants_1.workspace);
|
||||||
yield util_1.execute(`git worktree add --checkout ${temporaryDeploymentDirectory} origin/${constants_1.action.branch}`, constants_1.workspace);
|
yield execute_1.execute(`git worktree add --checkout ${temporaryDeploymentDirectory} origin/${constants_1.action.branch}`, constants_1.workspace);
|
||||||
// Ensures that items that need to be excluded from the clean job get parsed.
|
// Ensures that items that need to be excluded from the clean job get parsed.
|
||||||
let excludes = "";
|
let excludes = "";
|
||||||
if (constants_1.action.clean && constants_1.action.cleanExclude) {
|
if (constants_1.action.clean && constants_1.action.cleanExclude) {
|
||||||
@ -115,25 +118,25 @@ function deploy() {
|
|||||||
Pushes all of the build files into the deployment directory.
|
Pushes all of the build files into the deployment directory.
|
||||||
Allows the user to specify the root if '.' is provided.
|
Allows the user to specify the root if '.' is provided.
|
||||||
rysync is used to prevent file duplication. */
|
rysync is used to prevent file duplication. */
|
||||||
yield util_1.execute(`rsync -q -av --progress ${constants_1.action.build}/. ${constants_1.action.targetFolder
|
yield execute_1.execute(`rsync -q -av --progress ${constants_1.action.build}/. ${constants_1.action.targetFolder
|
||||||
? `${temporaryDeploymentDirectory}/${constants_1.action.targetFolder}`
|
? `${temporaryDeploymentDirectory}/${constants_1.action.targetFolder}`
|
||||||
: temporaryDeploymentDirectory} ${constants_1.action.clean
|
: temporaryDeploymentDirectory} ${constants_1.action.clean
|
||||||
? `--delete ${excludes} --exclude CNAME --exclude .nojekyll`
|
? `--delete ${excludes} --exclude CNAME --exclude .nojekyll`
|
||||||
: ""} --exclude .git --exclude .github ${constants_1.action.build === constants_1.root ? `--exclude ${temporaryDeploymentDirectory}` : ""}`, constants_1.workspace);
|
: ""} --exclude .git --exclude .github ${constants_1.action.build === constants_1.root ? `--exclude ${temporaryDeploymentDirectory}` : ""}`, constants_1.workspace);
|
||||||
const hasFilesToCommit = yield util_1.execute(`git status --porcelain`, temporaryDeploymentDirectory);
|
const hasFilesToCommit = yield execute_1.execute(`git status --porcelain`, temporaryDeploymentDirectory);
|
||||||
if (!hasFilesToCommit && !constants_1.isTest) {
|
if (!hasFilesToCommit && !constants_1.isTest) {
|
||||||
console.log("There is nothing to commit. Exiting... ✅");
|
console.log("There is nothing to commit. Exiting... ✅");
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
// Commits to GitHub.
|
// Commits to GitHub.
|
||||||
yield util_1.execute(`git add --all .`, temporaryDeploymentDirectory);
|
yield execute_1.execute(`git add --all .`, temporaryDeploymentDirectory);
|
||||||
yield util_1.execute(`git switch -c ${temporaryDeploymentBranch}`, temporaryDeploymentDirectory);
|
yield execute_1.execute(`git switch -c ${temporaryDeploymentBranch}`, temporaryDeploymentDirectory);
|
||||||
yield util_1.execute(`git commit -m "Deploying to ${constants_1.action.branch} from ${constants_1.action.baseBranch} ${process.env.GITHUB_SHA}" --quiet`, temporaryDeploymentDirectory);
|
yield execute_1.execute(`git commit -m "Deploying to ${constants_1.action.branch} from ${constants_1.action.baseBranch} ${process.env.GITHUB_SHA}" --quiet`, temporaryDeploymentDirectory);
|
||||||
yield util_1.execute(`git push --force ${constants_1.repositoryPath} ${temporaryDeploymentBranch}:${constants_1.action.branch}`, temporaryDeploymentDirectory);
|
yield execute_1.execute(`git push --force ${constants_1.repositoryPath} ${temporaryDeploymentBranch}:${constants_1.action.branch}`, temporaryDeploymentDirectory);
|
||||||
// Cleans up temporary files/folders and restores the git state.
|
// Cleans up temporary files/folders and restores the git state.
|
||||||
console.log("Running post deployment cleanup jobs... 🔧");
|
console.log("Running post deployment cleanup jobs... 🔧");
|
||||||
yield util_1.execute(`rm -rf ${temporaryDeploymentDirectory}`, constants_1.workspace);
|
yield execute_1.execute(`rm -rf ${temporaryDeploymentDirectory}`, constants_1.workspace);
|
||||||
yield util_1.execute(`git checkout --progress --force ${constants_1.action.defaultBranch}`, constants_1.workspace);
|
yield execute_1.execute(`git checkout --progress --force ${constants_1.action.defaultBranch}`, constants_1.workspace);
|
||||||
return Promise.resolve("Commit step complete...");
|
return Promise.resolve("Commit step complete...");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
43
lib/src/constants.js
Normal file
43
lib/src/constants.js
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
"use strict";
|
||||||
|
var __importStar = (this && this.__importStar) || function (mod) {
|
||||||
|
if (mod && mod.__esModule) return mod;
|
||||||
|
var result = {};
|
||||||
|
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
||||||
|
result["default"] = mod;
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
const core = __importStar(require("@actions/core"));
|
||||||
|
const github = __importStar(require("@actions/github"));
|
||||||
|
const { pusher, repository } = github.context.payload;
|
||||||
|
exports.workspace = process.env.GITHUB_WORKSPACE;
|
||||||
|
exports.folder = core.getInput("FOLDER", { required: true });
|
||||||
|
exports.root = ".";
|
||||||
|
exports.isTest = process.env.UNIT_TEST;
|
||||||
|
// Required action data.
|
||||||
|
exports.action = {
|
||||||
|
build: exports.folder,
|
||||||
|
gitHubRepository: repository && repository.full_name
|
||||||
|
? repository.full_name
|
||||||
|
: process.env.GITHUB_REPOSITORY,
|
||||||
|
gitHubToken: core.getInput("GITHUB_TOKEN"),
|
||||||
|
accessToken: core.getInput("ACCESS_TOKEN"),
|
||||||
|
branch: core.getInput("BRANCH"),
|
||||||
|
targetFolder: core.getInput("TARGET_FOLDER"),
|
||||||
|
baseBranch: core.getInput("BASE_BRANCH"),
|
||||||
|
defaultBranch: process.env.GITHUB_SHA ? process.env.GITHUB_SHA : "master",
|
||||||
|
name: pusher && pusher.name
|
||||||
|
? pusher.name
|
||||||
|
: process.env.GITHUB_ACTOR
|
||||||
|
? process.env.GITHUB_ACTOR
|
||||||
|
: "GitHub Pages Deploy Action",
|
||||||
|
email: pusher && pusher.email
|
||||||
|
? pusher.email
|
||||||
|
: `${process.env.GITHUB_ACTOR ||
|
||||||
|
"github-pages-deploy-action"}@users.noreply.github.com`,
|
||||||
|
clean: core.getInput("CLEAN"),
|
||||||
|
cleanExclude: core.getInput("CLEAN_EXCLUDE")
|
||||||
|
};
|
||||||
|
// Repository path used for commits/pushes.
|
||||||
|
exports.repositoryPath = `https://${exports.action.accessToken ||
|
||||||
|
`x-access-token:${exports.action.gitHubToken}`}@github.com/${exports.action.gitHubRepository}.git`;
|
33
lib/src/execute.js
Normal file
33
lib/src/execute.js
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
"use strict";
|
||||||
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||||
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||||
|
return new (P || (P = Promise))(function (resolve, reject) {
|
||||||
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||||
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||||
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||||
|
});
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
const exec_1 = require("@actions/exec");
|
||||||
|
/** Wrapper around the GitHub toolkit exec command which returns the output.
|
||||||
|
* Also allows you to easily toggle the current working directory.
|
||||||
|
* @param {String} cmd = The command to execute.
|
||||||
|
* @param {String} cwd - The current working directory.
|
||||||
|
* @returns {Promise} - The output from the command.
|
||||||
|
*/
|
||||||
|
function execute(cmd, cwd) {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
let output = "";
|
||||||
|
yield exec_1.exec(cmd, [], {
|
||||||
|
cwd,
|
||||||
|
listeners: {
|
||||||
|
stdout: (data) => {
|
||||||
|
output += data.toString().trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return Promise.resolve(output);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
exports.execute = execute;
|
143
lib/src/git.js
Normal file
143
lib/src/git.js
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
"use strict";
|
||||||
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||||
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||||
|
return new (P || (P = Promise))(function (resolve, reject) {
|
||||||
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||||
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||||
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||||
|
});
|
||||||
|
};
|
||||||
|
var __importStar = (this && this.__importStar) || function (mod) {
|
||||||
|
if (mod && mod.__esModule) return mod;
|
||||||
|
var result = {};
|
||||||
|
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
||||||
|
result["default"] = mod;
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
const core = __importStar(require("@actions/core"));
|
||||||
|
const execute_1 = require("./execute");
|
||||||
|
const util_1 = require("./util");
|
||||||
|
const constants_1 = require("./constants");
|
||||||
|
/** Generates the branch if it doesn't exist on the remote.
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
function init() {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
try {
|
||||||
|
if (util_1.isNullOrUndefined(constants_1.action.accessToken) &&
|
||||||
|
util_1.isNullOrUndefined(constants_1.action.gitHubToken)) {
|
||||||
|
return core.setFailed("You must provide the action with either a Personal Access Token or the GitHub Token secret in order to deploy.");
|
||||||
|
}
|
||||||
|
if (constants_1.action.build.startsWith("/") || constants_1.action.build.startsWith("./")) {
|
||||||
|
console.log("2");
|
||||||
|
return core.setFailed(`The deployment folder cannot be prefixed with '/' or './'. Instead reference the folder name directly.`);
|
||||||
|
}
|
||||||
|
yield execute_1.execute(`git init`, constants_1.workspace);
|
||||||
|
yield execute_1.execute(`git config user.name ${constants_1.action.name}`, constants_1.workspace);
|
||||||
|
yield execute_1.execute(`git config user.email ${constants_1.action.email}`, constants_1.workspace);
|
||||||
|
yield execute_1.execute(`git fetch`, constants_1.workspace);
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
core.setFailed(`There was an error initializing the repository: ${error}`);
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
return Promise.resolve("Initialization step complete...");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
exports.init = init;
|
||||||
|
/** Switches to the base branch.
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
function switchToBaseBranch() {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
yield execute_1.execute(constants_1.action.baseBranch
|
||||||
|
? `git switch ${constants_1.action.baseBranch}`
|
||||||
|
: `git checkout --progress --force ${constants_1.action.defaultBranch}`, constants_1.workspace);
|
||||||
|
return Promise.resolve("Switched to the base branch...");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
exports.switchToBaseBranch = switchToBaseBranch;
|
||||||
|
/** Generates the branch if it doesn't exist on the remote.
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
function generateBranch() {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
try {
|
||||||
|
console.log(`Creating ${constants_1.action.branch} branch... 🔧`);
|
||||||
|
yield switchToBaseBranch();
|
||||||
|
yield execute_1.execute(`git switch --orphan ${constants_1.action.branch}`, constants_1.workspace);
|
||||||
|
yield execute_1.execute(`git reset --hard`, constants_1.workspace);
|
||||||
|
yield execute_1.execute(`git commit --allow-empty -m "Initial ${constants_1.action.branch} commit."`, constants_1.workspace);
|
||||||
|
yield execute_1.execute(`git push ${constants_1.repositoryPath} ${constants_1.action.branch}`, constants_1.workspace);
|
||||||
|
yield execute_1.execute(`git fetch`, constants_1.workspace);
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
core.setFailed(`There was an error creating the deployment branch: ${error} ❌`);
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
return Promise.resolve("Deployment branch creation step complete... ✅");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
exports.generateBranch = generateBranch;
|
||||||
|
/** Runs the necessary steps to make the deployment.
|
||||||
|
* @returns {Promise}
|
||||||
|
*/
|
||||||
|
function deploy() {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
const temporaryDeploymentDirectory = "gh-action-temp-deployment-folder";
|
||||||
|
const temporaryDeploymentBranch = "gh-action-temp-deployment-branch";
|
||||||
|
/*
|
||||||
|
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 = yield execute_1.execute(`git ls-remote --heads ${constants_1.repositoryPath} ${constants_1.action.branch} | wc -l`, constants_1.workspace);
|
||||||
|
if (!branchExists) {
|
||||||
|
console.log("Deployment branch does not exist. Creating....");
|
||||||
|
yield generateBranch();
|
||||||
|
}
|
||||||
|
// Checks out the base branch to begin the deployment process.
|
||||||
|
yield switchToBaseBranch();
|
||||||
|
yield execute_1.execute(`git fetch ${constants_1.repositoryPath}`, constants_1.workspace);
|
||||||
|
yield execute_1.execute(`git worktree add --checkout ${temporaryDeploymentDirectory} origin/${constants_1.action.branch}`, constants_1.workspace);
|
||||||
|
// Ensures that items that need to be excluded from the clean job get parsed.
|
||||||
|
let excludes = "";
|
||||||
|
if (constants_1.action.clean && constants_1.action.cleanExclude) {
|
||||||
|
try {
|
||||||
|
const excludedItems = JSON.parse(constants_1.action.cleanExclude);
|
||||||
|
excludedItems.forEach((item) => (excludes += `--exclude ${item} `));
|
||||||
|
}
|
||||||
|
catch (_a) {
|
||||||
|
console.log("There was an error parsing your CLEAN_EXCLUDE items. Please refer to the README for more details. ❌");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
Pushes all of the build files into the deployment directory.
|
||||||
|
Allows the user to specify the root if '.' is provided.
|
||||||
|
rysync is used to prevent file duplication. */
|
||||||
|
yield execute_1.execute(`rsync -q -av --progress ${constants_1.action.build}/. ${constants_1.action.targetFolder
|
||||||
|
? `${temporaryDeploymentDirectory}/${constants_1.action.targetFolder}`
|
||||||
|
: temporaryDeploymentDirectory} ${constants_1.action.clean
|
||||||
|
? `--delete ${excludes} --exclude CNAME --exclude .nojekyll`
|
||||||
|
: ""} --exclude .git --exclude .github ${constants_1.action.build === constants_1.root ? `--exclude ${temporaryDeploymentDirectory}` : ""}`, constants_1.workspace);
|
||||||
|
const hasFilesToCommit = yield execute_1.execute(`git status --porcelain`, temporaryDeploymentDirectory);
|
||||||
|
if (!hasFilesToCommit && !constants_1.isTest) {
|
||||||
|
console.log("There is nothing to commit. Exiting... ✅");
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
// Commits to GitHub.
|
||||||
|
yield execute_1.execute(`git add --all .`, temporaryDeploymentDirectory);
|
||||||
|
yield execute_1.execute(`git switch -c ${temporaryDeploymentBranch}`, temporaryDeploymentDirectory);
|
||||||
|
yield execute_1.execute(`git commit -m "Deploying to ${constants_1.action.branch} from ${constants_1.action.baseBranch} ${process.env.GITHUB_SHA}" --quiet`, temporaryDeploymentDirectory);
|
||||||
|
yield execute_1.execute(`git push --force ${constants_1.repositoryPath} ${temporaryDeploymentBranch}:${constants_1.action.branch}`, temporaryDeploymentDirectory);
|
||||||
|
// Cleans up temporary files/folders and restores the git state.
|
||||||
|
console.log("Running post deployment cleanup jobs... 🔧");
|
||||||
|
yield execute_1.execute(`rm -rf ${temporaryDeploymentDirectory}`, constants_1.workspace);
|
||||||
|
yield execute_1.execute(`git checkout --progress --force ${constants_1.action.defaultBranch}`, constants_1.workspace);
|
||||||
|
return Promise.resolve("Commit step complete...");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
exports.deploy = deploy;
|
36
lib/src/main.js
Normal file
36
lib/src/main.js
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
"use strict";
|
||||||
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||||
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||||
|
return new (P || (P = Promise))(function (resolve, reject) {
|
||||||
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||||
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||||
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||||
|
});
|
||||||
|
};
|
||||||
|
var __importStar = (this && this.__importStar) || function (mod) {
|
||||||
|
if (mod && mod.__esModule) return mod;
|
||||||
|
var result = {};
|
||||||
|
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
||||||
|
result["default"] = mod;
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
const core = __importStar(require("@actions/core"));
|
||||||
|
const git_1 = require("./git");
|
||||||
|
/** Initializes and runs the action. */
|
||||||
|
(function () {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
try {
|
||||||
|
yield git_1.init();
|
||||||
|
yield git_1.deploy();
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
console.log("The deployment encountered an error. ❌");
|
||||||
|
core.setFailed(error.message);
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
console.log("Completed Deployment ✅");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})();
|
10
lib/src/util.js
Normal file
10
lib/src/util.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
/** Utility function that checks to see if a value is undefined or not.
|
||||||
|
* @param {*} value = The value to check.
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
function isNullOrUndefined(value) {
|
||||||
|
return typeof value === "undefined" || value === null || value === "";
|
||||||
|
}
|
||||||
|
exports.isNullOrUndefined = isNullOrUndefined;
|
35
lib/util.js
35
lib/util.js
@ -1,33 +1,10 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
||||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
||||||
return new (P || (P = Promise))(function (resolve, reject) {
|
|
||||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
||||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
||||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
||||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
||||||
});
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const exec_1 = require("@actions/exec");
|
/** Utility function that checks to see if a value is undefined or not.
|
||||||
/** Wrapper around the GitHub toolkit exec command which returns the output.
|
* @param {*} value = The value to check.
|
||||||
* Also allows you to easily toggle the current working directory.
|
* @returns {boolean}
|
||||||
* @param {String} cmd = The command to execute.
|
|
||||||
* @param {String} cwd - The current working directory.
|
|
||||||
* @returns {Promise} - The output from the command.
|
|
||||||
*/
|
*/
|
||||||
function execute(cmd, cwd) {
|
function isNullOrUndefined(value) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return typeof value === "undefined" || value === null || value === "";
|
||||||
let output = "";
|
|
||||||
yield exec_1.exec(cmd, [], {
|
|
||||||
cwd,
|
|
||||||
listeners: {
|
|
||||||
stdout: (data) => {
|
|
||||||
output += data.toString().trim();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return Promise.resolve(output);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
exports.execute = execute;
|
exports.isNullOrUndefined = isNullOrUndefined;
|
||||||
|
22
src/execute.ts
Normal file
22
src/execute.ts
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import { exec } from "@actions/exec";
|
||||||
|
|
||||||
|
/** Wrapper around the GitHub toolkit exec command which returns the output.
|
||||||
|
* Also allows you to easily toggle the current working directory.
|
||||||
|
* @param {String} cmd = The command to execute.
|
||||||
|
* @param {String} cwd - The current working directory.
|
||||||
|
* @returns {Promise} - The output from the command.
|
||||||
|
*/
|
||||||
|
export async function execute(cmd: string, cwd: string): Promise<any> {
|
||||||
|
let output = "";
|
||||||
|
|
||||||
|
await exec(cmd, [], {
|
||||||
|
cwd,
|
||||||
|
listeners: {
|
||||||
|
stdout: (data: Buffer) => {
|
||||||
|
output += data.toString().trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return Promise.resolve(output);
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
import * as core from "@actions/core";
|
import * as core from "@actions/core";
|
||||||
import { execute } from "./util";
|
import { execute } from "./execute";
|
||||||
|
import { isNullOrUndefined } from "./util";
|
||||||
import { workspace, action, root, repositoryPath, isTest } from "./constants";
|
import { workspace, action, root, repositoryPath, isTest } from "./constants";
|
||||||
|
|
||||||
/** Generates the branch if it doesn't exist on the remote.
|
/** Generates the branch if it doesn't exist on the remote.
|
||||||
@ -7,13 +8,17 @@ import { workspace, action, root, repositoryPath, isTest } from "./constants";
|
|||||||
*/
|
*/
|
||||||
export async function init(): Promise<any> {
|
export async function init(): Promise<any> {
|
||||||
try {
|
try {
|
||||||
if (!action.accessToken && !action.gitHubToken) {
|
if (
|
||||||
|
isNullOrUndefined(action.accessToken) &&
|
||||||
|
isNullOrUndefined(action.gitHubToken)
|
||||||
|
) {
|
||||||
return core.setFailed(
|
return core.setFailed(
|
||||||
"You must provide the action with either a Personal Access Token or the GitHub Token secret in order to deploy."
|
"You must provide the action with either a Personal Access Token or the GitHub Token secret in order to deploy."
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (action.build.startsWith("/") || action.build.startsWith("./")) {
|
if (action.build.startsWith("/") || action.build.startsWith("./")) {
|
||||||
|
console.log("2");
|
||||||
return core.setFailed(
|
return core.setFailed(
|
||||||
`The deployment folder cannot be prefixed with '/' or './'. Instead reference the folder name directly.`
|
`The deployment folder cannot be prefixed with '/' or './'. Instead reference the folder name directly.`
|
||||||
);
|
);
|
||||||
|
25
src/util.ts
25
src/util.ts
@ -1,22 +1,7 @@
|
|||||||
import { exec } from "@actions/exec";
|
/** Utility function that checks to see if a value is undefined or not.
|
||||||
|
* @param {*} value = The value to check.
|
||||||
/** Wrapper around the GitHub toolkit exec command which returns the output.
|
* @returns {boolean}
|
||||||
* Also allows you to easily toggle the current working directory.
|
|
||||||
* @param {String} cmd = The command to execute.
|
|
||||||
* @param {String} cwd - The current working directory.
|
|
||||||
* @returns {Promise} - The output from the command.
|
|
||||||
*/
|
*/
|
||||||
export async function execute(cmd: string, cwd: string): Promise<any> {
|
export function isNullOrUndefined(value: any): boolean {
|
||||||
let output = "";
|
return typeof value === "undefined" || value === null || value === "";
|
||||||
|
|
||||||
await exec(cmd, [], {
|
|
||||||
cwd,
|
|
||||||
listeners: {
|
|
||||||
stdout: (data: Buffer) => {
|
|
||||||
output += data.toString().trim();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return Promise.resolve(output);
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user