Skip to content

Commit

Permalink
Merge branch 'master' into feature/mc-fus
Browse files Browse the repository at this point in the history
  • Loading branch information
Anna Kocheshkova committed Jul 2, 2020
2 parents e82627f + f1de86a commit bad5785
Show file tree
Hide file tree
Showing 12 changed files with 54 additions and 23 deletions.
7 changes: 4 additions & 3 deletions Tasks/ACRTaskV0/operations/acrtaskclient.ts
Expand Up @@ -405,13 +405,14 @@ export class AcrTaskClient extends ServiceClient {

private getPipelineUrl(pat: string) {
const orgUrl = tl.getVariable('System.TeamFoundationCollectionUri').replace("://", `://:${pat}@`); // this would convert https://dev.azure.com/mseng to https://:pat@dev.azure.com

const project = tl.getVariable('System.TeamProjectId');

if (tl.getVariable('SYSTEM_HOSTTYPE').toLowerCase() === 'release') {
const definitionId = tl.getVariable('Release.DefinitionId');
return `${orgUrl}_apis/release/releases?api-version=5.1&definitionId=${definitionId}`
return `${orgUrl}/${project}/_apis/release/releases?api-version=6.0-preview&definitionId=${definitionId}`
} else {
const definitionId = tl.getVariable('System.DefinitionId');
return `${orgUrl}_apis/build/builds?api-version=5.1&definitionId=${definitionId}`
return `${orgUrl}/${project}/_apis/build/builds?api-version=6.0-preview&definitionId=${definitionId}`
}
}

Expand Down
2 changes: 1 addition & 1 deletion Tasks/ACRTaskV0/task.json
Expand Up @@ -15,7 +15,7 @@
"demands": [],
"version": {
"Major": 0,
"Minor": 171,
"Minor": 172,
"Patch": 0
},
"instanceNameFormat": "acrTask",
Expand Down
2 changes: 1 addition & 1 deletion Tasks/ACRTaskV0/task.loc.json
Expand Up @@ -15,7 +15,7 @@
"demands": [],
"version": {
"Major": 0,
"Minor": 171,
"Minor": 172,
"Patch": 0
},
"instanceNameFormat": "ms-resource:loc.instanceNameFormat",
Expand Down
7 changes: 5 additions & 2 deletions Tasks/CopyFilesOverSSHV0/copyfilesoverssh.ts
Expand Up @@ -131,6 +131,7 @@ async function run() {
}

const readyTimeout = getReadyTimeoutVariable();
const useFastPut: boolean = !(process.env['USE_FAST_PUT'] === 'false');

// set up the SSH connection configuration based on endpoint details
let sshConfig;
Expand All @@ -142,7 +143,8 @@ async function run() {
username: username,
privateKey: privateKey,
passphrase: password,
readyTimeout: readyTimeout
readyTimeout: readyTimeout,
useFastPut: useFastPut
}
} else {
// use password
Expand All @@ -152,7 +154,8 @@ async function run() {
port: port,
username: username,
password: password,
readyTimeout: readyTimeout
readyTimeout: readyTimeout,
useFastPut: useFastPut
}
}

Expand Down
6 changes: 5 additions & 1 deletion Tasks/CopyFilesOverSSHV0/sshhelper.ts
Expand Up @@ -103,7 +103,11 @@ export class SshHelper {
defer.reject(tl.loc('ConnectionNotSetup'));
}
try {
await this.sftpClient.put(sourceFile, dest);
if (this.sshConfig.useFastPut) {
await this.sftpClient.fastPut(sourceFile, dest);
} else {
await this.sftpClient.put(sourceFile, dest);
}
defer.resolve(dest);
} catch (err) {
defer.reject(tl.loc('UploadFileFailed', sourceFile, dest, err));
Expand Down
4 changes: 2 additions & 2 deletions Tasks/CopyFilesOverSSHV0/task.json
Expand Up @@ -18,10 +18,10 @@
"version": {
"Major": 0,
"Minor": 172,
"Patch": 0
"Patch": 1
},
"demands": [],
"minimumAgentVersion": "2.102.0",
"minimumAgentVersion": "2.144.0",
"instanceNameFormat": "Securely copy files to the remote machine",
"groups": [
{
Expand Down
4 changes: 2 additions & 2 deletions Tasks/CopyFilesOverSSHV0/task.loc.json
Expand Up @@ -18,10 +18,10 @@
"version": {
"Major": 0,
"Minor": 172,
"Patch": 0
"Patch": 1
},
"demands": [],
"minimumAgentVersion": "2.102.0",
"minimumAgentVersion": "2.144.0",
"instanceNameFormat": "ms-resource:loc.instanceNameFormat",
"groups": [
{
Expand Down
35 changes: 26 additions & 9 deletions Tasks/HelmDeployV0/Tests/TestSetup.ts
Expand Up @@ -277,17 +277,34 @@ else {
};
}

const helmGetManifestCommand = `helm get manifest ${shared.testReleaseName}`;
a.exec[helmGetManifestCommand] = {
"code": 0,
"stdout": `---\n# Source: testChartName/templates/serviceaccount.yaml\n{apiVersion: v1, kind: ServiceAccount, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}}\n---\n# Source: testChartName/templates/service.yaml\n{apiVersion: v1, kind: Service, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}, spec: {type: ClusterIP, ports: [{port: 80, targetPort: http, protocol: TCP, name: http}], selector: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}}\n---\n# Source: demo-chart/templates/deployment.yaml\n{apiVersion: apps/v1, kind: Deployment, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}, spec: {replicas: 1, selector: {matchLabels: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}, template: {metadata: {labels: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}, spec: {serviceAccountName: testReleaseName-testChartName, securityContext: {}, containers: [{name: testChartName, securityContext: {}, image: "testImage:1.17.0", imagePullPolicy: Always, ports: [{name: http, containerPort: 80, protocol: TCP}], livenessProbe: {httpGet: {path: /, port: http}}, readinessProbe: {httpGet: {path: /, port: http}}, resources: {}}]}}}}\n`
}
if (process.env[shared.TestEnvVars.namespace]) {
const helmGetManifestCommand = `helm get manifest ${shared.testReleaseName} --namespace ${process.env[shared.TestEnvVars.namespace]}`;
a.exec[helmGetManifestCommand] = {
"code": 0,
"stdout": `---\n# Source: testChartName/templates/serviceaccount.yaml\n{apiVersion: v1, kind: ServiceAccount, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}}\n---\n# Source: testChartName/templates/service.yaml\n{apiVersion: v1, kind: Service, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}, spec: {type: ClusterIP, ports: [{port: 80, targetPort: http, protocol: TCP, name: http}], selector: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}}\n---\n# Source: demo-chart/templates/deployment.yaml\n{apiVersion: apps/v1, kind: Deployment, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}, spec: {replicas: 1, selector: {matchLabels: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}, template: {metadata: {labels: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}, spec: {serviceAccountName: testReleaseName-testChartName, securityContext: {}, containers: [{name: testChartName, securityContext: {}, image: "testImage:1.17.0", imagePullPolicy: Always, ports: [{name: http, containerPort: 80, protocol: TCP}], livenessProbe: {httpGet: {path: /, port: http}}, readinessProbe: {httpGet: {path: /, port: http}}, resources: {}}]}}}}\n`
}

const kubectlGetPods = "kubectl get pods -o json";
a.exec[kubectlGetPods] = {
"code": 0,
"stdout": `{"apiVersion":"v1","items":[{"apiVersion":"v1","kind":"Pod","metadata":{"creationTimestamp":"2020-06-10T18:20:57Z","generateName":"testReleaseName-testChartName-7966fd9bdb-","labels":{"app":"demo","pod-template-hash":"7966fd9bdb"},"name":"testReleaseName-testChartName-7966fd9bdb-wvz9w","namespace":"default","ownerReferences":[{"apiVersion":"apps/v1","blockOwnerDeletion":true,"controller":true,"kind":"ReplicaSet","name":"testReleaseName-testChartName-7966fd9bdb","uid":"ceb16411-6edc-4598-827e-027e8c68304e"}],"resourceVersion":"987","selfLink":"/api/v1/namespaces/default/pods/testReleaseName-testChartName-7966fd9bdb-wvz9w","uid":"ac838bab-a280-4189-b3e9-45bf9d8df920"},"spec":{"containers":[{"image":"nginx:latest","imagePullPolicy":"Always","name":"demo-cont","ports":[{"containerPort":80,"protocol":"TCP"}],"resources":{},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"File","volumeMounts":[{"mountPath":"/var/run/secrets/kubernetes.io/serviceaccount","name":"default-token-xp8jh","readOnly":true}]}],"dnsPolicy":"ClusterFirst","enableServiceLinks":true,"nodeName":"minikube","priority":0,"restartPolicy":"Always","schedulerName":"default-scheduler","securityContext":{},"serviceAccount":"default","serviceAccountName":"default","terminationGracePeriodSeconds":30,"tolerations":[{"effect":"NoExecute","key":"node.kubernetes.io/not-ready","operator":"Exists","tolerationSeconds":300},{"effect":"NoExecute","key":"node.kubernetes.io/unreachable","operator":"Exists","tolerationSeconds":300}],"volumes":[{"name":"default-token-xp8jh","secret":{"defaultMode":420,"secretName":"default-token-xp8jh"}}]},"status":{"conditions":[{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:20:57Z","status":"True","type":"Initialized"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:21:21Z","status":"True","type":"Ready"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:21:21Z","status":"True","type":"ContainersReady"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:20:57Z","status":"True","type":"PodScheduled"}],"containerStatuses":[{"containerID":"docker://9be62c1a895983aefde3b62c33f12a692ab3749fd841a1f9b7c813b4246d1ac7","image":"nginx:latest","imageID":"docker-pullable://nginx@sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133","lastState":{},"name":"demo-cont","ready":true,"restartCount":0,"started":true,"state":{"running":{"startedAt":"2020-06-10T18:21:20Z"}}}],"hostIP":"192.168.105.196","phase":"Running","podIP":"172.17.0.6","podIPs":[{"ip":"172.17.0.6"}],"qosClass":"BestEffort","startTime":"2020-06-10T18:20:57Z"}}],"kind":"List","metadata":{"resourceVersion":"","selfLink":""}}\n`
const kubectlGetPods = `kubectl get pods -o json --namespace ${process.env[shared.TestEnvVars.namespace]}`;
a.exec[kubectlGetPods] = {
"code": 0,
"stdout": `{"apiVersion":"v1","items":[{"apiVersion":"v1","kind":"Pod","metadata":{"creationTimestamp":"2020-06-10T18:20:57Z","generateName":"testReleaseName-testChartName-7966fd9bdb-","labels":{"app":"demo","pod-template-hash":"7966fd9bdb"},"name":"testReleaseName-testChartName-7966fd9bdb-wvz9w","namespace":"default","ownerReferences":[{"apiVersion":"apps/v1","blockOwnerDeletion":true,"controller":true,"kind":"ReplicaSet","name":"testReleaseName-testChartName-7966fd9bdb","uid":"ceb16411-6edc-4598-827e-027e8c68304e"}],"resourceVersion":"987","selfLink":"/api/v1/namespaces/default/pods/testReleaseName-testChartName-7966fd9bdb-wvz9w","uid":"ac838bab-a280-4189-b3e9-45bf9d8df920"},"spec":{"containers":[{"image":"nginx:latest","imagePullPolicy":"Always","name":"demo-cont","ports":[{"containerPort":80,"protocol":"TCP"}],"resources":{},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"File","volumeMounts":[{"mountPath":"/var/run/secrets/kubernetes.io/serviceaccount","name":"default-token-xp8jh","readOnly":true}]}],"dnsPolicy":"ClusterFirst","enableServiceLinks":true,"nodeName":"minikube","priority":0,"restartPolicy":"Always","schedulerName":"default-scheduler","securityContext":{},"serviceAccount":"default","serviceAccountName":"default","terminationGracePeriodSeconds":30,"tolerations":[{"effect":"NoExecute","key":"node.kubernetes.io/not-ready","operator":"Exists","tolerationSeconds":300},{"effect":"NoExecute","key":"node.kubernetes.io/unreachable","operator":"Exists","tolerationSeconds":300}],"volumes":[{"name":"default-token-xp8jh","secret":{"defaultMode":420,"secretName":"default-token-xp8jh"}}]},"status":{"conditions":[{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:20:57Z","status":"True","type":"Initialized"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:21:21Z","status":"True","type":"Ready"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:21:21Z","status":"True","type":"ContainersReady"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:20:57Z","status":"True","type":"PodScheduled"}],"containerStatuses":[{"containerID":"docker://9be62c1a895983aefde3b62c33f12a692ab3749fd841a1f9b7c813b4246d1ac7","image":"nginx:latest","imageID":"docker-pullable://nginx@sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133","lastState":{},"name":"demo-cont","ready":true,"restartCount":0,"started":true,"state":{"running":{"startedAt":"2020-06-10T18:21:20Z"}}}],"hostIP":"192.168.105.196","phase":"Running","podIP":"172.17.0.6","podIPs":[{"ip":"172.17.0.6"}],"qosClass":"BestEffort","startTime":"2020-06-10T18:20:57Z"}}],"kind":"List","metadata":{"resourceVersion":"","selfLink":""}}\n`
}
}
else {
const helmGetManifestCommand = `helm get manifest ${shared.testReleaseName}`;
a.exec[helmGetManifestCommand] = {
"code": 0,
"stdout": `---\n# Source: testChartName/templates/serviceaccount.yaml\n{apiVersion: v1, kind: ServiceAccount, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}}\n---\n# Source: testChartName/templates/service.yaml\n{apiVersion: v1, kind: Service, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}, spec: {type: ClusterIP, ports: [{port: 80, targetPort: http, protocol: TCP, name: http}], selector: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}}\n---\n# Source: demo-chart/templates/deployment.yaml\n{apiVersion: apps/v1, kind: Deployment, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}, spec: {replicas: 1, selector: {matchLabels: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}, template: {metadata: {labels: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}, spec: {serviceAccountName: testReleaseName-testChartName, securityContext: {}, containers: [{name: testChartName, securityContext: {}, image: "testImage:1.17.0", imagePullPolicy: Always, ports: [{name: http, containerPort: 80, protocol: TCP}], livenessProbe: {httpGet: {path: /, port: http}}, readinessProbe: {httpGet: {path: /, port: http}}, resources: {}}]}}}}\n`
}

const kubectlGetPods = "kubectl get pods -o json";
a.exec[kubectlGetPods] = {
"code": 0,
"stdout": `{"apiVersion":"v1","items":[{"apiVersion":"v1","kind":"Pod","metadata":{"creationTimestamp":"2020-06-10T18:20:57Z","generateName":"testReleaseName-testChartName-7966fd9bdb-","labels":{"app":"demo","pod-template-hash":"7966fd9bdb"},"name":"testReleaseName-testChartName-7966fd9bdb-wvz9w","namespace":"default","ownerReferences":[{"apiVersion":"apps/v1","blockOwnerDeletion":true,"controller":true,"kind":"ReplicaSet","name":"testReleaseName-testChartName-7966fd9bdb","uid":"ceb16411-6edc-4598-827e-027e8c68304e"}],"resourceVersion":"987","selfLink":"/api/v1/namespaces/default/pods/testReleaseName-testChartName-7966fd9bdb-wvz9w","uid":"ac838bab-a280-4189-b3e9-45bf9d8df920"},"spec":{"containers":[{"image":"nginx:latest","imagePullPolicy":"Always","name":"demo-cont","ports":[{"containerPort":80,"protocol":"TCP"}],"resources":{},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"File","volumeMounts":[{"mountPath":"/var/run/secrets/kubernetes.io/serviceaccount","name":"default-token-xp8jh","readOnly":true}]}],"dnsPolicy":"ClusterFirst","enableServiceLinks":true,"nodeName":"minikube","priority":0,"restartPolicy":"Always","schedulerName":"default-scheduler","securityContext":{},"serviceAccount":"default","serviceAccountName":"default","terminationGracePeriodSeconds":30,"tolerations":[{"effect":"NoExecute","key":"node.kubernetes.io/not-ready","operator":"Exists","tolerationSeconds":300},{"effect":"NoExecute","key":"node.kubernetes.io/unreachable","operator":"Exists","tolerationSeconds":300}],"volumes":[{"name":"default-token-xp8jh","secret":{"defaultMode":420,"secretName":"default-token-xp8jh"}}]},"status":{"conditions":[{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:20:57Z","status":"True","type":"Initialized"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:21:21Z","status":"True","type":"Ready"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:21:21Z","status":"True","type":"ContainersReady"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:20:57Z","status":"True","type":"PodScheduled"}],"containerStatuses":[{"containerID":"docker://9be62c1a895983aefde3b62c33f12a692ab3749fd841a1f9b7c813b4246d1ac7","image":"nginx:latest","imageID":"docker-pullable://nginx@sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133","lastState":{},"name":"demo-cont","ready":true,"restartCount":0,"started":true,"state":{"running":{"startedAt":"2020-06-10T18:21:20Z"}}}],"hostIP":"192.168.105.196","phase":"Running","podIP":"172.17.0.6","podIPs":[{"ip":"172.17.0.6"}],"qosClass":"BestEffort","startTime":"2020-06-10T18:20:57Z"}}],"kind":"List","metadata":{"resourceVersion":"","selfLink":""}}\n`
}
}



const kubectlClusterInfo = "kubectl cluster-info";
a.exec[kubectlClusterInfo] = {
Expand Down
3 changes: 3 additions & 0 deletions Tasks/HelmDeployV0/src/kubernetescli.ts
Expand Up @@ -5,6 +5,7 @@ import basecommand from "./basecommand"

const EXIT_CODE_SUCCESS = 0;
const EXIT_CODE_FAILURE = 2;
const namespace = tl.getInput('namespace');

export default class kubernetescli extends basecommand {

Expand Down Expand Up @@ -54,6 +55,8 @@ export default class kubernetescli extends basecommand {
command.arg('get');
command.arg('pods');
command.arg(['-o', 'json']);
if (namespace)
command.arg(['--namespace', namespace]);
return this.execCommandSync(command, { silent: true } as tr.IExecOptions);
}

Expand Down
3 changes: 3 additions & 0 deletions Tasks/HelmDeployV0/src/utils.ts
Expand Up @@ -11,6 +11,7 @@ import helmcli from "./helmcli";

const matchPatternForReleaseName = new RegExp(/NAME:(.+)/i);
const rootFolder = tl.getVariable('System.DefaultWorkingDirectory');
const namespace = tl.getInput('namespace', false);

export function getTempDirectory(): string {
return tl.getVariable('agent.tempDirectory') || os.tmpdir();
Expand Down Expand Up @@ -70,6 +71,8 @@ export function getManifestsFromRelease(helmCli: helmcli, releaseName: string):
helmCli.setCommand('get');
helmCli.addArgument('manifest');
helmCli.addArgument(releaseName);
if (namespace)
helmCli.addArgument('--namespace '.concat(namespace));

const execResult = helmCli.execHelmCommand(true);
yaml.safeLoadAll(execResult.stdout, (doc) => {
Expand Down
2 changes: 1 addition & 1 deletion Tasks/HelmDeployV0/task.json
Expand Up @@ -14,7 +14,7 @@
"version": {
"Major": 0,
"Minor": 172,
"Patch": 2
"Patch": 3
},
"demands": [],
"groups": [
Expand Down
2 changes: 1 addition & 1 deletion Tasks/HelmDeployV0/task.loc.json
Expand Up @@ -14,7 +14,7 @@
"version": {
"Major": 0,
"Minor": 172,
"Patch": 2
"Patch": 3
},
"demands": [],
"groups": [
Expand Down

0 comments on commit bad5785

Please sign in to comment.