Unverified Commit 542963cf authored by Samruddhi Khandale's avatar Samruddhi Khandale Committed by GitHub

Prep: republish features to ghcr.io (#78)

* syncing action

* modify release.yaml

* version update ; remove "install"

* add 'latest'

* add workflow condition
parent 69d3df5f
...@@ -22,15 +22,33 @@ inputs: ...@@ -22,15 +22,33 @@ inputs:
# 'features' options # 'features' options
base-path-to-features: base-path-to-features:
required: false required: false
default: './features/src' default: ''
description: "Relative path to the 'src' folder containing dev container 'feature(s)'" description: "Relative path to the 'src' folder containing dev container 'feature(s)'"
# 'template' options # 'template' options
base-path-to-templates: base-path-to-templates:
required: false required: false
default: './templates/src' default: ''
description: "Relative path to the folder containing dev container 'template(s)'" description: "Relative path to the folder containing dev container 'template(s)'"
# EXPERIMENTAL
tag-individual-features:
required: false
default: "false"
description: "Tag individual features"
publish-to-npm:
required: false
default: "false"
description: "Should publish features to NPM?"
publish-release-artifacts:
required: false
default: "false"
description: "Publish release artifacts (classic)"
publish-to-oci:
required: false
default: "false"
description: "Publish to OCI?"
runs: runs:
using: 'node16' using: 'node16'
main: 'dist/index.js' main: 'dist/index.js'
This diff is collapsed.
...@@ -520,7 +520,7 @@ minipass ...@@ -520,7 +520,7 @@ minipass
ISC ISC
The ISC License The ISC License
Copyright (c) npm, Inc. and Contributors Copyright (c) 2017-2022 npm, Inc., Isaac Z. Schlueter, and Contributors
Permission to use, copy, modify, and/or distribute this software for any Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above purpose with or without fee is hereby granted, provided that the above
......
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
...@@ -32,51 +32,91 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge ...@@ -32,51 +32,91 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
}); });
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.generateFeaturesDocumentation = void 0; exports.generateTemplateDocumentation = exports.generateFeaturesDocumentation = void 0;
const fs = __importStar(require("fs")); const fs = __importStar(require("fs"));
const github = __importStar(require("@actions/github"));
const core = __importStar(require("@actions/core")); const core = __importStar(require("@actions/core"));
const path = __importStar(require("path")); const path = __importStar(require("path"));
const utils_1 = require("./utils");
const FEATURES_README_TEMPLATE = `
# #{Name}
#{Description}
## Example Usage
\`\`\`json
"features": {
"#{Nwo}/#{Id}@#{VersionTag}": {
"version": "latest"
}
}
\`\`\`
## Options
#{OptionsTable}
---
_Note: This file was auto-generated from the [devcontainer-feature.json](#{RepoUrl})._
`;
const TEMPLATE_README_TEMPLATE = `
# #{Name}
#{Description}
## Options
#{OptionsTable}
`;
function generateFeaturesDocumentation(basePath) { function generateFeaturesDocumentation(basePath) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
fs.readdir(basePath, (err, files) => { yield _generateDocumentation(basePath, FEATURES_README_TEMPLATE, 'devcontainer-feature.json');
if (err) { });
core.error(err.message); }
core.setFailed(`failed to generate 'features' documentation ${err.message}`); exports.generateFeaturesDocumentation = generateFeaturesDocumentation;
return; function generateTemplateDocumentation(basePath) {
} return __awaiter(this, void 0, void 0, function* () {
files.forEach(f => { yield _generateDocumentation(basePath, TEMPLATE_README_TEMPLATE, 'devcontainer-template.json');
core.info(`Generating docs for feature '${f}'`); });
if (f !== '.' && f !== '..') { }
exports.generateTemplateDocumentation = generateTemplateDocumentation;
function _generateDocumentation(basePath, readmeTemplate, metadataFile) {
return __awaiter(this, void 0, void 0, function* () {
const directories = fs.readdirSync(basePath);
yield Promise.all(directories.map((f) => __awaiter(this, void 0, void 0, function* () {
var _a, _b, _c;
if (!f.startsWith('.')) {
const readmePath = path.join(basePath, f, 'README.md'); const readmePath = path.join(basePath, f, 'README.md');
// Reads in feature.json // Reads in feature.json
const featureJsonPath = path.join(basePath, f, 'devcontainer-feature.json'); const jsonPath = path.join(basePath, f, metadataFile);
if (!fs.existsSync(featureJsonPath)) { if (!fs.existsSync(jsonPath)) {
core.error(`devcontainer-feature.json not found at path '${featureJsonPath}'`); core.error(`${metadataFile} not found at path '${jsonPath}'`);
return; return;
} }
let featureJson = undefined; let parsedJson = undefined;
try { try {
featureJson = JSON.parse(fs.readFileSync(featureJsonPath, 'utf8')); parsedJson = JSON.parse(fs.readFileSync(jsonPath, 'utf8'));
} }
catch (err) { catch (err) {
core.error(`Failed to parse ${featureJsonPath}: ${err}`); core.error(`Failed to parse ${jsonPath}: ${err}`);
return; return;
} }
if (!featureJson || !(featureJson === null || featureJson === void 0 ? void 0 : featureJson.id)) { if (!parsedJson || !(parsedJson === null || parsedJson === void 0 ? void 0 : parsedJson.id)) {
core.error(`devcontainer-feature.json for feature '${f}' does not contain an 'id'`); core.error(`${metadataFile} for '${f}' does not contain an 'id'`);
return; return;
} }
const ref = github.context.ref; const srcInfo = (0, utils_1.getGitHubMetadata)();
const owner = github.context.repo.owner; const ref = srcInfo.ref;
const repo = github.context.repo.repo; const owner = srcInfo.owner;
const repo = srcInfo.repo;
// Add tag if parseable // Add tag if parseable
let versionTag = 'latest'; let versionTag = 'latest';
if (ref.includes('refs/tags/')) { if (ref && ref.includes('refs/tags/')) {
versionTag = ref.replace('refs/tags/', ''); versionTag = ref.replace('refs/tags/', '');
} }
const generateOptionsMarkdown = () => { const generateOptionsMarkdown = () => {
const options = featureJson === null || featureJson === void 0 ? void 0 : featureJson.options; const options = parsedJson === null || parsedJson === void 0 ? void 0 : parsedJson.options;
if (!options) { if (!options) {
return ''; return '';
} }
...@@ -87,18 +127,25 @@ function generateFeaturesDocumentation(basePath) { ...@@ -87,18 +127,25 @@ function generateFeaturesDocumentation(basePath) {
return `| ${k} | ${val.description || '-'} | ${val.type || '-'} | ${val.default || '-'} |`; return `| ${k} | ${val.description || '-'} | ${val.type || '-'} | ${val.default || '-'} |`;
}) })
.join('\n'); .join('\n');
return ('| Options Id | Description | Type | Default Value |\n' + return '| Options Id | Description | Type | Default Value |\n' + '|-----|-----|-----|-----|\n' + contents;
'|-----|-----|-----|-----|\n' +
contents);
}; };
const newReadme = README_TEMPLATE.replace('#{nwo}', `${owner}/${repo}`) let urlToConfig = './devcontainer-feature.json';
.replace('#{versionTag}', versionTag) const basePathTrimmed = basePath.startsWith('./') ? basePath.substring(2) : basePath;
.replace('#{featureId}', featureJson.id) if (srcInfo.owner && srcInfo.repo) {
.replace('#{featureName}', featureJson.name urlToConfig = `https://github.com/${srcInfo.owner}/${srcInfo.repo}/blob/main/${basePathTrimmed}/${f}/devcontainer-feature.json`;
? `${featureJson.name} (${featureJson.id})` }
: `${featureJson.id}`) const newReadme = readmeTemplate
.replace('#{featureDescription}', featureJson.description ? featureJson.description : '') // Templates & Features
.replace('#{optionsTable}', generateOptionsMarkdown()); .replace('#{Id}', parsedJson.id)
.replace('#{Name}', parsedJson.name ? `${parsedJson.name} (${parsedJson.id})` : `${parsedJson.id}`)
.replace('#{Description}', (_a = parsedJson.description) !== null && _a !== void 0 ? _a : '')
.replace('#{OptionsTable}', generateOptionsMarkdown())
// Features Only
.replace('#{Nwo}', `${owner}/${repo}`)
.replace('#{VersionTag}', versionTag)
// Templates Only
.replace('#{ManifestName}', (_c = (_b = parsedJson === null || parsedJson === void 0 ? void 0 : parsedJson.image) === null || _b === void 0 ? void 0 : _b.manifest) !== null && _c !== void 0 ? _c : '')
.replace('#{RepoUrl}', urlToConfig);
// Remove previous readme // Remove previous readme
if (fs.existsSync(readmePath)) { if (fs.existsSync(readmePath)) {
fs.unlinkSync(readmePath); fs.unlinkSync(readmePath);
...@@ -106,31 +153,6 @@ function generateFeaturesDocumentation(basePath) { ...@@ -106,31 +153,6 @@ function generateFeaturesDocumentation(basePath) {
// Write new readme // Write new readme
fs.writeFileSync(readmePath, newReadme); fs.writeFileSync(readmePath, newReadme);
} }
})));
}); });
});
});
}
exports.generateFeaturesDocumentation = generateFeaturesDocumentation;
const README_TEMPLATE = `
# #{featureName}
#{featureDescription}
## Example Usage
\`\`\`json
"features": {
"#{nwo}/#{featureId}@#{versionTag}": {
"version": "latest"
}
} }
\`\`\`
## Options
#{optionsTable}
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
`;
...@@ -44,42 +44,51 @@ function run() { ...@@ -44,42 +44,51 @@ function run() {
core.debug('Reading input parameters...'); core.debug('Reading input parameters...');
// Read inputs // Read inputs
const shouldPublishFeatures = core.getInput('publish-features').toLowerCase() === 'true'; const shouldPublishFeatures = core.getInput('publish-features').toLowerCase() === 'true';
const shouldPublishTemplate = core.getInput('publish-templates').toLowerCase() === 'true'; const shouldPublishTemplates = core.getInput('publish-templates').toLowerCase() === 'true';
const shouldGenerateDocumentation = core.getInput('generate-docs').toLowerCase() === 'true'; const shouldGenerateDocumentation = core.getInput('generate-docs').toLowerCase() === 'true';
// Experimental
const shouldTagIndividualFeatures = core.getInput('tag-individual-features').toLowerCase() === 'true';
const shouldPublishToNPM = core.getInput('publish-to-npm').toLowerCase() === 'true';
const shouldPublishReleaseArtifacts = core.getInput('publish-release-artifacts').toLowerCase() === 'true';
const shouldPublishToOCI = core.getInput('publish-to-oci').toLowerCase() === 'true';
const opts = {
shouldTagIndividualFeatures,
shouldPublishToNPM,
shouldPublishReleaseArtifacts,
shouldPublishToOCI
};
const featuresBasePath = core.getInput('base-path-to-features');
const templatesBasePath = core.getInput('base-path-to-templates');
let featuresMetadata = undefined; let featuresMetadata = undefined;
let templatesMetadata = undefined; let templatesMetadata = undefined;
// -- Package Release Artifacts
if (shouldPublishFeatures) { if (shouldPublishFeatures) {
core.info('Publishing features...'); core.info('Publishing features...');
const featuresBasePath = core.getInput('base-path-to-features'); featuresMetadata = yield packageFeatures(featuresBasePath, opts);
featuresMetadata = yield packageFeatures(featuresBasePath);
} }
if (shouldPublishTemplate) { if (shouldPublishTemplates) {
core.info('Publishing template...'); core.info('Publishing template...');
const basePathToDefinitions = core.getInput('base-path-to-templates'); templatesMetadata = yield packageTemplates(templatesBasePath);
templatesMetadata = undefined; // TODO
yield packageTemplates(basePathToDefinitions);
} }
if (shouldGenerateDocumentation) { // -- Generate Documentation
core.info('Generating documentation...'); if (shouldGenerateDocumentation && featuresBasePath) {
const featuresBasePath = core.getInput('base-path-to-features'); core.info('Generating documentation for features...');
if (featuresBasePath) {
yield (0, generateDocs_1.generateFeaturesDocumentation)(featuresBasePath); yield (0, generateDocs_1.generateFeaturesDocumentation)(featuresBasePath);
} }
else { if (shouldGenerateDocumentation && templatesBasePath) {
core.error("'base-path-to-features' input is required to generate documentation"); core.info('Generating documentation for templates...');
} yield (0, generateDocs_1.generateTemplateDocumentation)(templatesBasePath);
// TODO: base-path-to-templates
} }
// TODO: Programatically add feature/template fino with relevant metadata for UX clients. // -- Programatically add feature/template metadata to collections file.
core.info('Generation metadata file: devcontainer-collection.json'); core.info('Generating metadata file: devcontainer-collection.json');
yield (0, utils_1.addCollectionsMetadataFile)(featuresMetadata, templatesMetadata); yield (0, utils_1.addCollectionsMetadataFile)(featuresMetadata, templatesMetadata, opts);
}); });
} }
function packageFeatures(basePath) { function packageFeatures(basePath, opts) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
try { try {
core.info(`Archiving all features in ${basePath}`); core.info(`Archiving all features in ${basePath}`);
const metadata = yield (0, utils_1.getFeaturesAndPackage)(basePath); const metadata = yield (0, utils_1.getFeaturesAndPackage)(basePath, opts);
core.info('Packaging features has finished.'); core.info('Packaging features has finished.');
return metadata; return metadata;
} }
...@@ -94,14 +103,17 @@ function packageFeatures(basePath) { ...@@ -94,14 +103,17 @@ function packageFeatures(basePath) {
function packageTemplates(basePath) { function packageTemplates(basePath) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
try { try {
core.info(`Archiving all templated in ${basePath}`); core.info(`Archiving all templates in ${basePath}`);
yield (0, utils_1.getTemplatesAndPackage)(basePath); const metadata = yield (0, utils_1.getTemplatesAndPackage)(basePath);
core.info('Packaging templates has finished.'); core.info('Packaging templates has finished.');
return metadata;
} }
catch (error) { catch (error) {
if (error instanceof Error) if (error instanceof Error) {
core.setFailed(error.message); core.setFailed(error.message);
} }
}
return;
}); });
} }
run(); run();
This diff is collapsed.
name: "(Release) Release dev container features (v2)" name: "(Release) Release dev container features (v2)"
on: on:
push:
tags:
- "v*"
workflow_dispatch: workflow_dispatch:
jobs: jobs:
deploy: deploy:
if: ${{ github.ref == 'refs/heads/main' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Generate tgz - name: Install Oras
run: |
curl -LO https://github.com/oras-project/oras/releases/download/v0.13.0/oras_0.13.0_linux_amd64.tar.gz
mkdir -p oras-install/
tar -zxf oras_0.13.0_*.tar.gz -C oras-install/
mv oras-install/oras /usr/local/bin/
rm -rf oras_0.13.0_*.tar.gz oras-install/
- name: "Publish features to OCI"
uses: ./.github/devcontainers-action # TODO: Once 'devcontainers/action' is published, use that. uses: ./.github/devcontainers-action # TODO: Once 'devcontainers/action' is published, use that.
with: with:
publish-features: "true" publish-features: "true"
publish-to-oci: "true"
base-path-to-features: "./src" base-path-to-features: "./src"
env:
- name: Remove temporary devcontainer-cli # TODO: Temporary GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: rm -rf ./devcontainer-cli-0*
- name: Get or Create Release at current tag
uses: ncipollo/release-action@v1
with:
allowUpdates: true # Lets us upload our own artifact from previous step
artifactErrorsFailBuild: true
artifacts: "./*.tgz,devcontainer-collection.json"
token: ${{ secrets.GITHUB_TOKEN }}
{ {
"id": "anaconda", "id": "anaconda",
"version": "1.0.0",
"name": "Anaconda", "name": "Anaconda",
"options": { "options": {
"version": { "version": {
...@@ -14,9 +15,5 @@ ...@@ -14,9 +15,5 @@
"containerEnv": { "containerEnv": {
"CONDA_DIR": "/usr/local/conda", "CONDA_DIR": "/usr/local/conda",
"PATH": "${PATH}:${CONDA_DIR}/bin:" "PATH": "${PATH}:${CONDA_DIR}/bin:"
},
"install": {
"app": "",
"file": "install.sh"
} }
} }
{ {
"id": "aws-cli", "id": "aws-cli",
"version": "1.0.0",
"name": "AWS CLI", "name": "AWS CLI",
"description": "Installs the AWS CLI along with needed dependencies. Useful for base Dockerfiles that often are missing required install dependencies like gpg.", "description": "Installs the AWS CLI along with needed dependencies. Useful for base Dockerfiles that often are missing required install dependencies like gpg.",
"options": { "options": {
...@@ -14,9 +15,5 @@ ...@@ -14,9 +15,5 @@
}, },
"extensions": [ "extensions": [
"AmazonWebServices.aws-toolkit-vscode" "AmazonWebServices.aws-toolkit-vscode"
], ]
"install": {
"app": "",
"file": "install.sh"
}
} }
{ {
"id": "azure-cli", "id": "azure-cli",
"version": "1.0.0",
"name": "Azure CLI", "name": "Azure CLI",
"description": "Installs the Azure CLI along with needed dependencies. Useful for base Dockerfiles that often are missing required install dependencies like gpg.", "description": "Installs the Azure CLI along with needed dependencies. Useful for base Dockerfiles that often are missing required install dependencies like gpg.",
"options": { "options": {
...@@ -14,9 +15,5 @@ ...@@ -14,9 +15,5 @@
}, },
"extensions": [ "extensions": [
"ms-vscode.azurecli" "ms-vscode.azurecli"
], ]
"install": {
"app": "",
"file": "install.sh"
}
} }
{ {
"id": "common-utils", "id": "common-utils",
"name": "Common Debian Utilities", "name": "Common Debian Utilities",
"version": "1.0.0",
"description": "Installs a set of common command line utilities, Oh My Zsh!, and sets up a non-root user.", "description": "Installs a set of common command line utilities, Oh My Zsh!, and sets up a non-root user.",
"options": { "options": {
"install_Zsh": { "install_Zsh": {
...@@ -55,9 +56,5 @@ ...@@ -55,9 +56,5 @@
}, },
"extensions": [ "extensions": [
"ms-dotnettools.csharp" "ms-dotnettools.csharp"
], ]
"install": {
"app": "",
"file": "install.sh"
}
} }
{ {
"id": "desktop-lite", "id": "desktop-lite",
"version": "1.0.0",
"name": "Light-weight Desktop", "name": "Light-weight Desktop",
"description": "Adds a lightweight Fluxbox based desktop to the container that can be accessed using a VNC viewer or the web. GUI-based commands executed from the built-in VS code terminal will open on the desktop automatically.", "description": "Adds a lightweight Fluxbox based desktop to the container that can be accessed using a VNC viewer or the web. GUI-based commands executed from the built-in VS code terminal will open on the desktop automatically.",
"options": { "options": {
...@@ -50,9 +51,5 @@ ...@@ -50,9 +51,5 @@
"entrypoint": "/usr/local/share/desktop-init.sh", "entrypoint": "/usr/local/share/desktop-init.sh",
"containerEnv": { "containerEnv": {
"DISPLAY": ":1" "DISPLAY": ":1"
},
"install": {
"app": "",
"file": "install.sh"
} }
} }
{ {
"id": "docker-from-docker", "id": "docker-from-docker",
"version": "1.0.0",
"name": "Docker (Docker-from-Docker)", "name": "Docker (Docker-from-Docker)",
"descripton": "Re-use the host docker socket, adding the Docker CLI to a container. Feature invokes a script to enable using a forwarded Docker socket within a container to run Docker commands.", "descripton": "Re-use the host docker socket, adding the Docker CLI to a container. Feature invokes a script to enable using a forwarded Docker socket within a container to run Docker commands.",
"options": { "options": {
...@@ -41,9 +42,5 @@ ...@@ -41,9 +42,5 @@
"target": "/var/run/docker-host.sock", "target": "/var/run/docker-host.sock",
"type": "bind" "type": "bind"
} }
], ]
"install": {
"app": "",
"file": "install.sh"
}
} }
{ {
"id": "docker-in-docker", "id": "docker-in-docker",
"version": "1.0.0",
"name": "Docker (Docker-in-Docker)", "name": "Docker (Docker-in-Docker)",
"description": "Create child containers *inside* a container, independent from the host's docker instance. Installs Docker extension in the container along with needed CLIs.", "description": "Create child containers *inside* a container, independent from the host's docker instance. Installs Docker extension in the container along with needed CLIs.",
"options": { "options": {
...@@ -42,9 +43,5 @@ ...@@ -42,9 +43,5 @@
"target": "/var/lib/docker", "target": "/var/lib/docker",
"type": "volume" "type": "volume"
} }
], ]
"install": {
"app": "",
"file": "install.sh"
}
} }
{ {
"id": "dotnet", "id": "dotnet",
"version": "1.0.0",
"name": "Dotnet CLI", "name": "Dotnet CLI",
"description": "Installs the .NET CLI. Provides option of installing sdk or runtime, and option of versions to install. Uses latest version of .NET sdk as defaults to install.", "description": "Installs the .NET CLI. Provides option of installing sdk or runtime, and option of versions to install. Uses latest version of .NET sdk as defaults to install.",
"options": { "options": {
......
{ {
"id": "git-lfs", "id": "git-lfs",
"version": "1.0.0",
"name": "Git Large File Support (LFS)", "name": "Git Large File Support (LFS)",
"description": "Installs Git Large File Support (Git LFS) along with needed dependencies. Useful for base Dockerfiles that often are missing required install dependencies like git and curl.", "description": "Installs Git Large File Support (Git LFS) along with needed dependencies. Useful for base Dockerfiles that often are missing required install dependencies like git and curl.",
"options": { "options": {
...@@ -12,9 +13,5 @@ ...@@ -12,9 +13,5 @@
"default": "latest", "default": "latest",
"description": "Select version of Git LFS to install" "description": "Select version of Git LFS to install"
} }
},
"install": {
"app": "",
"file": "install.sh"
} }
} }
{ {
"id": "git", "id": "git",
"version": "1.0.0",
"name": "Git (from source)", "name": "Git (from source)",
"description": "Install an up-to-date version of Git, built from source as needed. Useful for when you want the latest and greatest features. Auto-detects latest stable version and installs needed dependencies.", "description": "Install an up-to-date version of Git, built from source as needed. Useful for when you want the latest and greatest features. Auto-detects latest stable version and installs needed dependencies.",
"options": { "options": {
...@@ -17,9 +18,5 @@ ...@@ -17,9 +18,5 @@
"default": true, "default": true,
"description": "Install from PPA if available" "description": "Install from PPA if available"
} }
},
"install": {
"app": "",
"file": "install.sh"
} }
} }
{ {
"id": "github-cli", "id": "github-cli",
"version": "1.0.0",
"name": "GitHub CLI", "name": "GitHub CLI",
"description": "Installs the GitHub CLI. Auto-detects latest version and installs needed dependencies.", "description": "Installs the GitHub CLI. Auto-detects latest version and installs needed dependencies.",
"options": { "options": {
...@@ -12,9 +13,5 @@ ...@@ -12,9 +13,5 @@
"default": "latest", "default": "latest",
"description": "Select version of the GitHub CLI, if not latest." "description": "Select version of the GitHub CLI, if not latest."
} }
},
"install": {
"app": "",
"file": "install.sh"
} }
} }
{ {
"id": "go", "id": "go",
"version": "1.0.0",
"name": "Go", "name": "Go",
"description": "Installs Go and common Go utilities. Auto-detects latest version and installs needed dependencies.", "description": "Installs Go and common Go utilities. Auto-detects latest version and installs needed dependencies.",
"options": { "options": {
...@@ -28,9 +29,5 @@ ...@@ -28,9 +29,5 @@
], ],
"securityOpt": [ "securityOpt": [
"seccomp=unconfined" "seccomp=unconfined"
], ]
"install": {
"app": "",
"file": "install.sh"
}
} }
{ {
"id": "hugo", "id": "hugo",
"version": "1.0.0",
"name": "Hugo", "name": "Hugo",
"options": { "options": {
"version": { "version": {
...@@ -14,9 +15,5 @@ ...@@ -14,9 +15,5 @@
"containerEnv": { "containerEnv": {
"HUGO_DIR": "/usr/local/hugo", "HUGO_DIR": "/usr/local/hugo",
"PATH": "${HUGO_DIR}/bin:${PATH}" "PATH": "${HUGO_DIR}/bin:${PATH}"
},
"install": {
"app": "",
"file": "install.sh"
} }
} }
{ {
"id": "java", "id": "java",
"version": "1.0.0",
"name": "Java (via SDKMAN!)", "name": "Java (via SDKMAN!)",
"description": "Installs Java, SDKMAN! (if not installed), and needed dependencies.", "description": "Installs Java, SDKMAN! (if not installed), and needed dependencies.",
"options": { "options": {
......
{ {
"id": "kubectl-helm-minikube", "id": "kubectl-helm-minikube",
"version": "1.0.0",
"name": "Kubectl, Helm, and Minkube", "name": "Kubectl, Helm, and Minkube",
"description": "Installs latest version of kubectl, Helm, and optionally minikube. Auto-detects latest versions and installs needed dependencies.", "description": "Installs latest version of kubectl, Helm, and optionally minikube. Auto-detects latest versions and installs needed dependencies.",
"options": { "options": {
...@@ -41,9 +42,5 @@ ...@@ -41,9 +42,5 @@
"target": "/home/vscode/.minikube", "target": "/home/vscode/.minikube",
"type": "volume" "type": "volume"
} }
], ]
"install": {
"app": "",
"file": "install.sh"
}
} }
{ {
"id": "node", "id": "node",
"version": "1.0.0",
"name": "Node.js (via nvm) and yarn", "name": "Node.js (via nvm) and yarn",
"description": "Installs Node.js, nvm, yarn, and needed dependencies.", "description": "Installs Node.js, nvm, yarn, and needed dependencies.",
"options": { "options": {
......
{ {
"id": "oryx", "id": "oryx",
"version": "1.0.0",
"name": "Oryx", "name": "Oryx",
"description": "Installs the oryx CLI", "description": "Installs the oryx CLI",
"containerEnv": { "containerEnv": {
......
{ {
"id": "php", "id": "php",
"version": "1.0.0",
"name": "PHP", "name": "PHP",
"options": { "options": {
"version": { "version": {
......
{ {
"id": "powershell", "id": "powershell",
"version": "1.0.0",
"name": "PowerShell", "name": "PowerShell",
"description": "Installs PowerShell along with needed dependencies. Useful for base Dockerfiles that often are missing required install dependencies like gpg.", "description": "Installs PowerShell along with needed dependencies. Useful for base Dockerfiles that often are missing required install dependencies like gpg.",
"options": { "options": {
...@@ -13,9 +14,5 @@ ...@@ -13,9 +14,5 @@
"default": "latest", "default": "latest",
"description": "Select or enter a version of PowerShell." "description": "Select or enter a version of PowerShell."
} }
},
"install": {
"app": "",
"file": "install.sh"
} }
} }
{ {
"id": "python", "id": "python",
"version": "1.0.0",
"name": "Python", "name": "Python",
"description": "Installs the provided version of Python, as well as PIPX, and other common Python utilities. JupyterLab is conditionally installed with the python feature. Note: May require source code compilation.", "description": "Installs the provided version of Python, as well as PIPX, and other common Python utilities. JupyterLab is conditionally installed with the python feature. Note: May require source code compilation.",
"options": { "options": {
......
{ {
"id": "ruby", "id": "ruby",
"version": "1.0.0",
"name": "Ruby (via rvm)", "name": "Ruby (via rvm)",
"description": "Installs Ruby, rvm, rbenv, common Ruby utilities, and needed dependencies.", "description": "Installs Ruby, rvm, rbenv, common Ruby utilities, and needed dependencies.",
"options": { "options": {
......
{ {
"id": "rust", "id": "rust",
"version": "1.0.0",
"name": "Rust", "name": "Rust",
"description": "Installs Rust, common Rust utilities, and their required dependencies", "description": "Installs Rust, common Rust utilities, and their required dependencies",
"options": { "options": {
...@@ -50,9 +51,5 @@ ...@@ -50,9 +51,5 @@
"**/target/**": true "**/target/**": true
}, },
"rust-analyzer.checkOnSave.command": "clippy" "rust-analyzer.checkOnSave.command": "clippy"
},
"install": {
"app": "",
"file": "install.sh"
} }
} }
{ {
"id": "sshd", "id": "sshd",
"version": "1.0.0",
"name": "SSH server", "name": "SSH server",
"description": "Adds a SSH server into a container so that you can use an external terminal, sftp, or SSHFS to interact with it.", "description": "Adds a SSH server into a container so that you can use an external terminal, sftp, or SSHFS to interact with it.",
"options": { "options": {
...@@ -12,9 +13,5 @@ ...@@ -12,9 +13,5 @@
"description": "Currently unused." "description": "Currently unused."
} }
}, },
"entrypoint": "/usr/local/share/ssh-init.sh", "entrypoint": "/usr/local/share/ssh-init.sh"
"install": {
"app": "",
"file": "install.sh"
}
} }
{ {
"id": "terraform", "id": "terraform",
"version": "1.0.0",
"name": "Terraform, tflint, and TFGrunt", "name": "Terraform, tflint, and TFGrunt",
"description": "Installs the Terraform CLI and optionally TFLint and Terragrunt. Auto-detects latest version and installs needed dependencies.", "description": "Installs the Terraform CLI and optionally TFLint and Terragrunt. Auto-detects latest version and installs needed dependencies.",
"options": { "options": {
...@@ -42,9 +43,5 @@ ...@@ -42,9 +43,5 @@
"args": [] "args": []
}, },
"azureTerraform.terminal": "integrated" "azureTerraform.terminal": "integrated"
},
"install": {
"app": "",
"file": "install.sh"
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment