|
1 |
| -# Dev Container Features: Self Authoring Template |
2 |
| - |
3 |
| -> This repo provides a starting point and example for creating your own custom [dev container Features](https://containers.dev/implementors/features/), hosted for free on GitHub Container Registry. The example in this repository follows the [dev container Feature distribution specification](https://containers.dev/implementors/features-distribution/). |
4 |
| -> |
5 |
| -> To provide feedback to the specification, please leave a comment [on spec issue #70](https://github.com/devcontainers/spec/issues/70). For more broad feedback regarding dev container Features, please see [spec issue #61](https://github.com/devcontainers/spec/issues/61). |
6 |
| -
|
7 |
| -## Example Contents |
8 |
| - |
9 |
| -This repository contains a _collection_ of two Features - `hello` and `color`. These Features serve as simple feature implementations. Each sub-section below shows a sample `devcontainer.json` alongside example usage of the Feature. |
| 1 | +# Dev Container Features |
10 | 2 |
|
11 |
| -### `hello` |
| 3 | +This repository contains a collection of features that can be used to enhance the development experience in a [Visual Studio Code Dev Container](https://code.visualstudio.com/docs/remote/containers). The features are organized in separate folders and can be used individually. |
12 | 4 |
|
13 |
| -Running `hello` inside the built container will print the greeting provided to it via its `greeting` option. |
| 5 | +## Features Overview |
14 | 6 |
|
15 |
| -```jsonc |
16 |
| -{ |
17 |
| - "image": "mcr.microsoft.com/devcontainers/base:ubuntu", |
18 |
| - "features": { |
19 |
| - "ghcr.io/devcontainers/feature-starter/hello:1": { |
20 |
| - "greeting": "Hello" |
21 |
| - } |
22 |
| - } |
23 |
| -} |
24 |
| -``` |
| 7 | +### GitVersion |
25 | 8 |
|
26 |
| -```bash |
27 |
| -$ hello |
| 9 | +The [GitVersion](./src/gitversion/) feature installs GitVersion in the dev container. GitVersion is a tool that calculates a version number based on the Git history. The version number is written to a file that can be used in the build process. |
28 | 10 |
|
29 |
| -Hello, user. |
30 |
| -``` |
| 11 | +Originally, GitVersion was designed to be used in a CI/CD pipeline. However, it can also be used in a dev container to calculate the version number of the application. |
31 | 12 |
|
32 |
| -### `color` |
| 13 | +More information about GitVersion can be found on the [GitVersion GitHub page](https://github.com/GitTools/GitVersion). |
33 | 14 |
|
34 |
| -Running `color` inside the built container will print your favorite color to standard out. |
| 15 | +### GitUtils |
35 | 16 |
|
36 |
| -```jsonc |
37 |
| -{ |
38 |
| - "image": "mcr.microsoft.com/devcontainers/base:ubuntu", |
39 |
| - "features": { |
40 |
| - "ghcr.io/devcontainers/feature-starter/color:1": { |
41 |
| - "favorite": "green" |
42 |
| - } |
43 |
| - } |
44 |
| -} |
45 |
| -``` |
| 17 | +The [GitUtils](./src/gitutils/) feature installs a collection of Git utilities in the dev container. The utilities are useful for automating Git workflows. |
46 | 18 |
|
47 |
| -```bash |
48 |
| -$ color |
| 19 | +The following utilities are included: [./src/gitutils/alias.json](./src/gitutils/alias.json) |
49 | 20 |
|
50 |
| -my favorite color is green |
51 |
| -``` |
| 21 | +#### Interactive Utilities |
52 | 22 |
|
53 |
| -## Repo and Feature Structure |
| 23 | +- `git fixup` - Amend the specified commit with current changes and rebase |
54 | 24 |
|
55 |
| -Similar to the [`devcontainers/features`](https://github.com/devcontainers/features) repo, this repository has a `src` folder. Each Feature has its own sub-folder, containing at least a `devcontainer-feature.json` and an entrypoint script `install.sh`. |
| 25 | +#### GitFlow |
56 | 26 |
|
57 |
| -``` |
58 |
| -├── src |
59 |
| -│ ├── hello |
60 |
| -│ │ ├── devcontainer-feature.json |
61 |
| -│ │ └── install.sh |
62 |
| -│ ├── color |
63 |
| -│ │ ├── devcontainer-feature.json |
64 |
| -│ │ └── install.sh |
65 |
| -| ├── ... |
66 |
| -│ │ ├── devcontainer-feature.json |
67 |
| -│ │ └── install.sh |
68 |
| -... |
69 |
| -``` |
| 27 | +Additionnaly, the feature installs the [git-flow](https:://github.com/nvie/gitflow) extension and sets up the Git configuration to use it. |
70 | 28 |
|
71 |
| -An [implementing tool](https://containers.dev/supporting#tools) will composite [the documented dev container properties](https://containers.dev/implementors/features/#devcontainer-feature-json-properties) from the feature's `devcontainer-feature.json` file, and execute in the `install.sh` entrypoint script in the container during build time. Implementing tools are also free to process attributes under the `customizations` property as desired. |
| 29 | +Shortcuts are also added to the `git` command to make it easier to use the `git-flow` commands: |
72 | 30 |
|
73 |
| -### Options |
| 31 | +- `git beta` is a shortcut for `git flow release start` |
| 32 | +- `git hfix` is a shortcut for `git flow hotfix start` |
| 33 | +- `git prod` is a shortcut for `git flow release finish` and `git flow hotfix finish` |
74 | 34 |
|
75 |
| -All available options for a Feature should be declared in the `devcontainer-feature.json`. The syntax for the `options` property can be found in the [devcontainer Feature json properties reference](https://containers.dev/implementors/features/#devcontainer-feature-json-properties). |
| 35 | +Those shortcuts work in cunjunction with the `gitversion` utility to automatically update the version number of the application. |
76 | 36 |
|
77 |
| -For example, the `color` feature provides an enum of three possible options (`red`, `gold`, `green`). If no option is provided in a user's `devcontainer.json`, the value is set to "red". |
| 37 | +### Act |
78 | 38 |
|
79 |
| -```jsonc |
80 |
| -{ |
81 |
| - // ... |
82 |
| - "options": { |
83 |
| - "favorite": { |
84 |
| - "type": "string", |
85 |
| - "enum": [ |
86 |
| - "red", |
87 |
| - "gold", |
88 |
| - "green" |
89 |
| - ], |
90 |
| - "default": "red", |
91 |
| - "description": "Choose your favorite color." |
92 |
| - } |
93 |
| - } |
94 |
| -} |
95 |
| -``` |
| 39 | +The [Act](./src/act/) feature installs the [nektos/act] tool in the dev container. Act is a tool that allows you to run GitHub Actions locally. |
96 | 40 |
|
97 |
| -Options are exported as Feature-scoped environment variables. The option name is captialized and sanitized according to [option resolution](https://containers.dev/implementors/features/#option-resolution). |
| 41 | +Originally, Act was designed to be used in a CI/CD pipeline. However, it can also be used in a dev container to test GitHub Actions locally. |
98 | 42 |
|
99 |
| -```bash |
100 |
| -#!/bin/bash |
| 43 | +More information about Act can be found on the [Act GitHub page](https://github.com/nektos/act). |
101 | 44 |
|
102 |
| -echo "Activating feature 'color'" |
103 |
| -echo "The provided favorite color is: ${FAVORITE}" |
| 45 | +### PECL |
104 | 46 |
|
105 |
| -... |
106 |
| -``` |
| 47 | +The [PECL](./src/pecl/) feature installs the PHP Extension Community Library (PECL) in the dev container. PECL is a repository for PHP extensions. |
107 | 48 |
|
108 |
| -## Distributing Features |
| 49 | +More information about PECL can be found on the [PECL website](https://pecl.php.net/). |
109 | 50 |
|
110 |
| -### Versioning |
| 51 | +## Contributing |
111 | 52 |
|
112 |
| -Features are individually versioned by the `version` attribute in a Feature's `devcontainer-feature.json`. Features are versioned according to the semver specification. More details can be found in [the dev container Feature specification](https://containers.dev/implementors/features/#versioning). |
| 53 | +If you have a feature that you would like to add to this repository, please open an issue or submit a pull request. |
113 | 54 |
|
114 |
| -### Publishing |
| 55 | +## License |
115 | 56 |
|
116 |
| -> NOTE: The Distribution spec can be [found here](https://containers.dev/implementors/features-distribution/). |
117 |
| -> |
118 |
| -> While any registry [implementing the OCI Distribution spec](https://github.com/opencontainers/distribution-spec) can be used, this template will leverage GHCR (GitHub Container Registry) as the backing registry. |
119 |
| -
|
120 |
| -Features are meant to be easily sharable units of dev container configuration and installation code. |
121 |
| - |
122 |
| -This repo contains a **GitHub Action** [workflow](.github/workflows/release.yaml) that will publish each Feature to GHCR. |
123 |
| - |
124 |
| -*Allow GitHub Actions to create and approve pull requests* should be enabled in the repository's `Settings > Actions > General > Workflow permissions` for auto generation of `src/<feature>/README.md` per Feature (which merges any existing `src/<feature>/NOTES.md`). |
125 |
| - |
126 |
| -By default, each Feature will be prefixed with the `<owner/<repo>` namespace. For example, the two Features in this repository can be referenced in a `devcontainer.json` with: |
127 |
| - |
128 |
| -``` |
129 |
| -ghcr.io/devcontainers/feature-starter/color:1 |
130 |
| -ghcr.io/devcontainers/feature-starter/hello:1 |
131 |
| -``` |
132 |
| - |
133 |
| -The provided GitHub Action will also publish a third "metadata" package with just the namespace, eg: `ghcr.io/devcontainers/feature-starter`. This contains information useful for tools aiding in Feature discovery. |
134 |
| - |
135 |
| -'`devcontainers/feature-starter`' is known as the feature collection namespace. |
136 |
| - |
137 |
| -### Marking Feature Public |
138 |
| - |
139 |
| -Note that by default, GHCR packages are marked as `private`. To stay within the free tier, Features need to be marked as `public`. |
140 |
| - |
141 |
| -This can be done by navigating to the Feature's "package settings" page in GHCR, and setting the visibility to 'public`. The URL may look something like: |
142 |
| - |
143 |
| -``` |
144 |
| -https://github.com/users/<owner>/packages/container/<repo>%2F<featureName>/settings |
145 |
| -``` |
146 |
| - |
147 |
| -<img width="669" alt="image" src="https://user-images.githubusercontent.com/23246594/185244705-232cf86a-bd05-43cb-9c25-07b45b3f4b04.png"> |
148 |
| - |
149 |
| -### Adding Features to the Index |
150 |
| - |
151 |
| -If you'd like your Features to appear in our [public index](https://containers.dev/features) so that other community members can find them, you can do the following: |
152 |
| - |
153 |
| -* Go to [github.com/devcontainers/devcontainers.github.io](https://github.com/devcontainers/devcontainers.github.io) |
154 |
| - * This is the GitHub repo backing the [containers.dev](https://containers.dev/) spec site |
155 |
| -* Open a PR to modify the [collection-index.yml](https://github.com/devcontainers/devcontainers.github.io/blob/gh-pages/_data/collection-index.yml) file |
156 |
| - |
157 |
| -This index is from where [supporting tools](https://containers.dev/supporting) like [VS Code Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) and [GitHub Codespaces](https://github.com/features/codespaces) surface Features for their dev container creation UI. |
158 |
| - |
159 |
| -#### Using private Features in Codespaces |
160 |
| - |
161 |
| -For any Features hosted in GHCR that are kept private, the `GITHUB_TOKEN` access token in your environment will need to have `package:read` and `contents:read` for the associated repository. |
162 |
| - |
163 |
| -Many implementing tools use a broadly scoped access token and will work automatically. GitHub Codespaces uses repo-scoped tokens, and therefore you'll need to add the permissions in `devcontainer.json` |
164 |
| - |
165 |
| -An example `devcontainer.json` can be found below. |
166 |
| - |
167 |
| -```jsonc |
168 |
| -{ |
169 |
| - "image": "mcr.microsoft.com/devcontainers/base:ubuntu", |
170 |
| - "features": { |
171 |
| - "ghcr.io/my-org/private-features/hello:1": { |
172 |
| - "greeting": "Hello" |
173 |
| - } |
174 |
| - }, |
175 |
| - "customizations": { |
176 |
| - "codespaces": { |
177 |
| - "repositories": { |
178 |
| - "my-org/private-features": { |
179 |
| - "permissions": { |
180 |
| - "packages": "read", |
181 |
| - "contents": "read" |
182 |
| - } |
183 |
| - } |
184 |
| - } |
185 |
| - } |
186 |
| - } |
187 |
| -} |
188 |
| -``` |
| 57 | +This repository is licensed under the [MIT License](./LICENSE). |
0 commit comments