|
1 | | -# Dev Container Features: Self Authoring Template |
| 1 | +# Dev Container Features: CodeMan99 |
2 | 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). |
| 3 | +Provides reusable tools for as devcontainer features. |
6 | 4 |
|
7 | | -## Example Contents |
| 5 | +## CircleCI CLI |
8 | 6 |
|
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. |
| 7 | +Provides the `circleci` command at the shell. Using this tool requires authentication. |
10 | 8 |
|
11 | | -### `hello` |
12 | | - |
13 | | -Running `hello` inside the built container will print the greeting provided to it via its `greeting` option. |
14 | | - |
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 | | -``` |
25 | | - |
26 | | -```bash |
27 | | -$ hello |
28 | | - |
29 | | -Hello, user. |
30 | | -``` |
31 | | - |
32 | | -### `color` |
33 | | - |
34 | | -Running `color` inside the built container will print your favorite color to standard out. |
35 | | - |
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 | | -``` |
46 | | - |
47 | | -```bash |
48 | | -$ color |
49 | | - |
50 | | -my favorite color is green |
51 | | -``` |
52 | | - |
53 | | -## Repo and Feature Structure |
54 | | - |
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`. |
56 | | - |
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 | | -... |
| 9 | +```shell |
| 10 | +circleci setup |
69 | 11 | ``` |
70 | 12 |
|
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. |
| 13 | +Please visit CircleCI's [local pipeline development](https://circleci.com/blog/local-pipeline-development/) blog post for further usage information. |
72 | 14 |
|
73 | | -### Options |
| 15 | +## Exercism CLI |
74 | 16 |
|
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). |
| 17 | +Provides the `exercism` command at the shell. Using this tool requires authentication. |
76 | 18 |
|
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". |
78 | | - |
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 | | -} |
| 19 | +```shell |
| 20 | +exercism configure --token=[TOKEN] |
95 | 21 | ``` |
96 | 22 |
|
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). |
98 | | - |
99 | | -```bash |
100 | | -#!/bin/bash |
101 | | - |
102 | | -echo "Activating feature 'color'" |
103 | | -echo "The provided favorite color is: ${FAVORITE}" |
104 | | - |
105 | | -... |
106 | | -``` |
107 | | - |
108 | | -## Distributing Features |
109 | | - |
110 | | -### Versioning |
111 | | - |
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). |
113 | | - |
114 | | -### Publishing |
115 | | - |
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. 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: |
123 | | - |
124 | | -``` |
125 | | -ghcr.io/devcontainers/feature-starter/color:1 |
126 | | -ghcr.io/devcontainers/feature-starter/hello:1 |
127 | | -``` |
128 | | - |
129 | | -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. |
130 | | - |
131 | | -'`devcontainers/feature-starter`' is known as the feature collection namespace. |
132 | | - |
133 | | -### Marking Feature Public |
134 | | - |
135 | | -Note that by default, GHCR packages are marked as `private`. To stay within the free tier, Features need to be marked as `public`. |
136 | | - |
137 | | -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: |
138 | | - |
139 | | -``` |
140 | | -https://github.com/users/<owner>/packages/container/<repo>%2F<featureName>/settings |
141 | | -``` |
142 | | - |
143 | | -<img width="669" alt="image" src="https://user-images.githubusercontent.com/23246594/185244705-232cf86a-bd05-43cb-9c25-07b45b3f4b04.png"> |
144 | | - |
145 | | -### Adding Features to the Index |
146 | | - |
147 | | -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: |
148 | | - |
149 | | -* Go to [github.com/devcontainers/devcontainers.github.io](https://github.com/devcontainers/devcontainers.github.io) |
150 | | - * This is the GitHub repo backing the [containers.dev](https://containers.dev/) spec site |
151 | | -* Open a PR to modify the [collection-index.yml](https://github.com/devcontainers/devcontainers.github.io/blob/gh-pages/_data/collection-index.yml) file |
152 | | - |
153 | | -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. |
154 | | - |
155 | | -#### Using private Features in Codespaces |
156 | | - |
157 | | -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. |
158 | | - |
159 | | -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` |
160 | | - |
161 | | -An example `devcontainer.json` can be found below. |
162 | | - |
163 | | -```jsonc |
164 | | -{ |
165 | | - "image": "mcr.microsoft.com/devcontainers/base:ubuntu", |
166 | | - "features": { |
167 | | - "ghcr.io/my-org/private-features/hello:1": { |
168 | | - "greeting": "Hello" |
169 | | - } |
170 | | - }, |
171 | | - "customizations": { |
172 | | - "codespaces": { |
173 | | - "repositories": { |
174 | | - "my-org/private-features": { |
175 | | - "permissions": { |
176 | | - "packages": "read", |
177 | | - "contents": "read" |
178 | | - } |
179 | | - } |
180 | | - } |
181 | | - } |
182 | | - } |
183 | | -} |
184 | | -``` |
| 23 | +Please visit Exercism's [working locally](https://exercism.org/docs/using/solving-exercises/working-locally) documentation for further usage information. |
0 commit comments