From b0b6f870bbab4c9a06d1d19fde994e778dd8f64f Mon Sep 17 00:00:00 2001 From: Arun Sathiya Date: Thu, 18 Jan 2024 15:08:41 -0800 Subject: [PATCH 1/4] ci: Use GITHUB_OUTPUT envvar instead of set-output command `save-state` and `set-output` commands used in GitHub Actions are deprecated and [GitHub recommends using environment files](https://github.blog/changelog/2023-07-24-github-actions-update-on-save-state-and-set-output-commands/). This PR updates the usage of `set-output` to `$GITHUB_OUTPUT` Instructions for envvar usage from GitHub docs: https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-an-output-parameter --- .github/workflows/build-vsix.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-vsix.yml b/.github/workflows/build-vsix.yml index 85712321..2141aed7 100644 --- a/.github/workflows/build-vsix.yml +++ b/.github/workflows/build-vsix.yml @@ -235,7 +235,7 @@ jobs: # - name: Get the version # id: version -# run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//} +# run: echo "VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_OUTPUT # shell: bash # # - uses: apexskier/github-semver-parse@671ddf80785e4d721e76723ec1e687317f85bfe9 # pin@v1 From 505b4f7c9231bb9524ea24314d465f644f4714f7 Mon Sep 17 00:00:00 2001 From: Kingdon P Barrett Date: Sat, 20 Jan 2024 10:56:25 -0500 Subject: [PATCH 2/4] fix CHANGELOG.md Signed-off-by: Kingdon P Barrett --- CHANGELOG.md | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f7b8d7d..1c41c227 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,69 @@ See [releases](https://github.com/weaveworks/vscode-gitops-tools/releases) for s The current release notes are always published on the Releases page, by automation. This `CHANGELOG` is manually curated by a release engineer from those notes for house-keeping. +# v0.27.0 + +* Roll back to pre-0.25.x codebase (#504) + +# v0.26.0 + +* Add 'run flux install ?' confirmation dialog (#498) +* Support WGE features with an enablement in Extension Settings (#496) + +# v0.25.4 + +* Fix spawning and not killing `kubectl proxy` processes (#491) +* Recommend settings for log viewer (#487) + +# v0.25.3 + +* Merge pull request for weaveworks/rebase-0.25-edge (#484) +* Upgrade @vscode/extension-telemetry +* Bump vscode engine version +* Pin extension telemetry @ 0.6.x until we can resolve #477 +* Added kubectl apply right-click option and keyboard shortcut for open file +* Remove extraneous console.log in case of performance impact +* Refactoring toolkitNode +* Added loading spinners to "Loading..." +* No icons for nested namespaces +* Update node labels after refresh + +# v0.25.2 + +* Live update for all flux types and UI fixes (#479) + +# v0.25.1 + +* README for release (#473) +* Add a hard timeout for all processes we spawn (#460) +* Add timeout configuration to GitOps Tools preferences +* Allow users to disable running `flux check` in GitOps Tools preferences +* Now works with Loft.sh (resolving HelmRelease APIService name conflict) +* Refactor data providers to not break on context switches +* Optimizing k8s proxy connections +* Remove debug console.log +* Expand all for workloads, sources +* Namespace UI improvements +* Update github actions workflows, Kind, Kubernetes version for testing +* Responsive UI tested with oidc-login +* Kubectl api-resources controls async resource treeview loading +* Edge rebase @ 0.25.1-edge.7 (#463) + +# v0.25.0 + +* Major enhancement: fork and exec/kubectl CLI is mostly removed from the main process flow. + * Reactive ui with client-node and kubectl proxy (#446) + * Closes #422 - Fork and exec is dangerous and slow +* Refactor: treeview Sources/Workloads organization and code has been majorly reorganized. +* Update dependencies (#449) +* Reconcile with Source (#444) +* Clean up Kubernetes list types (#443) +* Improve code layout and use baseUrl for imports (#442) + +# v0.24.3 + +* Fix webview dispose bug and createSecret bug (#439) + # v0.24.2 * Fix YouTube link in README (#436) From 5db24d916c7dde14013743f55c3909d153912318 Mon Sep 17 00:00:00 2001 From: Kingdon P Barrett Date: Sat, 20 Jan 2024 10:59:18 -0500 Subject: [PATCH 3/4] Revert "Merge branch 'main' into rollback-try-two" This reverts commit 54c788b50414674393712d7cc4d4578b52506f52, reversing changes made to 505b4f7c9231bb9524ea24314d465f644f4714f7. --- .github/workflows/build-vsix.yml | 22 +- .github/workflows/ci.yml | 14 +- .vscode/settings.json | 6 +- CONTRIBUTING.md => DEVELOPMENT.md | 0 README.md | 45 +- docs/images/config-enable-wge.png | Bin 25406 -> 0 bytes docs/images/vscode-templates-config.png | Bin 0 -> 51951 bytes docs/images/weave-gitops-treeview.png | Bin 222645 -> 0 bytes package-lock.json | 2186 ++++++----------- package.json | 302 +-- src/{cli => }/azure/azurePrereqs.ts | 5 +- src/{cli => }/azure/azureTools.ts | 55 +- src/{cli => }/azure/getAzureMetadata.ts | 22 +- src/cli/kubernetes/apiResources.ts | 107 - src/cli/kubernetes/clusterProvider.ts | 104 - src/cli/kubernetes/kubectlGet.ts | 223 -- src/cli/kubernetes/kubectlGetNamespace.ts | 44 - src/cli/kubernetes/kubectlProxy.ts | 78 - src/cli/kubernetes/kubernetesConfig.ts | 113 - src/cli/kubernetes/kubernetesConfigWatcher.ts | 85 - src/cli/kubernetes/kubernetesToolsKubectl.ts | 94 - src/commands.ts | 181 ++ src/commands/addKustomization.ts | 6 +- src/commands/addSource.ts | 2 +- src/commands/commands.ts | 142 -- src/commands/copyResourceName.ts | 5 +- src/commands/createFromTemplate.ts | 5 +- src/commands/createGitRepositoryForPath.ts | 12 +- src/commands/createKustomizationForPath.ts | 13 +- src/commands/createSource.ts | 3 +- src/commands/deleteSource.ts | 45 +- src/commands/deleteWorkload.ts | 40 +- src/commands/enableDisableGitOps.ts | 71 +- src/commands/expandAll.ts | 9 - src/commands/fluxCheck.ts | 9 +- src/commands/fluxCheckPrerequisites.ts | 2 +- .../fluxReconcileGitRepositoryForPath.ts | 7 +- src/commands/fluxReconcileSource.ts | 28 +- src/commands/fluxReconcileWorkload.ts | 25 +- src/commands/installFluxCli.ts | 20 +- src/commands/kubectlApply.ts | 21 - src/commands/openInWgePortal.ts | 24 - src/commands/openResource.ts | 14 +- src/commands/pipelineAutoPromotion.ts | 14 - src/commands/pullGitRepository.ts | 21 +- src/commands/refreshTreeViews.ts | 37 - src/commands/resume.ts | 61 +- src/commands/setClusterProvider.ts | 29 +- src/commands/setContextToGops.ts | 40 - src/commands/setCurrentKubernetesContext.ts | 11 +- src/commands/showGlobalState.ts | 2 +- src/commands/showInstalledVersions.ts | 7 +- src/commands/showLogs.ts | 57 +- src/commands/showNewUserGuide.ts | 5 +- src/commands/suspend.ts | 59 +- src/commands/trace.ts | 22 +- src/data/contextData.ts | 114 - src/data/telemetry.ts | 100 - src/{types => }/errorable.ts | 16 - src/extension.ts | 98 +- src/extensionContext.ts | 27 + src/extensionState.ts | 29 + src/{types => }/fileTypes.ts | 0 src/{cli => }/flux/cliArgs.ts | 0 src/{cli => }/flux/fluxTools.ts | 60 +- .../fluxCliTypes.ts => flux/fluxTypes.ts} | 0 src/{cli => }/flux/fluxUtils.ts | 2 +- src/{cli => }/git/gitInfo.ts | 18 +- src/{data => }/globalState.ts | 3 +- src/index.d.ts | 2 - src/{cli/checkVersions.ts => install.ts} | 77 +- src/k8s/client.ts | 26 - src/k8s/createKubeProxyConfig.ts | 32 - src/k8s/informers.ts | 76 - src/k8s/list.ts | 65 - src/kuberesources.ts | 42 + src/kubernetes/kubernetesTools.ts | 625 +++++ .../kubernetesUtils.ts} | 2 +- src/{ => kubernetes}/types/flux/bucket.ts | 21 +- src/kubernetes/types/flux/gitOpsTemplate.ts | 39 + .../types/flux/gitRepository.ts | 20 +- .../types/flux/helmRelease.ts | 31 +- .../types/flux/helmRepository.ts | 21 +- .../types/flux/kustomize.ts} | 25 +- src/kubernetes/types/flux/object.ts | 25 + .../types/flux/ociRepository.ts | 21 +- src/kubernetes/types/kubernetesConfig.ts | 47 + .../types}/kubernetesFileSchemes.ts | 0 src/kubernetes/types/kubernetesTypes.ts | 550 +++++ src/{cli/shell => }/output.ts | 0 src/{cli/shell/exec.ts => shell.ts} | 84 +- src/{ui => }/statusBar.ts | 9 +- .../telemetryEventNames.ts => telemetry.ts} | 106 +- src/{cli/shell => }/terminal.ts | 5 +- src/test/runTest.ts | 6 +- src/test/suite/extension.test.ts | 96 +- src/types/extensionIds.ts | 101 - src/types/flux/artifact.ts | 33 - src/types/flux/canary.ts | 231 -- src/types/flux/gitOpsCluster.ts | 13 - src/types/flux/gitOpsTemplate.ts | 27 - src/types/flux/gitopsset.ts | 133 - src/types/flux/object.ts | 28 - src/types/flux/pipeline.ts | 109 - src/types/kubernetes/clusterProvider.ts | 42 - src/types/kubernetes/kubernetesTypes.ts | 111 - src/types/showLogsTypes.ts | 28 - src/ui/icons.ts | 42 - src/ui/promptToInstallFlux.ts | 34 - .../dataProviders/asyncDataProvider.ts | 84 - .../dataProviders/clusterDataProvider.ts | 63 - .../kubernetesObjectDataProvider.ts | 134 - .../dataProviders/simpleDataProvider.ts | 98 - .../dataProviders/sourceDataProvider.ts | 66 - .../dataProviders/wgeDataProvider.ts | 78 - .../dataProviders/workloadDataProvider.ts | 57 - src/ui/treeviews/nodes/anyResourceNode.ts | 23 - src/ui/treeviews/nodes/cluster/clusterNode.ts | 234 -- .../nodes/cluster/clusterTreeNode.ts | 8 - .../treeviews/nodes/kubernetesObjectNode.ts | 74 - src/ui/treeviews/nodes/makeTreeNode.ts | 45 - src/ui/treeviews/nodes/namespaceNode.ts | 64 - src/ui/treeviews/nodes/source/bucketNode.ts | 12 - .../nodes/source/gitRepositoryNode.ts | 9 - .../nodes/source/helmRepositoryNode.ts | 9 - .../nodes/source/ociRepositoryNode.ts | 18 - src/ui/treeviews/nodes/source/sourceNode.ts | 29 - src/ui/treeviews/nodes/toolkitNode.ts | 103 - src/ui/treeviews/nodes/wge/canaryNode.ts | 64 - src/ui/treeviews/nodes/wge/environmentNode.ts | 94 - src/ui/treeviews/nodes/wge/gitOpsSetNode.ts | 36 - .../treeviews/nodes/wge/gitOpsTemplateNode.ts | 76 - src/ui/treeviews/nodes/wge/pipelineNode.ts | 62 - src/ui/treeviews/nodes/wge/wgeNodes.ts | 106 - .../nodes/workload/helmReleaseNode.ts | 59 - .../nodes/workload/kustomizationNode.ts | 56 - .../treeviews/nodes/workload/workloadNode.ts | 14 - src/ui/treeviews/treeViews.ts | 236 -- .../configureGitOps/lib/createGeneric.ts | 30 - src/utils/asAbsolutePath.ts | 7 - src/utils/fsUtils.ts | 5 +- src/utils/getResourceUri.ts | 56 - src/utils/jsonUtils.ts | 13 +- src/utils/kubeConfigCompare.ts | 27 - src/utils/makeTreeviewInfoNode.ts | 44 - src/utils/markdownUtils.ts | 166 +- src/utils/namespacedFluxObject.ts | 13 - src/utils/treeNodeUtils.ts | 86 - src/utils/utils.ts | 5 - .../dataProviders/clusterDataProvider.ts | 169 ++ src/views/dataProviders/dataProvider.ts | 93 + .../documentationDataProvider.ts | 10 +- src/views/dataProviders/sourceDataProvider.ts | 73 + .../dataProviders/templateDataProvider.ts | 22 + .../dataProviders/workloadDataProvider.ts | 188 ++ .../documentationConfig.ts | 0 src/views/nodes/anyResourceNode.ts | 26 + src/views/nodes/bucketNode.ts | 28 + src/views/nodes/clusterContextNode.ts | 158 ++ .../nodes}/clusterDeploymentNode.ts | 19 +- .../nodes/documentationNode.ts | 8 +- src/views/nodes/gitOpsTemplateNode.ts | 39 + src/views/nodes/gitRepositoryNode.ts | 33 + src/views/nodes/helmReleaseNode.ts | 36 + src/views/nodes/helmRepositoryNode.ts | 33 + src/views/nodes/kustomizationNode.ts | 34 + src/views/nodes/namespaceNode.ts | 25 + src/{types => views/nodes}/nodeContext.ts | 11 +- src/views/nodes/ociRepositoryNode.ts | 33 + src/views/nodes/sourceNode.ts | 92 + src/{ui/treeviews => views}/nodes/treeNode.ts | 157 +- src/views/nodes/workloadNode.ts | 97 + src/views/treeViews.ts | 199 ++ src/views/views.ts | 10 + src/vscodeContext.ts | 31 + .../webviews => webview-backend}/README.md | 0 .../WebviewBackend.ts | 6 +- .../configureGitOps/actions.ts | 4 +- .../configureGitOps/lib/createAzure.ts | 41 +- .../configureGitOps/lib/createGeneric.ts | 29 + .../configureGitOps/lib/exportGeneric.ts | 12 +- .../configureGitOps/openWebview.ts | 48 +- .../configureGitOps/receiveMessage.ts | 1 - .../createFromTemplate/openWebview.ts | 7 +- .../createFromTemplate/receiveMessage.ts | 7 +- .../types.ts} | 7 +- tsconfig.json | 3 +- tslint-imports.json | 11 - webpack.config.js | 7 - webview-ui/configureGitOps/package-lock.json | 28 +- .../src/components/Source/NewSource.tsx | 2 +- .../Source/NewSource/HelmRepository.tsx | 2 +- .../HelmRepository/HelmConnection.tsx | 2 +- webview-ui/configureGitOps/src/lib/model.ts | 20 +- .../createFromTemplate/package-lock.json | 12 +- 195 files changed, 4934 insertions(+), 7408 deletions(-) rename CONTRIBUTING.md => DEVELOPMENT.md (100%) delete mode 100644 docs/images/config-enable-wge.png create mode 100644 docs/images/vscode-templates-config.png delete mode 100644 docs/images/weave-gitops-treeview.png rename src/{cli => }/azure/azurePrereqs.ts (96%) rename src/{cli => }/azure/azureTools.ts (90%) rename src/{cli => }/azure/getAzureMetadata.ts (85%) delete mode 100644 src/cli/kubernetes/apiResources.ts delete mode 100644 src/cli/kubernetes/clusterProvider.ts delete mode 100644 src/cli/kubernetes/kubectlGet.ts delete mode 100644 src/cli/kubernetes/kubectlGetNamespace.ts delete mode 100644 src/cli/kubernetes/kubectlProxy.ts delete mode 100644 src/cli/kubernetes/kubernetesConfig.ts delete mode 100644 src/cli/kubernetes/kubernetesConfigWatcher.ts delete mode 100644 src/cli/kubernetes/kubernetesToolsKubectl.ts create mode 100644 src/commands.ts delete mode 100644 src/commands/commands.ts delete mode 100644 src/commands/expandAll.ts delete mode 100644 src/commands/kubectlApply.ts delete mode 100644 src/commands/openInWgePortal.ts delete mode 100644 src/commands/pipelineAutoPromotion.ts delete mode 100644 src/commands/refreshTreeViews.ts delete mode 100644 src/commands/setContextToGops.ts delete mode 100644 src/data/contextData.ts delete mode 100644 src/data/telemetry.ts rename src/{types => }/errorable.ts (51%) create mode 100644 src/extensionContext.ts create mode 100644 src/extensionState.ts rename src/{types => }/fileTypes.ts (100%) rename src/{cli => }/flux/cliArgs.ts (100%) rename src/{cli => }/flux/fluxTools.ts (80%) rename src/{types/fluxCliTypes.ts => flux/fluxTypes.ts} (100%) rename src/{cli => }/flux/fluxUtils.ts (95%) rename src/{cli => }/git/gitInfo.ts (88%) rename src/{data => }/globalState.ts (96%) rename src/{cli/checkVersions.ts => install.ts} (64%) delete mode 100644 src/k8s/client.ts delete mode 100644 src/k8s/createKubeProxyConfig.ts delete mode 100644 src/k8s/informers.ts delete mode 100644 src/k8s/list.ts create mode 100644 src/kuberesources.ts create mode 100644 src/kubernetes/kubernetesTools.ts rename src/{utils/sortByMetadataName.ts => kubernetes/kubernetesUtils.ts} (82%) rename src/{ => kubernetes}/types/flux/bucket.ts (78%) create mode 100644 src/kubernetes/types/flux/gitOpsTemplate.ts rename src/{ => kubernetes}/types/flux/gitRepository.ts (87%) rename src/{ => kubernetes}/types/flux/helmRelease.ts (94%) rename src/{ => kubernetes}/types/flux/helmRepository.ts (77%) rename src/{types/flux/kustomization.ts => kubernetes/types/flux/kustomize.ts} (91%) create mode 100644 src/kubernetes/types/flux/object.ts rename src/{ => kubernetes}/types/flux/ociRepository.ts (82%) create mode 100644 src/kubernetes/types/kubernetesConfig.ts rename src/{types/kubernetes => kubernetes/types}/kubernetesFileSchemes.ts (100%) create mode 100644 src/kubernetes/types/kubernetesTypes.ts rename src/{cli/shell => }/output.ts (100%) rename src/{cli/shell/exec.ts => shell.ts} (69%) rename src/{ui => }/statusBar.ts (81%) rename src/{types/telemetryEventNames.ts => telemetry.ts} (62%) rename src/{cli/shell => }/terminal.ts (92%) delete mode 100644 src/types/extensionIds.ts delete mode 100644 src/types/flux/artifact.ts delete mode 100644 src/types/flux/canary.ts delete mode 100644 src/types/flux/gitOpsCluster.ts delete mode 100644 src/types/flux/gitOpsTemplate.ts delete mode 100644 src/types/flux/gitopsset.ts delete mode 100644 src/types/flux/object.ts delete mode 100644 src/types/flux/pipeline.ts delete mode 100644 src/types/kubernetes/clusterProvider.ts delete mode 100644 src/types/kubernetes/kubernetesTypes.ts delete mode 100644 src/types/showLogsTypes.ts delete mode 100644 src/ui/icons.ts delete mode 100644 src/ui/promptToInstallFlux.ts delete mode 100644 src/ui/treeviews/dataProviders/asyncDataProvider.ts delete mode 100644 src/ui/treeviews/dataProviders/clusterDataProvider.ts delete mode 100644 src/ui/treeviews/dataProviders/kubernetesObjectDataProvider.ts delete mode 100644 src/ui/treeviews/dataProviders/simpleDataProvider.ts delete mode 100644 src/ui/treeviews/dataProviders/sourceDataProvider.ts delete mode 100644 src/ui/treeviews/dataProviders/wgeDataProvider.ts delete mode 100644 src/ui/treeviews/dataProviders/workloadDataProvider.ts delete mode 100644 src/ui/treeviews/nodes/anyResourceNode.ts delete mode 100644 src/ui/treeviews/nodes/cluster/clusterNode.ts delete mode 100644 src/ui/treeviews/nodes/cluster/clusterTreeNode.ts delete mode 100644 src/ui/treeviews/nodes/kubernetesObjectNode.ts delete mode 100644 src/ui/treeviews/nodes/makeTreeNode.ts delete mode 100644 src/ui/treeviews/nodes/namespaceNode.ts delete mode 100644 src/ui/treeviews/nodes/source/bucketNode.ts delete mode 100644 src/ui/treeviews/nodes/source/gitRepositoryNode.ts delete mode 100644 src/ui/treeviews/nodes/source/helmRepositoryNode.ts delete mode 100644 src/ui/treeviews/nodes/source/ociRepositoryNode.ts delete mode 100644 src/ui/treeviews/nodes/source/sourceNode.ts delete mode 100644 src/ui/treeviews/nodes/toolkitNode.ts delete mode 100644 src/ui/treeviews/nodes/wge/canaryNode.ts delete mode 100644 src/ui/treeviews/nodes/wge/environmentNode.ts delete mode 100644 src/ui/treeviews/nodes/wge/gitOpsSetNode.ts delete mode 100644 src/ui/treeviews/nodes/wge/gitOpsTemplateNode.ts delete mode 100644 src/ui/treeviews/nodes/wge/pipelineNode.ts delete mode 100644 src/ui/treeviews/nodes/wge/wgeNodes.ts delete mode 100644 src/ui/treeviews/nodes/workload/helmReleaseNode.ts delete mode 100644 src/ui/treeviews/nodes/workload/kustomizationNode.ts delete mode 100644 src/ui/treeviews/nodes/workload/workloadNode.ts delete mode 100644 src/ui/treeviews/treeViews.ts delete mode 100644 src/ui/webviews/configureGitOps/lib/createGeneric.ts delete mode 100644 src/utils/asAbsolutePath.ts delete mode 100644 src/utils/getResourceUri.ts delete mode 100644 src/utils/kubeConfigCompare.ts delete mode 100644 src/utils/makeTreeviewInfoNode.ts delete mode 100644 src/utils/namespacedFluxObject.ts delete mode 100644 src/utils/treeNodeUtils.ts create mode 100644 src/views/dataProviders/clusterDataProvider.ts create mode 100644 src/views/dataProviders/dataProvider.ts rename src/{ui/treeviews => views}/dataProviders/documentationDataProvider.ts (73%) create mode 100644 src/views/dataProviders/sourceDataProvider.ts create mode 100644 src/views/dataProviders/templateDataProvider.ts create mode 100644 src/views/dataProviders/workloadDataProvider.ts rename src/{ui/treeviews => views}/documentationConfig.ts (100%) create mode 100644 src/views/nodes/anyResourceNode.ts create mode 100644 src/views/nodes/bucketNode.ts create mode 100644 src/views/nodes/clusterContextNode.ts rename src/{ui/treeviews/nodes/cluster => views/nodes}/clusterDeploymentNode.ts (68%) rename src/{ui/treeviews => views}/nodes/documentationNode.ts (81%) create mode 100644 src/views/nodes/gitOpsTemplateNode.ts create mode 100644 src/views/nodes/gitRepositoryNode.ts create mode 100644 src/views/nodes/helmReleaseNode.ts create mode 100644 src/views/nodes/helmRepositoryNode.ts create mode 100644 src/views/nodes/kustomizationNode.ts create mode 100644 src/views/nodes/namespaceNode.ts rename src/{types => views/nodes}/nodeContext.ts (81%) create mode 100644 src/views/nodes/ociRepositoryNode.ts create mode 100644 src/views/nodes/sourceNode.ts rename src/{ui/treeviews => views}/nodes/treeNode.ts (50%) create mode 100644 src/views/nodes/workloadNode.ts create mode 100644 src/views/treeViews.ts create mode 100644 src/views/views.ts create mode 100644 src/vscodeContext.ts rename src/{ui/webviews => webview-backend}/README.md (100%) rename src/{ui/webviews => webview-backend}/WebviewBackend.ts (95%) rename src/{ui/webviews => webview-backend}/configureGitOps/actions.ts (87%) rename src/{ui/webviews => webview-backend}/configureGitOps/lib/createAzure.ts (56%) create mode 100644 src/webview-backend/configureGitOps/lib/createGeneric.ts rename src/{ui/webviews => webview-backend}/configureGitOps/lib/exportGeneric.ts (64%) rename src/{ui/webviews => webview-backend}/configureGitOps/openWebview.ts (58%) rename src/{ui/webviews => webview-backend}/configureGitOps/receiveMessage.ts (99%) rename src/{ui/webviews => webview-backend}/createFromTemplate/openWebview.ts (84%) rename src/{ui/webviews => webview-backend}/createFromTemplate/receiveMessage.ts (91%) rename src/{types/webviewParams.ts => webview-backend/types.ts} (67%) delete mode 100644 tslint-imports.json diff --git a/.github/workflows/build-vsix.yml b/.github/workflows/build-vsix.yml index 2141aed7..1f8ce6bb 100644 --- a/.github/workflows/build-vsix.yml +++ b/.github/workflows/build-vsix.yml @@ -64,17 +64,17 @@ jobs: fi; - name: Clone Repository - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # pin@v3 + uses: actions/checkout@dc323e67f16fb5f7663d20ff7941f27f5809e9b6 # pin@v2 with: fetch-depth: 0 - name: Setup Flux CLI - uses: fluxcd/flux2/action@1730f3c46bddf0a29787d8d4fa5ace283f298e49 # pin@main + uses: fluxcd/flux2/action@2c7d650d4472bb7c92fa5fea86589527dfa5abcc # pin@main with: token: ${{ secrets.GITHUB_TOKEN }} - name: Setup Node version - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # pin@v3 + uses: actions/setup-node@f1f314fca9dfce2769ece7d933488f076716723e # pin@v1 with: node-version: 19 @@ -96,11 +96,11 @@ jobs: - name: Setup Kubernetes uses: engineerd/setup-kind@aa272fe2a7309878ffc2a81c56cfe3ef108ae7d0 # pin@v0.5.0 with: - version: v0.20.0 - image: kindest/node:v1.28.0 + version: v0.17.0 + image: kindest/node:v1.23.13 - name: Run Tests - uses: coactions/setup-xvfb@b6b4fcfb9f5a895edadc3bc76318fae0ac17c8b3 # pin@v1 + uses: GabrielBB/xvfb-action@86d97bde4a65fe9b290c0b3fb92c2c4ed0e5302d # pin@v1 with: run: npm test options: "-screen 0 1600x1200x24" @@ -167,7 +167,7 @@ jobs: if: ${{ github.event.inputs.publishMarketplace == 'yes' && github.event.inputs.releaseChannel == 'stable' }} - name: Publish to Open VSX Registry (Edge) - uses: HaaLeo/publish-vscode-extension@dfe4f6ad46624424fe24cb5bca79839183399045 # pin@v1 + uses: HaaLeo/publish-vscode-extension@c1a0486c5a3eed24e8c21d4e37889a7c4c60c443 # pin@v1 if: ${{ github.event.inputs.publishOpenVSX == 'yes' && github.event.inputs.releaseChannel == 'edge' }} with: preRelease: true @@ -175,7 +175,7 @@ jobs: extensionFile: ./gitops-tools-${{ env.RELEASE_VERSION }}.vsix - name: Publish to Open VSX Registry (Stable) - uses: HaaLeo/publish-vscode-extension@dfe4f6ad46624424fe24cb5bca79839183399045 # pin@v1 + uses: HaaLeo/publish-vscode-extension@c1a0486c5a3eed24e8c21d4e37889a7c4c60c443 # pin@v1 if: ${{ github.event.inputs.publishOpenVSX == 'yes' && github.event.inputs.releaseChannel == 'stable' }} with: preRelease: false @@ -199,7 +199,7 @@ jobs: echo "GIT_TAG=$GIT_TAG" >> $GITHUB_ENV - name: GitHub Release - uses: ncipollo/release-action@6c75be85e571768fa31b40abf38de58ba0397db5 # pin@v1 + uses: ncipollo/release-action@a2e71bdd4e7dab70ca26a852f29600c98b33153e # pin@v1 with: artifacts: "./gitops-tools-*" bodyFile: ${{ github.workspace }}-CHANGELOG.txt @@ -228,14 +228,14 @@ jobs: Feature branches should still be squashed, but \`release-pr\` must always be merged to complete the release. - See the [CONTRIBUTING.md](https://github.com/weaveworks/vscode-gitops-tools/blob/main/CONTRIBUTING.md#releasing) for more information about the release process. + See the [DEVELOPMENT.md](https://github.com/weaveworks/vscode-gitops-tools/blob/main/DEVELOPMENT.md#releasing) for more information about the release process. pr_reviewer: ${{ github.actor }} pr_draft: false github_token: ${{ secrets.GITHUB_TOKEN }} # - name: Get the version # id: version -# run: echo "VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_OUTPUT +# run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//} # shell: bash # # - uses: apexskier/github-semver-parse@671ddf80785e4d721e76723ec1e687317f85bfe9 # pin@v1 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0d2f6b1e..cf774c71 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,27 +11,27 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # pin@v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # pin@v3 - - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # pin@v3 + - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # pin@v3 with: - node-version: '20' + node-version: '19' - run: npm install - name: Setup Kubernetes uses: engineerd/setup-kind@aa272fe2a7309878ffc2a81c56cfe3ef108ae7d0 # pin@v0.5.0 with: - version: v0.20.0 - image: kindest/node:v1.28.0 + version: v0.17.0 + image: kindest/node:v1.23.13 - name: Setup Flux CLI - uses: fluxcd/flux2/action@1730f3c46bddf0a29787d8d4fa5ace283f298e49 # pin@main + uses: fluxcd/flux2/action@2c7d650d4472bb7c92fa5fea86589527dfa5abcc # pin@main with: token: ${{ secrets.GITHUB_TOKEN }} - name: extension test - uses: coactions/setup-xvfb@b6b4fcfb9f5a895edadc3bc76318fae0ac17c8b3 # pin@v1 + uses: GabrielBB/xvfb-action@86d97bde4a65fe9b290c0b3fb92c2c4ed0e5302d # pin@v1 with: run: 'npm test' options: "-screen 0 1600x1200x24" diff --git a/.vscode/settings.json b/.vscode/settings.json index 129a253b..5adc2423 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -11,9 +11,5 @@ }, // Turn off tsc task auto detection since we have the necessary tasks as npm scripts "typescript.tsc.autoDetect": "off", - "debug.node.autoAttach": "on", - "editor.codeActionsOnSave": { - "source.fixAll": true, - "source.organizeImports": true - }, + "debug.node.autoAttach": "on" } \ No newline at end of file diff --git a/CONTRIBUTING.md b/DEVELOPMENT.md similarity index 100% rename from CONTRIBUTING.md rename to DEVELOPMENT.md diff --git a/README.md b/README.md index 07dd4c53..b3a4a95c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # GitOps Tools for Visual Studio Code -[![VSCode Marketplace Link](https://img.shields.io/visual-studio-marketplace/v/weaveworks.vscode-gitops-tools)](https://marketplace.visualstudio.com/items?itemName=Weaveworks.vscode-gitops-tools) -[![Install Counter](https://img.shields.io/visual-studio-marketplace/i/weaveworks.vscode-gitops-tools)](https://marketplace.visualstudio.com/items?itemName=Weaveworks.vscode-gitops-tools) +[![VSCode Marketplace Link](https://vsmarketplacebadges.dev/version-short/weaveworks.vscode-gitops-tools.png)](https://marketplace.visualstudio.com/items?itemName=Weaveworks.vscode-gitops-tools) +[![Install Counter](https://vsmarketplacebadges.dev/installs/weaveworks.vscode-gitops-tools.png)](https://marketplace.visualstudio.com/items?itemName=Weaveworks.vscode-gitops-tools) Weaveworks [GitOps Tools Extension](https://marketplace.visualstudio.com/items?itemName=Weaveworks.vscode-gitops-tools) provides an intuitive way to manage, troubleshoot and operate your Kubernetes environment following the GitOps operating model. GitOps accelerates your development lifecycle and simplifies your continuous delivery pipelines. The extension is built on Flux (a CNCF open source project). To learn more about the Flux GitOps toolkit, visit [fluxcd.io] @@ -27,15 +27,12 @@ There are a few requirements before installing and using the extension: Once you have satisfied these requirements you can find and install GitOps Tools in the [Extension Marketplace](https://marketplace.visualstudio.com/items?itemName=Weaveworks.vscode-gitops-tools) by searching for "**fluxcd**" or "**gitops**". -### kubectl proxy -This extension uses two different methods to get information from the Kubernetes cluster. It preferentially will run `kubectl proxy -p 0` for your selected cluster and will use the proxy with a javascript client for faster performance and real-time updates. This also requires `watch` RBAC for Flux resources. If the proxy client connection can't be established the extension will fall back to `kubectl get` for querying the cluster. # Features - Configure, visualize and manage Flux resources - Tree views for Clusters, Sources, and Workloads -- Observe Flux resource updates in the cluster in real-time - Select clusters and examine installed [GitOps Toolkit components](https://fluxcd.io/docs/components/) - Enable and Disable GitOps (install/uninstall Flux) on clusters - Create, view and edit sources (git, OCI, Helm and Bucket), and workloads (Kustomization and HelmRelease) @@ -45,7 +42,6 @@ This extension uses two different methods to get information from the Kubernetes - Clone GitRepository source to user machine and open them in the editor - Preview sources, workloads and other objects information with tooltips - Open remote resources as `.yaml` files in the editor -- Open and edit the kubeconfig file - Trace Kubernetes objects created by workloads - Watch Flux controller logs and `flux` CLI commands for diagnostics - Documentation links for [Flux](https://fluxcd.io/docs) and [Weave GitOps](https://docs.gitops.weave.works/docs/intro/) embedded in the extension @@ -125,37 +121,17 @@ The GitOps Tools Extension depends on the [Kubernetes Tools](https://marketplace - Make sure you have [successfully authenticated](https://docs.microsoft.com/en-us/cli/azure/authenticate-azure-cli) on your `az` CLI and have access to the [correct subscription](https://docs.microsoft.com/en-us/cli/azure/account?view=azure-cli-latest#az_account_set) for your AKS or ARC cluster. - The easiest way to get your AKS or Arc cluster visible by the GitOps and Kubernetes Extensions, is to use the `az` CLI to merge the kubeconfig for accessing your cluster onto the default `kubectl` config. Use `get-credentials` as shown in the [official CLI documentation](https://docs.microsoft.com/en-us/cli/azure/aks?view=azure-cli-latest#az_aks_get_credentials). In order to enable GitOps in a cluster you will likely need the `--admin` credentials. -## Weave GitOps Enterprise (WGE) Integration +## Weave GitOps Enterprise (WGE) Templates -WGE users can access GitOpsTemplates directly from this extensions. WGE integration adds another treeview that shows `GitOpsTemplate`, `Canary`, `Pipeline`, and `GitOpsSet` resources and adds new interactions to each type of resource. All WGE resources have a right-click action to open them in WGE portal. +WGE users can access GitOpsTemplates directly from this extensions. Templates are provided by cluster administrators (Platform Teams) and can be used to quickly create cluster and configure applications with GitOps. -GitOpsTemplates are provided by cluster administrators (Platform Teams) and can be used to quickly create cluster and configure applications with GitOps. Flagger Canaries status can be visualized and their progress tracked. Pipelines are listed with their targets and each `GitopsCluster` attached to a Pipeline can be set as the current selected cluster for quick navigation between clusters. +Templates are an opt-in feature that must be enabled in setting: -WGE integration is an opt-in feature that must be enabled in settings: +![Enable GitOpsTemplates](docs/images/vscode-templates-config.png) -![Enable WGE Features](docs/images/config-enable-wge.png) - -![Weave GitOps Treeview](docs/images/weave-gitops-treeview.png) - -![Create GitOps Template](docs/images/vscode-templates-view.png) - -### WGE Configuration - -For the integration to work, this extension needs a ConfigMap that provides WGE information and settings: - -`kubectl create configmap weave-gitops-interop --from-literal=portalUrl='https://WGE-CLUSTER-HOST' --from-literal=wgeClusterName='WGE-CLUSTER-NAME' -n flux-system`` - -``` -apiVersion: v1 -kind: ConfigMap -metadata: - namespace: flux-system - name: weave-gitops-interop -data: - portalUrl: https://mccp.howard.moomboo.space - wgeClusterName: howard-moomboo-space -``` +After that they can be seen in a new 'Templates' view. Right-click a template to use it: +![Use GitOpsTemplates](docs/images/vscode-templates-view.png) @@ -169,15 +145,10 @@ We rely on the Kubernetes extension to discover and connect to clusters. If you Confirm that your configuration context shows in a terminal running `kubectl config get-contexts` -### _Switching from an unreachable cluster context to a working cluster_ -Unreachable or laggy clusters can create long running that cluster resource queries that finish after switching to a working cluster context. This can lead to the slow cluster data overwriting the current cluster treeview. **Clusters** -> **Refresh** button will reinitialize the views with current data. Timeout settings can be adjusted under **GitOps** section in VSCode Settings. -### _Timeouts and flux check warnings_ -The extension has timeout options that can make be adjusted in VSCode settings to match your cluster network constraints. The default timeout for any data query operation is 60 seconds. -`flux check` command can also be disabled in the settings. This will stop `flux check` warnings about old versions but will disable Flux controller status icons in the the Clusters treeview. # Data and Telemetry diff --git a/docs/images/config-enable-wge.png b/docs/images/config-enable-wge.png deleted file mode 100644 index 5c94322721f7b994f44df858d760e05ba1dc8897..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25406 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 IiUsb!0AUMYPXGV_ diff --git a/docs/images/vscode-templates-config.png b/docs/images/vscode-templates-config.png new file mode 100644 index 0000000000000000000000000000000000000000..503016ef445041b485634942f42cb715c3c88d77 GIT binary patch literal 51951 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 literal 0 HcmV?d00001 diff --git a/docs/images/weave-gitops-treeview.png b/docs/images/weave-gitops-treeview.png deleted file mode 100644 index 53a5874ea4451963cab88a8e3d31922d8543418c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222645 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