mirror of
https://github.com/Azure/k8s-set-context.git
synced 2026-06-28 18:29:26 +08:00
Compare commits
4 Commits
v1.1
..
releases/v1
| Author | SHA1 | Date | |
|---|---|---|---|
| 5e0880a462 | |||
| 61f71d5109 | |||
| 1efc794ed7 | |||
| 1245f455e5 |
@@ -0,0 +1,33 @@
|
|||||||
|
token=$1
|
||||||
|
commit=$2
|
||||||
|
repository=$3
|
||||||
|
prNumber=$4
|
||||||
|
frombranch=$5
|
||||||
|
tobranch=$6
|
||||||
|
patUser=$7
|
||||||
|
|
||||||
|
getPayLoad() {
|
||||||
|
cat <<EOF
|
||||||
|
{
|
||||||
|
"event_type": "K8sSetContextPR",
|
||||||
|
"client_payload":
|
||||||
|
{
|
||||||
|
"action": "K8sSetContext",
|
||||||
|
"commit": "$commit",
|
||||||
|
"repository": "$repository",
|
||||||
|
"prNumber": "$prNumber",
|
||||||
|
"tobranch": "$tobranch",
|
||||||
|
"frombranch": "$frombranch"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
response=$(curl -u $patUser:$token -X POST https://api.github.com/repos/Azure/azure-actions-integration-tests/dispatches --data "$(getPayLoad)")
|
||||||
|
|
||||||
|
if [ "$response" == "" ]; then
|
||||||
|
echo "Integration tests triggered successfully"
|
||||||
|
else
|
||||||
|
echo "Triggering integration tests failed with: '$response'"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
name: "Trigger Integration tests"
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- 'releases/*'
|
||||||
|
jobs:
|
||||||
|
trigger-integration-tests:
|
||||||
|
name: Trigger Integration tests
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Check out repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
path: IntegrationTests
|
||||||
|
|
||||||
|
- name: Trigger Test run
|
||||||
|
run: |
|
||||||
|
bash ./IntegrationTests/.github/workflows/TriggerIntegrationTests.sh ${{ secrets.L2_REPO_TOKEN }} ${{ github.event.pull_request.head.sha }} ${{ github.repository }} ${{ github.event.pull_request.number }} ${{ github.event.pull_request.head.ref }} ${{ github.event.pull_request.base.ref }} ${{ secrets.L2_REPO_USER }}
|
||||||
@@ -79,6 +79,7 @@ exports.getArcKubeconfig = getArcKubeconfig;
|
|||||||
function sleep(ms) {
|
function sleep(ms) {
|
||||||
return new Promise(resolve => setTimeout(resolve, ms));
|
return new Promise(resolve => setTimeout(resolve, ms));
|
||||||
}
|
}
|
||||||
|
exports.sleep = sleep;
|
||||||
function executeAzCliCommand(command, silent, execOptions = {}, args = []) {
|
function executeAzCliCommand(command, silent, execOptions = {}, args = []) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
execOptions.silent = !!silent;
|
execOptions.silent = !!silent;
|
||||||
@@ -90,3 +91,4 @@ function executeAzCliCommand(command, silent, execOptions = {}, args = []) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
exports.executeAzCliCommand = executeAzCliCommand;
|
||||||
|
|||||||
@@ -1,99 +0,0 @@
|
|||||||
"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 util = require("util");
|
|
||||||
const fs = require("fs");
|
|
||||||
const httpClient = require("typed-rest-client/HttpClient");
|
|
||||||
const core = require("@actions/core");
|
|
||||||
var httpCallbackClient = new httpClient.HttpClient('GITHUB_RUNNER', null, {});
|
|
||||||
class WebRequest {
|
|
||||||
}
|
|
||||||
exports.WebRequest = WebRequest;
|
|
||||||
class WebResponse {
|
|
||||||
}
|
|
||||||
exports.WebResponse = WebResponse;
|
|
||||||
class WebRequestOptions {
|
|
||||||
}
|
|
||||||
exports.WebRequestOptions = WebRequestOptions;
|
|
||||||
function sendRequest(request, options) {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
let i = 0;
|
|
||||||
let retryCount = options && options.retryCount ? options.retryCount : 5;
|
|
||||||
let retryIntervalInSeconds = options && options.retryIntervalInSeconds ? options.retryIntervalInSeconds : 2;
|
|
||||||
let retriableErrorCodes = options && options.retriableErrorCodes ? options.retriableErrorCodes : ["ETIMEDOUT", "ECONNRESET", "ENOTFOUND", "ESOCKETTIMEDOUT", "ECONNREFUSED", "EHOSTUNREACH", "EPIPE", "EA_AGAIN"];
|
|
||||||
let retriableStatusCodes = options && options.retriableStatusCodes ? options.retriableStatusCodes : [408, 409, 500, 502, 503, 504];
|
|
||||||
let timeToWait = retryIntervalInSeconds;
|
|
||||||
while (true) {
|
|
||||||
try {
|
|
||||||
if (request.body && typeof (request.body) !== 'string' && !request.body["readable"]) {
|
|
||||||
request.body = fs.createReadStream(request.body["path"]);
|
|
||||||
}
|
|
||||||
let response = yield sendRequestInternal(request);
|
|
||||||
if (retriableStatusCodes.indexOf(response.statusCode) != -1 && ++i < retryCount) {
|
|
||||||
core.debug(util.format("Encountered a retriable status code: %s. Message: '%s'.", response.statusCode, response.statusMessage));
|
|
||||||
yield sleepFor(timeToWait);
|
|
||||||
timeToWait = timeToWait * retryIntervalInSeconds + retryIntervalInSeconds;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
if (retriableErrorCodes.indexOf(error.code) != -1 && ++i < retryCount) {
|
|
||||||
core.debug(util.format("Encountered a retriable error:%s. Message: %s.", error.code, error.message));
|
|
||||||
yield sleepFor(timeToWait);
|
|
||||||
timeToWait = timeToWait * retryIntervalInSeconds + retryIntervalInSeconds;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (error.code) {
|
|
||||||
core.debug("error code =" + error.code);
|
|
||||||
}
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
exports.sendRequest = sendRequest;
|
|
||||||
function sleepFor(sleepDurationInSeconds) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
setTimeout(resolve, sleepDurationInSeconds * 1000);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
exports.sleepFor = sleepFor;
|
|
||||||
function sendRequestInternal(request) {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
core.debug(util.format("[%s]%s", request.method, request.uri));
|
|
||||||
var response = yield httpCallbackClient.request(request.method, request.uri, request.body, request.headers);
|
|
||||||
return yield toWebResponse(response);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
function toWebResponse(response) {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
var res = new WebResponse();
|
|
||||||
if (response) {
|
|
||||||
res.statusCode = response.message.statusCode;
|
|
||||||
res.statusMessage = response.message.statusMessage;
|
|
||||||
res.headers = response.message.headers;
|
|
||||||
var body = yield response.readBody();
|
|
||||||
if (body) {
|
|
||||||
try {
|
|
||||||
res.body = JSON.parse(body);
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
core.debug("Could not parse response: " + JSON.stringify(error));
|
|
||||||
core.debug("Response: " + JSON.stringify(res.body));
|
|
||||||
res.body = body;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
+6
-1
@@ -31,7 +31,7 @@ function getKubeconfig() {
|
|||||||
core.debug("Found clusterUrl, creating kubeconfig using certificate and token");
|
core.debug("Found clusterUrl, creating kubeconfig using certificate and token");
|
||||||
let k8sSecret = core.getInput('k8s-secret', { required: true });
|
let k8sSecret = core.getInput('k8s-secret', { required: true });
|
||||||
var parsedk8sSecret = jsyaml.safeLoad(k8sSecret);
|
var parsedk8sSecret = jsyaml.safeLoad(k8sSecret);
|
||||||
let kubernetesServiceAccountSecretFieldNotPresent = 'The service acount secret yaml does not contain %s; field. Make sure that its present and try again.';
|
let kubernetesServiceAccountSecretFieldNotPresent = 'The service account secret yaml does not contain %s; field. Make sure that its present and try again.';
|
||||||
if (!parsedk8sSecret) {
|
if (!parsedk8sSecret) {
|
||||||
throw Error("The service account secret yaml specified is invalid. Make sure that its a valid yaml and try again.");
|
throw Error("The service account secret yaml specified is invalid. Make sure that its a valid yaml and try again.");
|
||||||
}
|
}
|
||||||
@@ -71,12 +71,14 @@ function getKubeconfig() {
|
|||||||
throw Error("Invalid method specified. Acceptable values are kubeconfig and service-account.");
|
throw Error("Invalid method specified. Acceptable values are kubeconfig and service-account.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
exports.getKubeconfig = getKubeconfig;
|
||||||
function getExecutableExtension() {
|
function getExecutableExtension() {
|
||||||
if (os.type().match(/^Win/)) {
|
if (os.type().match(/^Win/)) {
|
||||||
return '.exe';
|
return '.exe';
|
||||||
}
|
}
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
exports.getExecutableExtension = getExecutableExtension;
|
||||||
function getKubectlPath() {
|
function getKubectlPath() {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
let kubectlPath = yield io.which('kubectl', false);
|
let kubectlPath = yield io.which('kubectl', false);
|
||||||
@@ -91,6 +93,7 @@ function getKubectlPath() {
|
|||||||
return kubectlPath;
|
return kubectlPath;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
exports.getKubectlPath = getKubectlPath;
|
||||||
function setContext(kubeconfigPath) {
|
function setContext(kubeconfigPath) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
let context = core.getInput('context');
|
let context = core.getInput('context');
|
||||||
@@ -105,6 +108,7 @@ function setContext(kubeconfigPath) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
exports.setContext = setContext;
|
||||||
function run() {
|
function run() {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
try {
|
try {
|
||||||
@@ -132,4 +136,5 @@ function run() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
exports.run = run;
|
||||||
run().catch(core.setFailed);
|
run().catch(core.setFailed);
|
||||||
|
|||||||
+2
-2
@@ -64,11 +64,11 @@ export async function getArcKubeconfig(): Promise<string> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function sleep(ms) {
|
export function sleep(ms) {
|
||||||
return new Promise(resolve => setTimeout(resolve, ms));
|
return new Promise(resolve => setTimeout(resolve, ms));
|
||||||
}
|
}
|
||||||
|
|
||||||
async function executeAzCliCommand(
|
export async function executeAzCliCommand(
|
||||||
command: string,
|
command: string,
|
||||||
silent?: boolean,
|
silent?: boolean,
|
||||||
execOptions: any = {},
|
execOptions: any = {},
|
||||||
|
|||||||
-103
@@ -1,103 +0,0 @@
|
|||||||
import util = require("util");
|
|
||||||
import fs = require('fs');
|
|
||||||
import httpClient = require("typed-rest-client/HttpClient");
|
|
||||||
import * as core from '@actions/core';
|
|
||||||
|
|
||||||
var httpCallbackClient = new httpClient.HttpClient('GITHUB_RUNNER', null, {});
|
|
||||||
|
|
||||||
export class WebRequest {
|
|
||||||
public method: string;
|
|
||||||
public uri: string;
|
|
||||||
// body can be string or ReadableStream
|
|
||||||
public body: string | NodeJS.ReadableStream;
|
|
||||||
public headers: any;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class WebResponse {
|
|
||||||
public statusCode: number;
|
|
||||||
public statusMessage: string;
|
|
||||||
public headers: any;
|
|
||||||
public body: any;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class WebRequestOptions {
|
|
||||||
public retriableErrorCodes?: string[];
|
|
||||||
public retryCount?: number;
|
|
||||||
public retryIntervalInSeconds?: number;
|
|
||||||
public retriableStatusCodes?: number[];
|
|
||||||
public retryRequestTimedout?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function sendRequest(request: WebRequest, options?: WebRequestOptions): Promise<WebResponse> {
|
|
||||||
let i = 0;
|
|
||||||
let retryCount = options && options.retryCount ? options.retryCount : 5;
|
|
||||||
let retryIntervalInSeconds = options && options.retryIntervalInSeconds ? options.retryIntervalInSeconds : 2;
|
|
||||||
let retriableErrorCodes = options && options.retriableErrorCodes ? options.retriableErrorCodes : ["ETIMEDOUT", "ECONNRESET", "ENOTFOUND", "ESOCKETTIMEDOUT", "ECONNREFUSED", "EHOSTUNREACH", "EPIPE", "EA_AGAIN"];
|
|
||||||
let retriableStatusCodes = options && options.retriableStatusCodes ? options.retriableStatusCodes : [408, 409, 500, 502, 503, 504];
|
|
||||||
let timeToWait: number = retryIntervalInSeconds;
|
|
||||||
while (true) {
|
|
||||||
try {
|
|
||||||
if (request.body && typeof (request.body) !== 'string' && !request.body["readable"]) {
|
|
||||||
request.body = fs.createReadStream(request.body["path"]);
|
|
||||||
}
|
|
||||||
|
|
||||||
let response: WebResponse = await sendRequestInternal(request);
|
|
||||||
if (retriableStatusCodes.indexOf(response.statusCode) != -1 && ++i < retryCount) {
|
|
||||||
core.debug(util.format("Encountered a retriable status code: %s. Message: '%s'.", response.statusCode, response.statusMessage));
|
|
||||||
await sleepFor(timeToWait);
|
|
||||||
timeToWait = timeToWait * retryIntervalInSeconds + retryIntervalInSeconds;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
if (retriableErrorCodes.indexOf(error.code) != -1 && ++i < retryCount) {
|
|
||||||
core.debug(util.format("Encountered a retriable error:%s. Message: %s.", error.code, error.message));
|
|
||||||
await sleepFor(timeToWait);
|
|
||||||
timeToWait = timeToWait * retryIntervalInSeconds + retryIntervalInSeconds;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (error.code) {
|
|
||||||
core.debug("error code =" + error.code);
|
|
||||||
}
|
|
||||||
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function sleepFor(sleepDurationInSeconds: number): Promise<any> {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
setTimeout(resolve, sleepDurationInSeconds * 1000);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async function sendRequestInternal(request: WebRequest): Promise<WebResponse> {
|
|
||||||
core.debug(util.format("[%s]%s", request.method, request.uri));
|
|
||||||
var response: httpClient.HttpClientResponse = await httpCallbackClient.request(request.method, request.uri, request.body, request.headers);
|
|
||||||
return await toWebResponse(response);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function toWebResponse(response: httpClient.HttpClientResponse): Promise<WebResponse> {
|
|
||||||
var res = new WebResponse();
|
|
||||||
if (response) {
|
|
||||||
res.statusCode = response.message.statusCode;
|
|
||||||
res.statusMessage = response.message.statusMessage;
|
|
||||||
res.headers = response.message.headers;
|
|
||||||
var body = await response.readBody();
|
|
||||||
if (body) {
|
|
||||||
try {
|
|
||||||
res.body = JSON.parse(body);
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
core.debug("Could not parse response: " + JSON.stringify(error));
|
|
||||||
core.debug("Response: " + JSON.stringify(res.body));
|
|
||||||
res.body = body;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
+6
-6
@@ -9,7 +9,7 @@ import * as jsyaml from 'js-yaml';
|
|||||||
import * as util from 'util';
|
import * as util from 'util';
|
||||||
import { getArcKubeconfig } from './arc-login';
|
import { getArcKubeconfig } from './arc-login';
|
||||||
|
|
||||||
function getKubeconfig(): string {
|
export function getKubeconfig(): string {
|
||||||
const method = core.getInput('method', { required: true });
|
const method = core.getInput('method', { required: true });
|
||||||
if (method == 'kubeconfig') {
|
if (method == 'kubeconfig') {
|
||||||
const kubeconfig = core.getInput('kubeconfig', { required: true });
|
const kubeconfig = core.getInput('kubeconfig', { required: true });
|
||||||
@@ -21,7 +21,7 @@ function getKubeconfig(): string {
|
|||||||
core.debug("Found clusterUrl, creating kubeconfig using certificate and token");
|
core.debug("Found clusterUrl, creating kubeconfig using certificate and token");
|
||||||
let k8sSecret = core.getInput('k8s-secret', { required: true });
|
let k8sSecret = core.getInput('k8s-secret', { required: true });
|
||||||
var parsedk8sSecret = jsyaml.safeLoad(k8sSecret);
|
var parsedk8sSecret = jsyaml.safeLoad(k8sSecret);
|
||||||
let kubernetesServiceAccountSecretFieldNotPresent = 'The service acount secret yaml does not contain %s; field. Make sure that its present and try again.';
|
let kubernetesServiceAccountSecretFieldNotPresent = 'The service account secret yaml does not contain %s; field. Make sure that its present and try again.';
|
||||||
if (!parsedk8sSecret) {
|
if (!parsedk8sSecret) {
|
||||||
throw Error("The service account secret yaml specified is invalid. Make sure that its a valid yaml and try again.");
|
throw Error("The service account secret yaml specified is invalid. Make sure that its a valid yaml and try again.");
|
||||||
}
|
}
|
||||||
@@ -67,7 +67,7 @@ function getKubeconfig(): string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getExecutableExtension(): string {
|
export function getExecutableExtension(): string {
|
||||||
if (os.type().match(/^Win/)) {
|
if (os.type().match(/^Win/)) {
|
||||||
return '.exe';
|
return '.exe';
|
||||||
}
|
}
|
||||||
@@ -75,7 +75,7 @@ function getExecutableExtension(): string {
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getKubectlPath() {
|
export async function getKubectlPath() {
|
||||||
let kubectlPath = await io.which('kubectl', false);
|
let kubectlPath = await io.which('kubectl', false);
|
||||||
if (!kubectlPath) {
|
if (!kubectlPath) {
|
||||||
const allVersions = toolCache.findAllVersions('kubectl');
|
const allVersions = toolCache.findAllVersions('kubectl');
|
||||||
@@ -89,7 +89,7 @@ async function getKubectlPath() {
|
|||||||
return kubectlPath;
|
return kubectlPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function setContext(kubeconfigPath: string) {
|
export async function setContext(kubeconfigPath: string) {
|
||||||
let context = core.getInput('context');
|
let context = core.getInput('context');
|
||||||
if (context) {
|
if (context) {
|
||||||
//To use kubectl commands, the environment variable KUBECONFIG needs to be set for this step
|
//To use kubectl commands, the environment variable KUBECONFIG needs to be set for this step
|
||||||
@@ -102,7 +102,7 @@ async function setContext(kubeconfigPath: string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function run() {
|
export async function run() {
|
||||||
try {
|
try {
|
||||||
let kubeconfig = '';
|
let kubeconfig = '';
|
||||||
const cluster_type = core.getInput('cluster-type', { required: true });
|
const cluster_type = core.getInput('cluster-type', { required: true });
|
||||||
|
|||||||
Reference in New Issue
Block a user