Unverified Commit 2fa32324 authored by Josh Spicer's avatar Josh Spicer Committed by GitHub

Devcontainer docs (#47)

* docs

* automatically generate documentation from features.json

* trigger doc gen

* 1

* no-ci

* no-ci

* no-ci

* no-ci

* comment out pull

* Automated documentation update

* no-ci markdown table

* Automated documentation update

* no-ci

* Automated documentation update

* branch to main
Co-authored-by: 's avatarDevcontainers CI <vscr-feedback@microsoft.com>
parent fac5e5a4
...@@ -13,6 +13,9 @@ ...@@ -13,6 +13,9 @@
"contents": "write", "contents": "write",
"workflows": "write" "workflows": "write"
} }
},
"joshspicer/devcontainer-docs": {
"permissions": "write-all"
} }
} }
} }
......
name: 'Dev Container CI' name: 'Dev Container'
description: 'Publish custom development container feature(s) and/or templates(s)' description: 'Publish custom development container feature(s) and/or templates(s)'
author: 'GitHub' author: 'GitHub'
branding: branding:
...@@ -14,6 +14,10 @@ inputs: ...@@ -14,6 +14,10 @@ inputs:
required: false required: false
default: "false" default: "false"
description: "['true'/'false'] Publish dev container 'template' artifacts" description: "['true'/'false'] Publish dev container 'template' artifacts"
generate-docs:
required: false
default: "false"
description: "Parse machine-readable (.json) configuration files and commit standardized documentation"
# 'features' options # 'features' options
base-path-to-features: base-path-to-features:
......
require('./sourcemap-register.js');/******/ (() => { // webpackBootstrap require('./sourcemap-register.js');/******/ (() => { // webpackBootstrap
/******/ var __webpack_modules__ = ({ /******/ var __webpack_modules__ = ({
/***/ 6204:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
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 }));
exports.generateFeaturesDocumentation = void 0;
const fs = __importStar(__nccwpck_require__(7147));
const github = __importStar(__nccwpck_require__(5438));
const core = __importStar(__nccwpck_require__(2186));
const path = __importStar(__nccwpck_require__(1017));
function generateFeaturesDocumentation(basePath) {
return __awaiter(this, void 0, void 0, function* () {
fs.readdir(basePath, (err, files) => {
if (err) {
core.error(err.message);
core.setFailed(`failed to generate 'features' documentation ${err.message}`);
return;
}
files.forEach(f => {
core.info(`Generating docs for feature '${f}'`);
if (f !== '.' && f !== '..') {
const readmePath = path.join(basePath, f, 'README.md');
// Reads in feature.json
const featureJsonPath = path.join(basePath, f, 'devcontainer-feature.json');
if (!fs.existsSync(featureJsonPath)) {
core.error(`devcontainer-feature.json not found at path '${featureJsonPath}'`);
return;
}
let featureJson = undefined;
try {
featureJson = JSON.parse(fs.readFileSync(featureJsonPath, 'utf8'));
}
catch (err) {
core.error(`Failed to parse ${featureJsonPath}: ${err}`);
return;
}
if (!featureJson || !(featureJson === null || featureJson === void 0 ? void 0 : featureJson.id)) {
core.error(`devcontainer-feature.json for feature '${f}' does not contain an 'id'`);
return;
}
const ref = github.context.ref;
const owner = github.context.repo.owner;
const repo = github.context.repo.repo;
// Add tag if parseable
let versionTag = 'latest';
if (ref.includes('refs/tags/')) {
versionTag = ref.replace('refs/tags/', '');
}
const generateOptionsMarkdown = () => {
const options = featureJson === null || featureJson === void 0 ? void 0 : featureJson.options;
if (!options) {
return '';
}
const keys = Object.keys(options);
const contents = keys
.map(k => {
const val = options[k];
return `| ${k} | ${val.description || '-'} | ${val.type || '-'} | ${val.default || '-'} |`;
})
.join('\n');
return ('| Options Id | Description | Type | Default Value |\n' +
'|-----|-----|-----|-----|\n' +
contents);
};
const newReadme = README_TEMPLATE.replace('#{nwo}', `${owner}/${repo}`)
.replace('#{versionTag}', versionTag)
.replace('#{featureId}', featureJson.id)
.replace('#{featureName}', featureJson.name
? `${featureJson.name} (${featureJson.id})`
: `${featureJson.id}`)
.replace('#{featureDescription}', featureJson.description ? featureJson.description : '')
.replace('#{optionsTable}', generateOptionsMarkdown());
// Remove previous readme
if (fs.existsSync(readmePath)) {
fs.unlinkSync(readmePath);
}
// Write new readme
fs.writeFileSync(readmePath, newReadme);
}
});
});
});
}
exports.generateFeaturesDocumentation = generateFeaturesDocumentation;
const README_TEMPLATE = `
# #{featureName}
#{featureDescription}
## Example Usage
\`\`\`json
"features": [
{
"id": "#{nwo}/#{featureId}@#{versionTag}",
"options": {
"version": "latest"
}
}
]
\`\`\`
## Options
#{optionsTable}
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
`;
/***/ }),
/***/ 3109: /***/ 3109:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
...@@ -40,12 +183,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge ...@@ -40,12 +183,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
}; };
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
const core = __importStar(__nccwpck_require__(2186)); const core = __importStar(__nccwpck_require__(2186));
const generateDocs_1 = __nccwpck_require__(6204);
const utils_1 = __nccwpck_require__(918); const utils_1 = __nccwpck_require__(918);
function run() { function run() {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
core.debug('Reading input parameters...'); core.debug('Reading input parameters...');
// 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 shouldPublishTemplate = core.getInput('publish-templates').toLowerCase() === 'true';
const shouldGenerateDocumentation = core.getInput('generate-docs').toLowerCase() === 'true';
if (shouldPublishFeatures) { if (shouldPublishFeatures) {
core.info('Publishing features...'); core.info('Publishing features...');
const featuresBasePath = core.getInput('base-path-to-features'); const featuresBasePath = core.getInput('base-path-to-features');
...@@ -56,6 +202,17 @@ function run() { ...@@ -56,6 +202,17 @@ function run() {
const basePathToDefinitions = core.getInput('base-path-to-templates'); const basePathToDefinitions = core.getInput('base-path-to-templates');
yield packageTemplates(basePathToDefinitions); yield packageTemplates(basePathToDefinitions);
} }
if (shouldGenerateDocumentation) {
core.info('Generating documentation...');
const featuresBasePath = core.getInput('base-path-to-features');
if (featuresBasePath) {
yield (0, generateDocs_1.generateFeaturesDocumentation)(featuresBasePath);
}
else {
core.error("'base-path-to-features' input is required to generate documentation");
}
// TODO: base-path-to-templates
}
// TODO: Programatically add feature/template fino with relevant metadata for UX clients. // TODO: Programatically add feature/template fino with relevant metadata for UX clients.
core.info('Generation metadata file: devcontainer-collection.json'); core.info('Generation metadata file: devcontainer-collection.json');
yield (0, utils_1.addCollectionsMetadataFile)(); yield (0, utils_1.addCollectionsMetadataFile)();
......
This source diff could not be displayed because it is too large. You can view the blob instead.
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
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 });
exports.generateFeaturesDocumentation = void 0;
const fs = __importStar(require("fs"));
const github = __importStar(require("@actions/github"));
const core = __importStar(require("@actions/core"));
const path = __importStar(require("path"));
function generateFeaturesDocumentation(basePath) {
return __awaiter(this, void 0, void 0, function* () {
fs.readdir(basePath, (err, files) => {
if (err) {
core.error(err.message);
core.setFailed(`failed to generate 'features' documentation ${err.message}`);
return;
}
files.forEach(f => {
core.info(`Generating docs for feature '${f}'`);
if (f !== '.' && f !== '..') {
const readmePath = path.join(basePath, f, 'README.md');
// Reads in feature.json
const featureJsonPath = path.join(basePath, f, 'devcontainer-feature.json');
if (!fs.existsSync(featureJsonPath)) {
core.error(`devcontainer-feature.json not found at path '${featureJsonPath}'`);
return;
}
let featureJson = undefined;
try {
featureJson = JSON.parse(fs.readFileSync(featureJsonPath, 'utf8'));
}
catch (err) {
core.error(`Failed to parse ${featureJsonPath}: ${err}`);
return;
}
if (!featureJson || !(featureJson === null || featureJson === void 0 ? void 0 : featureJson.id)) {
core.error(`devcontainer-feature.json for feature '${f}' does not contain an 'id'`);
return;
}
const ref = github.context.ref;
const owner = github.context.repo.owner;
const repo = github.context.repo.repo;
// Add tag if parseable
let versionTag = 'latest';
if (ref.includes('refs/tags/')) {
versionTag = ref.replace('refs/tags/', '');
}
const generateOptionsMarkdown = () => {
const options = featureJson === null || featureJson === void 0 ? void 0 : featureJson.options;
if (!options) {
return '';
}
const keys = Object.keys(options);
const contents = keys
.map(k => {
const val = options[k];
return `| ${k} | ${val.description || '-'} | ${val.type || '-'} | ${val.default || '-'} |`;
})
.join('\n');
return ('| Options Id | Description | Type | Default Value |\n' +
'|-----|-----|-----|-----|\n' +
contents);
};
const newReadme = README_TEMPLATE.replace('#{nwo}', `${owner}/${repo}`)
.replace('#{versionTag}', versionTag)
.replace('#{featureId}', featureJson.id)
.replace('#{featureName}', featureJson.name
? `${featureJson.name} (${featureJson.id})`
: `${featureJson.id}`)
.replace('#{featureDescription}', featureJson.description ? featureJson.description : '')
.replace('#{optionsTable}', generateOptionsMarkdown());
// Remove previous readme
if (fs.existsSync(readmePath)) {
fs.unlinkSync(readmePath);
}
// Write new readme
fs.writeFileSync(readmePath, newReadme);
}
});
});
});
}
exports.generateFeaturesDocumentation = generateFeaturesDocumentation;
const README_TEMPLATE = `
# #{featureName}
#{featureDescription}
## Example Usage
\`\`\`json
"features": [
{
"id": "#{nwo}/#{featureId}@#{versionTag}",
"options": {
"version": "latest"
}
}
]
\`\`\`
## Options
#{optionsTable}
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
`;
...@@ -33,12 +33,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge ...@@ -33,12 +33,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
const core = __importStar(require("@actions/core")); const core = __importStar(require("@actions/core"));
const generateDocs_1 = require("./generateDocs");
const utils_1 = require("./utils"); const utils_1 = require("./utils");
function run() { function run() {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
core.debug('Reading input parameters...'); core.debug('Reading input parameters...');
// 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 shouldPublishTemplate = core.getInput('publish-templates').toLowerCase() === 'true';
const shouldGenerateDocumentation = core.getInput('generate-docs').toLowerCase() === 'true';
if (shouldPublishFeatures) { if (shouldPublishFeatures) {
core.info('Publishing features...'); core.info('Publishing features...');
const featuresBasePath = core.getInput('base-path-to-features'); const featuresBasePath = core.getInput('base-path-to-features');
...@@ -49,6 +52,17 @@ function run() { ...@@ -49,6 +52,17 @@ function run() {
const basePathToDefinitions = core.getInput('base-path-to-templates'); const basePathToDefinitions = core.getInput('base-path-to-templates');
yield packageTemplates(basePathToDefinitions); yield packageTemplates(basePathToDefinitions);
} }
if (shouldGenerateDocumentation) {
core.info('Generating documentation...');
const featuresBasePath = core.getInput('base-path-to-features');
if (featuresBasePath) {
yield (0, generateDocs_1.generateFeaturesDocumentation)(featuresBasePath);
}
else {
core.error("'base-path-to-features' input is required to generate documentation");
}
// TODO: base-path-to-templates
}
// TODO: Programatically add feature/template fino with relevant metadata for UX clients. // TODO: Programatically add feature/template fino with relevant metadata for UX clients.
core.info('Generation metadata file: devcontainer-collection.json'); core.info('Generation metadata file: devcontainer-collection.json');
yield (0, utils_1.addCollectionsMetadataFile)(); yield (0, utils_1.addCollectionsMetadataFile)();
......
...@@ -8,6 +8,6 @@ rm ./action.yml ...@@ -8,6 +8,6 @@ rm ./action.yml
rm -rf ./dist rm -rf ./dist
rm -rf ./lib rm -rf ./lib
cp /home/codespace/ci/action.yml ./action.yml cp /home/codespace/action/action.yml ./action.yml
cp -r /home/codespace/ci/dist ./dist cp -r /home/codespace/action/dist ./dist
cp -r /home/codespace/ci/lib ./lib cp -r /home/codespace/action/lib ./lib
\ No newline at end of file \ No newline at end of file
...@@ -22,7 +22,7 @@ jobs: ...@@ -22,7 +22,7 @@ jobs:
run: sudo apt install tree -y && tree run: sudo apt install tree -y && tree
- name: Generate tgz - name: Generate tgz
uses: microsoft/publish-dev-container-features-action@main # devcontainers/action uses: microsoft/publish-dev-container-features-action@main
with: with:
publish-features: "true" publish-features: "true"
path-to-features: "./src" path-to-features: "./src"
......
...@@ -12,7 +12,7 @@ jobs: ...@@ -12,7 +12,7 @@ jobs:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Generate tgz - name: Generate tgz
uses: ./.github/devcontainers-action # devcontainers/ci uses: ./.github/devcontainers-action # devcontainers/action
with: with:
publish-features: "true" publish-features: "true"
base-path-to-features: "./src" base-path-to-features: "./src"
......
name: "Update Documentation"
on:
push:
branches:
- main
workflow_dispatch:
jobs:
generate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Generate Documentation
uses: ./.github/devcontainers-action # devcontainers/action
with:
generate-docs: "true"
base-path-to-features: "./src"
- name: Add and Commit Documentation
id: push_image_info
run: |
set -e
echo "Start."
GIT_BRANCH=$(echo "${{ github.ref }}" | grep -oP 'refs/(heads|tags)/\K(.+)')
if [ "$GIT_BRANCH" == "" ]; then
echo "ERR: Could not determine branch."
exit 1
fi
echo "GIT_BRANCH = ${GIT_BRANCH}"
git config --global user.email "vscr-feedback@microsoft.com"
git config --global user.name "Devcontainers CI"
git config pull.rebase false
# # Pull in anything that may have come in
# git pull "https://ci:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}" "HEAD:$GIT_BRANCH"
# Add / update and commit
git add */**/README.md
git status
git commit -m 'Automated documentation update' || export NO_UPDATES=true
# Push
if [ "$NO_UPDATES" != "true" ] ; then
git push "https://ci:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}" "HEAD:$GIT_BRANCH"
fi
\ No newline at end of file
# Anaconda (anaconda)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/anaconda@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select or enter an anaconda version. | string | latest |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# AWS CLI (aws-cli)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/aws-cli@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select or enter an AWS CLI version. (Available versions here: https://github.com/aws/aws-cli/blob/v2/CHANGELOG.rst) | string | latest |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# Azure CLI (azure-cli)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/azure-cli@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select or enter an Azure CLI version. (Available versions may vary by Linux distribution.) | string | latest |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# common (common)
common
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/common@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| install_Zsh | Install ZSH? | boolean | true |
| install_Oh_My_Zsh | Install Oh My Zsh!? | boolean | true |
| upgrade_packages | Upgrade OS packages? | boolean | true |
| username | Enter name of non-root user to configure or none to skip | string | automatic |
| user_uid | Enter uid for non-root user | string | automatic |
| user_gid | Enter gid for non-root user | string | automatic |
| add_non_free_packages | Add packages from non-free Debian repository? | boolean | - |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# Light-weight desktop (Fluxbox) (desktop-lite)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/desktop-lite@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Currently Unused! | string | latest |
| novnc_version | NoVnc Version | string | 1.2.0 |
| vnc_password | Enter a password for desktop connections | string | vscode |
| novnc_port | Enter a port for the VNC web client | string | 6080 |
| vnc_port | Enter a port for the desktop VNC server | string | 5901 |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# Docker (Moby) support, reuse host Docker Engine (Docker-from-Docker) (docker-from-docker)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/docker-from-docker@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select or enter a Docker/Moby CLI version. (Availability can vary by OS version.) | string | latest |
| moby | Install OSS Moby build instead of Docker CE | boolean | true |
| docker_dash_compose_version | Compose version to use for docker-compose (v1 or v2) | string | v1 |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# Docker (Moby) support (Docker-in-Docker) (docker-in-docker)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/docker-in-docker@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select or enter a Docker/Moby Engine version. (Availability can vary by OS version.) | string | latest |
| moby | Install OSS Moby build instead of Docker CE | boolean | true |
| docker_dash_compose_version | Default version of Docker Compose (v1 or v2) | string | v1 |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# Dotnet CLI (dotnet)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/dotnet@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select or enter a dotnet CLI version. (Available versions may vary by Linux distribution.) | string | latest |
| runtime_only | Install just the dotnet runtime if true, and sdk if false. | boolean | - |
| override_default_version | If true, overrides existing version (if any) of dotnet on the PATH | boolean | true |
| install_using_apt | If true, it installs using apt instead of the release URL | boolean | true |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# Git Large File Support (LFS) (git-lfs)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/git-lfs@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select version of Git LFS to install | string | latest |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# Git (may require compilation) (git)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/git@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select or enter a Git version. | string | os-provided |
| ppa | Install from PPA if available | boolean | true |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# GitHub CLI (github-cli)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/github-cli@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select version of the GitHub CLI, if not latest. | string | latest |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# Go (go)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/go@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select or enter a Go version to install | string | latest |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# Hugo (hugo)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/hugo@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select or enter a version. | string | latest |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# Java (via SDKMAN!) (java)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/java@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select or enter a Java version to install | string | lts |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# Kubectl, Helm, and Minkube (kubectl-helm-minikube)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/kubectl-helm-minikube@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select or enter a Kubernetes version to install | string | latest |
| helm | Select or enter a Helm version to install | string | latest |
| minikube | Select or enter a Minikube version to install | string | latest |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# Node.js (via nvm) and yarn (node)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/node@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select or enter a Node.js version to install | string | lts |
| install_tools_for_node_gyp | Install dependencies to compile native node modules (node-gyp)? | boolean | true |
| nvm_install_path | The path where NVM will be installed. | string | /usr/local/share/nvm |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# Oryx (oryx)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/oryx@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# PHP (php)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/php@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select or enter a PHP version | string | latest |
| install_composer | Install PHP Composer? | boolean | true |
| override_default_version | If true, overrides existing version (if any) of dotnet on the PATH | boolean | true |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# PowerShell (powershell)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/powershell@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select or enter a version of PowerShell. | string | latest |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# Python (may require compilation) (python)
Python (may require compilation)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/python@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select a Python version to install. | string | os-provided |
| install_python_tools | Install common Python tools like pylint | boolean | true |
| optimize | Optimize Python for performance when compiled (slow) | boolean | - |
| installPath | The path where python will be installed. | string | /usr/local/python |
| override_default_version | If true, overrides existing version (if any) of python on the PATH | boolean | true |
| install_jupyterlab | Install JupyterLab, a web-based interactive development environment for notebooks | boolean | - |
| configure_jupyterlab_allow_origin | Configure JupyterLab to accept HTTP requests from the specified origin | string | - |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# Ruby (via rvm) (ruby)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/ruby@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select or enter a Ruby version to install | string | latest |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# Rust (rust)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/rust@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select or enter a version of Rust to install. | string | latest |
| profile | Select a rustup install profile. | string | minimal |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# SSH server (sshd)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/sshd@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Currently unused. | string | latest |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
# Terraform, tflint, and TFGrunt (terraform)
## Example Usage
```json
"features": [
{
"id": "devcontainers/features/terraform@latest",
"options": {
"version": "latest"
}
}
]
```
## Options
| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Terraform version | string | latest |
| tflint | Tflint version | string | latest |
| terragrunt | Terragrunt version | string | latest |
---
_Note: This file was auto-generated from the [devcontainer-feature.json](./devcontainer-feature.json)._
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
"enabled": true, "enabled": true,
"args": [] "args": []
}, },
"azureTerraform.terminal": "integrated", "azureTerraform.terminal": "integrated"
}, },
"install": { "install": {
"app": "", "app": "",
......
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