From 4ebfb3af506e3770868d3dde8b9961df0250c030 Mon Sep 17 00:00:00 2001 From: unforswearing Date: Thu, 30 Mar 2023 16:57:26 -0400 Subject: [PATCH 01/44] Added draft of Coder and Nix article --- posts/coder-and-nix/index.md | 136 +++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 posts/coder-and-nix/index.md diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md new file mode 100644 index 0000000..a66ff9a --- /dev/null +++ b/posts/coder-and-nix/index.md @@ -0,0 +1,136 @@ +--- +outline: coder/0_nix_and_coder_outline.md +reference: [ + https://coder.com/blog/it-s-works-on-my-machine-explained, + https://coder.com/blog/managing-templates-in-coder, + https://coder.com/blog/personalizing-coder, + https://coder.com/blog/not-a-container, + https://coder.com/blog/coder-101-how-coder-works-at-a-higher-level, + https://github.com/coder/code-server/issues/258, + https://github.com/coder/coder/blob/main/flake.nix, + https://coder.com/blog/how-our-development-team-shares-one-giant-bare-metal-machine +] +notes: + - Focus on what each is -- Coder, Nix, Docker + - Focus on using Nix with Docker + - Mention Coder uses Nix for development + - Conclude with Coder is flexible, etc +--- + +# Coder and Nix + +## What is Coder + +[Coder](https://coder.com) is an Open Source remote development platform that allows you to share an environment with your entire development team. Coder [eliminates many common issues](https://coder.com/why) with remote development by creating a shared environment for all your resources that is designed to streamline the development process for any type of development -- from DevOps and IT to Data Scientists. Additionally Coder is available through many of the popular cloud providers, allowing you to develop from anywhere using just about any machine. + +Since Coder is designed to be a shared development platform for your team, it makes sense that Coder would work well with a tool like Nix. In fact, the team at [Coder uses Nix](https://coder.com/docs/v2/latest/CONTRIBUTING#requirements) for our development process + +## What is Nix? + +Nix is a tool and operating system that treats every environment, including the os, as a list of dependencies. The Nix toolchain was created with the understanding that all software depends on other software to function. Because of this, Nix can let you set up your environment as easily as declaring a list of dependencies. And according to [nix.dev](https://nix.dev/) this ecosystem aims to achieve reproducible development environments, easy transfer of software environments between computers, and atomic upgrades and rollbacks. + +You can get started with the Nix package manager immediately on any OS platform. Instructions for installing Nix on your system are located at the [nix installation guide](https://nixos.org/download.html). + +Nix is a very robust, and at times complicated, platform. This article will attempt to describe how to use Nix with Coder at a high level. For additional information about Nix, please visit [https://nixos.org/](https://nixos.org/). + +### Benefits to using Nix + +At its core, Nix aims to provide packges that are reproducible by isolating each package build. This means that the dependencies in each pacakge exist in a separate environment from other packages. Nix is somewhat unique in that you may use the package management features of Nix without the full OS, allowing you to install Nix packages on just about any base system. Best of all, Nix can allow you to delcare a default configuration for your system which can be transferred to any new machine using the Nix flake file. You can search for Nix packages at [search.nixos.org](https://search.nixos.org/). + +The reproducibility of Nix environments allows development teams allowing developers to share configuration with teams [and contributors](https://coder.com/docs/v2/latest/CONTRIBUTING#requirements). Declarative with Nix environments ensures that the environment will contain the same resources and tools for each developer on your team. + +Developers working with Nix won't have to worry about their builds failing due to outdated dependencies and can save time by avoiding resource-intensive workarounds. If you do happen to encounter an error with your Nix configuration you can roll back your Nix flake to the previous version to ensure your team can get work done right away. + +## What About Docker? + +There are many benefits to using Docker to manage your development environment. You can prepare a Docker image with all the tooling needed to work on your app and have it ready to go with a simple `docker run` command. This environment ensures that all developers on your team are using the same version of the languages and resources that you need to maintain your application. + +Docker also helps to abstract away the gritty details of using a particular service or language. With Docker you wont need to manage each process independently - it is all included in the docker image. Docker is great for deploying applications, but it gets a bit complicated when using Docker to develop them. And using the same environment to develop and deploy your application can get very complicated very quickly. Each additional layer of complexity added to the development environment is another thing that can break without warning. + +However mixing this infrastructure with the development environment can sometimes limit the developers ability to use the tools they are comfortable with. Developers must give up their preferred shell configuration and tooling in favor of a base set of tools and settings determined by the infrastructure. Of course many developers can pick up new tooling without much difficulty, but having a top-down approach to the development environment means not only are these tools fixed for the project, they may eventually break if the resources in the dockerfile become outdated. + +Additionally, Docker requires that your team understands Docker and how it works to some degree. This is particularly important if something does happen to break within Docker -- your development team has to know how to troubleshoot the issue before they can resolve it. This is particularly difficult since Docker works differently between platforms. An issue one team member may have on Windows can be vastly different from issues MacOS based developers may face. There is a potential for a huge amount of lost productivity when these issues come up, both in time and brainpower spent trying to fix the issue. And when its only your setup that doesn't work with Docker you find yourself facing the [it works on my machine](https://coder.com/blog/it-s-works-on-my-machine-explained) problem. + +You may also need to develop within the container itself, and you may loose your own personal development configuration. This configuration could be added to the docker container however your entire team would need to use this config and thus agree on the parts that may or may not be included. This becomes a problem when you have a custom configuration or use different tools than the other members in the team. Yes, you can learn the tools used by the team as a whole, however your productivity may suffer for it. + +Nix solves this problem with the `nix-shell` command, and the associated `shell.nix` configuration files. + +### Bring Your Tools with Nix + +As a developer using Nix as part of a project, you can bring your own tools by using Nix shell. By default, Docker does not allow you to bring your own custom configuration to the development environment. For example, say you have spent some time configuring your shell environment with themes and plugins. To use these tools with Docker you would have to add the shell configuration files to your Docker image, and everyone else on your team would need to use the same shell configuration. This becomes an issue if your teammates don't use the same tools and plugins. In order for you to use your own configuration you would have to maintain your own separate container containing your personal configuration and if that container fails, you are responsible for troubleshooting and fixing everything in order to continue development on your app. + +The nix-shell command resolves many of the uncertainties of the shared development process. You can use nix-shell from the command line by using the nix-shell command directly to install a package. For example, if you use the [fzf](https://github.com/junegunn/fzf) tool as a part of your workflow you can install it using the following command: + +```bash +nix-shell -p fzf + +``` + +The above command will add `fzf` to your local nix store and temporarily modify your $PATH variable to include the command in your shell. `fzf` will be available immediately. + +On the other hand, if you're getting started with nix and want to create an environment that contains many of your favorite tools you can create a `shell.nix` file. This file will contain the commands needed to make the tools available for your current session, and requires the Nix builtin function (nix calls these functions [derivations](https://nixos.org/manual/nix/stable/language/derivations.html)) `mkshell`. The following command will install `zsh`, `fzf`, `autoenv`, and the `powerlevel10k` theme. + +```nix +# shell.nix + +with (import {}); +mkshell { + buildInputs = [ + fzf + zsh + zsh-autoenv + zsh-powerlevel10k + ]; +} +``` + +To use this `shell.nix` file you can run `nix-shell` without any arguments. The `nix-shell` tool will look for this file by default. + +### Adding Your Tools to A Shared `shell.nix` Configuration + +The main benefit over using Docker for shared development environments is that Nix has the ability to extend this shared configuration with your own personal settings. For example, if you want to add your toolchain to a [nodejs.nix development environment](https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/web/nodejs/nodejs.nix), you can modify your `shell.nix` file with the following code. Note that the `nodejs.nix` file is imported as part of the `buildInputs` array. + +```nix +# shell.nix + +with (import {}); +mkshell { + buildInputs = [ + (import ./nodejs.nix { inherit pkgs; }) + fzf + zsh + zsh-autoenv + zsh-powerlevel10k + ]; +} +``` + +Now running the `nix-shell` command will create an environment containing the shared NodeJS nix configuration and your custom toolchain. + +## Using Nix with Coder + +Now that you have your NodeJS environment and custom toolchain setup in `shell.nix`, lets add Coder to your environment. Coder is available as a nix package and can be added to your config as easily as adding the items in your tool chain. Just modify your `shell.nix` file to include the Coder package + +```nix +# shell.nix + +with (import {}); +mkshell { + buildInputs = [ + (import ./nodejs.nix { inherit pkgs; }) + coder + fzf + zsh + zsh-autoenv + zsh-powerlevel10k + ]; +} +``` + +Now when you run `nix-shell` you will have your NodeJS tooling, custom zsh configuration, and Coder available. These tools will be available immediately so you can get to work right away. + +## Conclusion + +In this article you learned a bit about Coder and Nix, and how you can combine the two platforms to create a robust remote development environment that is easily reproducible and can be extended to incorporate your own tools. Nix and Coder both aim to provide developers with a worry-free environment, allowing your team to focus on work and not troubleshooting. + +Get started with Coder now by visiting [https://coder.com/](https://coder.com/). \ No newline at end of file From 3ccfaaf51cdcceccd10a7bdd6715e5e49b1136da Mon Sep 17 00:00:00 2001 From: Alvin Date: Thu, 30 Mar 2023 20:57:47 -0400 Subject: [PATCH 02/44] Updating content, remove yaml header. --- posts/coder-and-nix/index.md | 33 +++++++-------------------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index a66ff9a..ceb560e 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -1,33 +1,14 @@ ---- -outline: coder/0_nix_and_coder_outline.md -reference: [ - https://coder.com/blog/it-s-works-on-my-machine-explained, - https://coder.com/blog/managing-templates-in-coder, - https://coder.com/blog/personalizing-coder, - https://coder.com/blog/not-a-container, - https://coder.com/blog/coder-101-how-coder-works-at-a-higher-level, - https://github.com/coder/code-server/issues/258, - https://github.com/coder/coder/blob/main/flake.nix, - https://coder.com/blog/how-our-development-team-shares-one-giant-bare-metal-machine -] -notes: - - Focus on what each is -- Coder, Nix, Docker - - Focus on using Nix with Docker - - Mention Coder uses Nix for development - - Conclude with Coder is flexible, etc ---- - # Coder and Nix ## What is Coder -[Coder](https://coder.com) is an Open Source remote development platform that allows you to share an environment with your entire development team. Coder [eliminates many common issues](https://coder.com/why) with remote development by creating a shared environment for all your resources that is designed to streamline the development process for any type of development -- from DevOps and IT to Data Scientists. Additionally Coder is available through many of the popular cloud providers, allowing you to develop from anywhere using just about any machine. +[Coder](https://coder.com) is an Open Source remote development platform that allows you to share an environment with your entire development team. Coder [eliminates many common issues](https://coder.com/why) with remote development by creating a shared environment for all your resources that is designed to streamline the development process for any type of development -- from DevOps and IT to Data Scientists. Additionally Coder is available through many of the popular cloud providers, allowing you to develop from anywhere using many different operating systems. Since Coder is designed to be a shared development platform for your team, it makes sense that Coder would work well with a tool like Nix. In fact, the team at [Coder uses Nix](https://coder.com/docs/v2/latest/CONTRIBUTING#requirements) for our development process ## What is Nix? -Nix is a tool and operating system that treats every environment, including the os, as a list of dependencies. The Nix toolchain was created with the understanding that all software depends on other software to function. Because of this, Nix can let you set up your environment as easily as declaring a list of dependencies. And according to [nix.dev](https://nix.dev/) this ecosystem aims to achieve reproducible development environments, easy transfer of software environments between computers, and atomic upgrades and rollbacks. +Nix is a tool and operating system that treats every environment, including the os, as a list of dependencies. The Nix toolchain was created with the understanding that all software depends on other software to function. Because of this, Nix can let you set up your environment by declaring a list of dependencies. And according to [nix.dev](https://nix.dev/) this ecosystem aims to achieve reproducible development environments, seamless transfer of software environments between computers, and atomic upgrades and rollbacks. You can get started with the Nix package manager immediately on any OS platform. Instructions for installing Nix on your system are located at the [nix installation guide](https://nixos.org/download.html). @@ -35,7 +16,7 @@ Nix is a very robust, and at times complicated, platform. This article will atte ### Benefits to using Nix -At its core, Nix aims to provide packges that are reproducible by isolating each package build. This means that the dependencies in each pacakge exist in a separate environment from other packages. Nix is somewhat unique in that you may use the package management features of Nix without the full OS, allowing you to install Nix packages on just about any base system. Best of all, Nix can allow you to delcare a default configuration for your system which can be transferred to any new machine using the Nix flake file. You can search for Nix packages at [search.nixos.org](https://search.nixos.org/). +At its core, Nix aims to provide packges that are reproducible by isolating each package build. This means that the dependencies in each pacakge exist in a separate environment from other packages. Nix is somewhat unique in that you may use the package management features of Nix without the full OS. Best of all, Nix can allow you to delcare a default configuration for your system which can be transferred to any new machine using a shared configuration file. You can search for Nix packages at [search.nixos.org](https://search.nixos.org/). The reproducibility of Nix environments allows development teams allowing developers to share configuration with teams [and contributors](https://coder.com/docs/v2/latest/CONTRIBUTING#requirements). Declarative with Nix environments ensures that the environment will contain the same resources and tools for each developer on your team. @@ -43,11 +24,11 @@ Developers working with Nix won't have to worry about their builds failing due t ## What About Docker? -There are many benefits to using Docker to manage your development environment. You can prepare a Docker image with all the tooling needed to work on your app and have it ready to go with a simple `docker run` command. This environment ensures that all developers on your team are using the same version of the languages and resources that you need to maintain your application. +There are many benefits to using Docker to manage your development environment. You can prepare a Docker image with all the tooling needed to work on your app and have it ready to go with a basic `docker run` command. This environment ensures that all developers on your team are using the same version of the languages and resources that you need to maintain your application. Docker also helps to abstract away the gritty details of using a particular service or language. With Docker you wont need to manage each process independently - it is all included in the docker image. Docker is great for deploying applications, but it gets a bit complicated when using Docker to develop them. And using the same environment to develop and deploy your application can get very complicated very quickly. Each additional layer of complexity added to the development environment is another thing that can break without warning. -However mixing this infrastructure with the development environment can sometimes limit the developers ability to use the tools they are comfortable with. Developers must give up their preferred shell configuration and tooling in favor of a base set of tools and settings determined by the infrastructure. Of course many developers can pick up new tooling without much difficulty, but having a top-down approach to the development environment means not only are these tools fixed for the project, they may eventually break if the resources in the dockerfile become outdated. +However mixing this infrastructure with the development environment can sometimes limit the developers ability to use the tools they are comfortable with. Developers must give up their preferred shell configuration and tooling in favor of a base set of tools and settings determined by the infrastructure. Many developers can pick up new tooling without much difficulty, but having a top-down approach to the development environment means not only are these tools fixed for the project, they may eventually break if the resources in the dockerfile become outdated. Additionally, Docker requires that your team understands Docker and how it works to some degree. This is particularly important if something does happen to break within Docker -- your development team has to know how to troubleshoot the issue before they can resolve it. This is particularly difficult since Docker works differently between platforms. An issue one team member may have on Windows can be vastly different from issues MacOS based developers may face. There is a potential for a huge amount of lost productivity when these issues come up, both in time and brainpower spent trying to fix the issue. And when its only your setup that doesn't work with Docker you find yourself facing the [it works on my machine](https://coder.com/blog/it-s-works-on-my-machine-explained) problem. @@ -109,7 +90,7 @@ Now running the `nix-shell` command will create an environment containing the sh ## Using Nix with Coder -Now that you have your NodeJS environment and custom toolchain setup in `shell.nix`, lets add Coder to your environment. Coder is available as a nix package and can be added to your config as easily as adding the items in your tool chain. Just modify your `shell.nix` file to include the Coder package +Now that you have your NodeJS environment and custom toolchain setup in `shell.nix`, lets add Coder to your environment. Coder is available as a nix package and can be added to your config as the same way you have added your custom software in your tool chain. You can do so by modifying your `shell.nix` file to include the Coder package, like in the example code below: ```nix # shell.nix @@ -131,6 +112,6 @@ Now when you run `nix-shell` you will have your NodeJS tooling, custom zsh confi ## Conclusion -In this article you learned a bit about Coder and Nix, and how you can combine the two platforms to create a robust remote development environment that is easily reproducible and can be extended to incorporate your own tools. Nix and Coder both aim to provide developers with a worry-free environment, allowing your team to focus on work and not troubleshooting. +In this article you learned a bit about Coder and Nix, and how you can combine the two platforms to create a robust remote development environment that is reproducible and can be extended to incorporate your own tools. Nix and Coder both aim to provide developers with a worry-free environment, allowing your team to focus on work and not troubleshooting. Get started with Coder now by visiting [https://coder.com/](https://coder.com/). \ No newline at end of file From b5a97d2e63cab3cfe6c68265a7951493f890ba82 Mon Sep 17 00:00:00 2001 From: Alvin Charity Date: Sat, 15 Apr 2023 15:46:37 -0400 Subject: [PATCH 03/44] Update posts/coder-and-nix/index.md Co-authored-by: Ben Potter --- posts/coder-and-nix/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index ceb560e..5355d3d 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -2,7 +2,7 @@ ## What is Coder -[Coder](https://coder.com) is an Open Source remote development platform that allows you to share an environment with your entire development team. Coder [eliminates many common issues](https://coder.com/why) with remote development by creating a shared environment for all your resources that is designed to streamline the development process for any type of development -- from DevOps and IT to Data Scientists. Additionally Coder is available through many of the popular cloud providers, allowing you to develop from anywhere using many different operating systems. +[Coder](https://coder.com) is an open source remote development platform that allows you to share an environment with your entire development team. Coder [eliminates many common issues](https://coder.com/why) with remote development by creating a shared environment for all your resources that is designed to streamline the development process for any type of development -- from DevOps and IT to Data Scientists. Additionally Coder is available through many of the popular cloud providers, allowing you to develop from anywhere using many different operating systems. Since Coder is designed to be a shared development platform for your team, it makes sense that Coder would work well with a tool like Nix. In fact, the team at [Coder uses Nix](https://coder.com/docs/v2/latest/CONTRIBUTING#requirements) for our development process From f4c434541352b97bd2a35156b300d2bed7ceb828 Mon Sep 17 00:00:00 2001 From: Alvin Charity Date: Sat, 15 Apr 2023 15:47:27 -0400 Subject: [PATCH 04/44] Update posts/coder-and-nix/index.md Co-authored-by: Ben Potter --- posts/coder-and-nix/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index 5355d3d..9068df2 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -10,7 +10,7 @@ Since Coder is designed to be a shared development platform for your team, it ma Nix is a tool and operating system that treats every environment, including the os, as a list of dependencies. The Nix toolchain was created with the understanding that all software depends on other software to function. Because of this, Nix can let you set up your environment by declaring a list of dependencies. And according to [nix.dev](https://nix.dev/) this ecosystem aims to achieve reproducible development environments, seamless transfer of software environments between computers, and atomic upgrades and rollbacks. -You can get started with the Nix package manager immediately on any OS platform. Instructions for installing Nix on your system are located at the [nix installation guide](https://nixos.org/download.html). +You can get started with the Nix package manager immediately on any OS. Instructions for installing Nix on your system are located at the [nix installation guide](https://nixos.org/download.html). Nix is a very robust, and at times complicated, platform. This article will attempt to describe how to use Nix with Coder at a high level. For additional information about Nix, please visit [https://nixos.org/](https://nixos.org/). From c8360840f3be33e25ace9cf64f9632ae003b6910 Mon Sep 17 00:00:00 2001 From: Alvin Charity Date: Sat, 15 Apr 2023 15:47:37 -0400 Subject: [PATCH 05/44] Update posts/coder-and-nix/index.md Co-authored-by: Ben Potter --- posts/coder-and-nix/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index 9068df2..c3ba4be 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -18,7 +18,7 @@ Nix is a very robust, and at times complicated, platform. This article will atte At its core, Nix aims to provide packges that are reproducible by isolating each package build. This means that the dependencies in each pacakge exist in a separate environment from other packages. Nix is somewhat unique in that you may use the package management features of Nix without the full OS. Best of all, Nix can allow you to delcare a default configuration for your system which can be transferred to any new machine using a shared configuration file. You can search for Nix packages at [search.nixos.org](https://search.nixos.org/). -The reproducibility of Nix environments allows development teams allowing developers to share configuration with teams [and contributors](https://coder.com/docs/v2/latest/CONTRIBUTING#requirements). Declarative with Nix environments ensures that the environment will contain the same resources and tools for each developer on your team. +The reproducibility of Nix environments allows development teams allowing developers to share configuration with teams [and contributors](https://coder.com/docs/v2/latest/CONTRIBUTING#requirements). Declarative Nix environments ensures that the environment will contain the same resources and tools for each developer on your team. Developers working with Nix won't have to worry about their builds failing due to outdated dependencies and can save time by avoiding resource-intensive workarounds. If you do happen to encounter an error with your Nix configuration you can roll back your Nix flake to the previous version to ensure your team can get work done right away. From 5a321f570957b727d371099f85b7ae59197ab0de Mon Sep 17 00:00:00 2001 From: Alvin Charity Date: Sat, 15 Apr 2023 15:47:56 -0400 Subject: [PATCH 06/44] Update posts/coder-and-nix/index.md Co-authored-by: Ben Potter --- posts/coder-and-nix/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index c3ba4be..bd58494 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -28,7 +28,7 @@ There are many benefits to using Docker to manage your development environment. Docker also helps to abstract away the gritty details of using a particular service or language. With Docker you wont need to manage each process independently - it is all included in the docker image. Docker is great for deploying applications, but it gets a bit complicated when using Docker to develop them. And using the same environment to develop and deploy your application can get very complicated very quickly. Each additional layer of complexity added to the development environment is another thing that can break without warning. -However mixing this infrastructure with the development environment can sometimes limit the developers ability to use the tools they are comfortable with. Developers must give up their preferred shell configuration and tooling in favor of a base set of tools and settings determined by the infrastructure. Many developers can pick up new tooling without much difficulty, but having a top-down approach to the development environment means not only are these tools fixed for the project, they may eventually break if the resources in the dockerfile become outdated. +However mixing this infrastructure with the development environment can sometimes limit the developers ability to use the tools they are comfortable with. Developers must give up their preferred shell configuration and tooling in favor of a base set of tools and settings determined by the infrastructure. Many developers can pick up new tooling without much difficulty, but having a top-down approach to the development environment means not only are these tools fixed for the project, they may eventually break if the resources in the Dockerfile become outdated. Additionally, Docker requires that your team understands Docker and how it works to some degree. This is particularly important if something does happen to break within Docker -- your development team has to know how to troubleshoot the issue before they can resolve it. This is particularly difficult since Docker works differently between platforms. An issue one team member may have on Windows can be vastly different from issues MacOS based developers may face. There is a potential for a huge amount of lost productivity when these issues come up, both in time and brainpower spent trying to fix the issue. And when its only your setup that doesn't work with Docker you find yourself facing the [it works on my machine](https://coder.com/blog/it-s-works-on-my-machine-explained) problem. From ba585b14cbacf15461414a5d681516b4141a06af Mon Sep 17 00:00:00 2001 From: Alvin Charity Date: Mon, 17 Apr 2023 10:59:10 -0400 Subject: [PATCH 07/44] fix spelling --- posts/coder-and-nix/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index bd58494..e64fcaa 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -16,7 +16,7 @@ Nix is a very robust, and at times complicated, platform. This article will atte ### Benefits to using Nix -At its core, Nix aims to provide packges that are reproducible by isolating each package build. This means that the dependencies in each pacakge exist in a separate environment from other packages. Nix is somewhat unique in that you may use the package management features of Nix without the full OS. Best of all, Nix can allow you to delcare a default configuration for your system which can be transferred to any new machine using a shared configuration file. You can search for Nix packages at [search.nixos.org](https://search.nixos.org/). +At its core, Nix aims to provide packages that are reproducible by isolating each package build. This means that the dependencies in each package exist in a separate environment from other packages. Nix is somewhat unique in that you may use the package management features of Nix without the full OS. Best of all, Nix can allow you to declare a default configuration for your system which can be transferred to any new machine using a shared configuration file. You can search for Nix packages at [search.nixos.org](https://search.nixos.org/). The reproducibility of Nix environments allows development teams allowing developers to share configuration with teams [and contributors](https://coder.com/docs/v2/latest/CONTRIBUTING#requirements). Declarative Nix environments ensures that the environment will contain the same resources and tools for each developer on your team. @@ -114,4 +114,4 @@ Now when you run `nix-shell` you will have your NodeJS tooling, custom zsh confi In this article you learned a bit about Coder and Nix, and how you can combine the two platforms to create a robust remote development environment that is reproducible and can be extended to incorporate your own tools. Nix and Coder both aim to provide developers with a worry-free environment, allowing your team to focus on work and not troubleshooting. -Get started with Coder now by visiting [https://coder.com/](https://coder.com/). \ No newline at end of file +Get started with Coder now by visiting [https://coder.com/](https://coder.com/). From bb8ad97048f9e440f39463fcdeb5b0f6da7994f4 Mon Sep 17 00:00:00 2001 From: unforswearing Date: Wed, 19 Apr 2023 14:02:54 -0400 Subject: [PATCH 08/44] Mentioned Docker issues with the Apple M1 chip --- posts/coder-and-nix/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index e64fcaa..0e5547c 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -30,7 +30,7 @@ Docker also helps to abstract away the gritty details of using a particular serv However mixing this infrastructure with the development environment can sometimes limit the developers ability to use the tools they are comfortable with. Developers must give up their preferred shell configuration and tooling in favor of a base set of tools and settings determined by the infrastructure. Many developers can pick up new tooling without much difficulty, but having a top-down approach to the development environment means not only are these tools fixed for the project, they may eventually break if the resources in the Dockerfile become outdated. -Additionally, Docker requires that your team understands Docker and how it works to some degree. This is particularly important if something does happen to break within Docker -- your development team has to know how to troubleshoot the issue before they can resolve it. This is particularly difficult since Docker works differently between platforms. An issue one team member may have on Windows can be vastly different from issues MacOS based developers may face. There is a potential for a huge amount of lost productivity when these issues come up, both in time and brainpower spent trying to fix the issue. And when its only your setup that doesn't work with Docker you find yourself facing the [it works on my machine](https://coder.com/blog/it-s-works-on-my-machine-explained) problem. +Additionally, Docker requires that your team understands Docker and how it works to some degree. This is particularly important if something does happen to break within Docker -- your development team has to know how to troubleshoot the issue before they can resolve it. This is particularly difficult since Docker works differently between platforms. An issue one team member may have on Windows can be vastly different from issues MacOS based developers may face. And Docker has [quite a few issues running on MacOS](https://docs.docker.com/desktop/troubleshoot/known-issues/), especially with Apple's [new M1 chip](https://discussions.apple.com/thread/252268744). There is a potential for a huge amount of lost productivity when these issues come up, both in time and brainpower spent trying to fix the issue. And when its only your setup that doesn't work with Docker you find yourself facing the [it works on my machine](https://coder.com/blog/it-s-works-on-my-machine-explained) problem. You may also need to develop within the container itself, and you may loose your own personal development configuration. This configuration could be added to the docker container however your entire team would need to use this config and thus agree on the parts that may or may not be included. This becomes a problem when you have a custom configuration or use different tools than the other members in the team. Yes, you can learn the tools used by the team as a whole, however your productivity may suffer for it. From 8cffaa52a0e6a21abcad5207fb6b3f404b42bebc Mon Sep 17 00:00:00 2001 From: Alvin Date: Thu, 20 Apr 2023 17:18:14 +0000 Subject: [PATCH 09/44] Apr 20, 2023, 1:18 PM --- posts/coder-and-nix/index.md | 26 +++++ .../static/docker_infra_and_dev.drawio | 105 ++++++++++++++++++ .../static/docker_infra_and_dev.png | Bin 0 -> 56114 bytes 3 files changed, 131 insertions(+) create mode 100644 posts/coder-and-nix/static/docker_infra_and_dev.drawio create mode 100644 posts/coder-and-nix/static/docker_infra_and_dev.png diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index 0e5547c..acfd288 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -22,6 +22,8 @@ The reproducibility of Nix environments allows development teams allowing develo Developers working with Nix won't have to worry about their builds failing due to outdated dependencies and can save time by avoiding resource-intensive workarounds. If you do happen to encounter an error with your Nix configuration you can roll back your Nix flake to the previous version to ensure your team can get work done right away. +![Docker workflow for development and production infrastructure](static/docker_infra_and_dev.png) + ## What About Docker? There are many benefits to using Docker to manage your development environment. You can prepare a Docker image with all the tooling needed to work on your app and have it ready to go with a basic `docker run` command. This environment ensures that all developers on your team are using the same version of the languages and resources that you need to maintain your application. @@ -67,6 +69,8 @@ mkshell { To use this `shell.nix` file you can run `nix-shell` without any arguments. The `nix-shell` tool will look for this file by default. +{++ ![](diagram showing how nix shell is related to nix package and how resources are loaded) ++} + ### Adding Your Tools to A Shared `shell.nix` Configuration The main benefit over using Docker for shared development environments is that Nix has the ability to extend this shared configuration with your own personal settings. For example, if you want to add your toolchain to a [nodejs.nix development environment](https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/web/nodejs/nodejs.nix), you can modify your `shell.nix` file with the following code. Note that the `nodejs.nix` file is imported as part of the `buildInputs` array. @@ -90,6 +94,27 @@ Now running the `nix-shell` command will create an environment containing the sh ## Using Nix with Coder +{++ +Adding template to Coder that includes Nix (Docker +template modified with nix-devcontainer image) +++} + +At this point you're ready to start using Nix with Coder. There are a few different ways you can combine thee two tools, but one really effective method to get the most of both environments is to run Coder within a Nix environment by using Docker. + +To get started you will need to create a new template in Coder. {++ Instructions with screenshots and code samples ++} + +Now that your Nix Docker template is set up in Coder, lets add your `shell.nix` configuration into the Coder workspace. {++ Instructions on how and where to add this configuration ++} + +After adding your template you can begin to use Coder inside your Nix environment. As a final step, lets say you have a Todo application you prefer to use alongside your code. You can clone this app and add it to Nix by doing the following: + +{++ +Describe how to clone a "todo" project (or something cooler) +and run it in Coder: https://github.com/nix-community/todomvc-nix +++} + +First, find project you would like to clone. In this example we are using the [Nix Todo MVC](https://github.com/nix-community/todomvc-nix). + +{-- Now that you have your NodeJS environment and custom toolchain setup in `shell.nix`, lets add Coder to your environment. Coder is available as a nix package and can be added to your config as the same way you have added your custom software in your tool chain. You can do so by modifying your `shell.nix` file to include the Coder package, like in the example code below: ```nix @@ -109,6 +134,7 @@ mkshell { ``` Now when you run `nix-shell` you will have your NodeJS tooling, custom zsh configuration, and Coder available. These tools will be available immediately so you can get to work right away. +--} ## Conclusion diff --git a/posts/coder-and-nix/static/docker_infra_and_dev.drawio b/posts/coder-and-nix/static/docker_infra_and_dev.drawio new file mode 100644 index 0000000..2169129 --- /dev/null +++ b/posts/coder-and-nix/static/docker_infra_and_dev.drawio @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/posts/coder-and-nix/static/docker_infra_and_dev.png b/posts/coder-and-nix/static/docker_infra_and_dev.png new file mode 100644 index 0000000000000000000000000000000000000000..747b58a8b1197900a6e1e4853864ef8c47871784 GIT binary patch literal 56114 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 Date: Thu, 20 Apr 2023 17:53:19 +0000 Subject: [PATCH 10/44] Apr 20, 2023, 1:53 PM --- posts/coder-and-nix/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index acfd288..5166e84 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -34,7 +34,7 @@ However mixing this infrastructure with the development environment can sometime Additionally, Docker requires that your team understands Docker and how it works to some degree. This is particularly important if something does happen to break within Docker -- your development team has to know how to troubleshoot the issue before they can resolve it. This is particularly difficult since Docker works differently between platforms. An issue one team member may have on Windows can be vastly different from issues MacOS based developers may face. And Docker has [quite a few issues running on MacOS](https://docs.docker.com/desktop/troubleshoot/known-issues/), especially with Apple's [new M1 chip](https://discussions.apple.com/thread/252268744). There is a potential for a huge amount of lost productivity when these issues come up, both in time and brainpower spent trying to fix the issue. And when its only your setup that doesn't work with Docker you find yourself facing the [it works on my machine](https://coder.com/blog/it-s-works-on-my-machine-explained) problem. -You may also need to develop within the container itself, and you may loose your own personal development configuration. This configuration could be added to the docker container however your entire team would need to use this config and thus agree on the parts that may or may not be included. This becomes a problem when you have a custom configuration or use different tools than the other members in the team. Yes, you can learn the tools used by the team as a whole, however your productivity may suffer for it. +You may also need to develop within the container itself, and you may loose your own personal development configuration. This configuration could be added to the docker container however your entire team would need to use this config and thus agree on the parts that may or may not be included. This becomes a problem when you have a custom configuration or use different tools than the other members in the team. Yes, you can learn the tools used by the team as a whole, however your productivity may suffer for it. Nix solves this problem with the `nix-shell` command, and the associated `shell.nix` configuration files. From 4cd5d601a2521aeebc7e75c71bc367b3b1532dc4 Mon Sep 17 00:00:00 2001 From: Alvin Date: Thu, 20 Apr 2023 17:55:15 +0000 Subject: [PATCH 11/44] Apr 20, 2023, 1:55 PM --- posts/coder-and-nix/static/nix_tooling.drawio | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 posts/coder-and-nix/static/nix_tooling.drawio diff --git a/posts/coder-and-nix/static/nix_tooling.drawio b/posts/coder-and-nix/static/nix_tooling.drawio new file mode 100644 index 0000000..dcfefd0 --- /dev/null +++ b/posts/coder-and-nix/static/nix_tooling.drawio @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file From b1d8c3f910df3ff41e27df62f40f4cf52c1501f2 Mon Sep 17 00:00:00 2001 From: Alvin Date: Thu, 20 Apr 2023 17:59:45 +0000 Subject: [PATCH 12/44] Apr 20, 2023, 1:59 PM --- posts/coder-and-nix/static/nix_tooling.drawio | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/posts/coder-and-nix/static/nix_tooling.drawio b/posts/coder-and-nix/static/nix_tooling.drawio index dcfefd0..cf67a50 100644 --- a/posts/coder-and-nix/static/nix_tooling.drawio +++ b/posts/coder-and-nix/static/nix_tooling.drawio @@ -4,6 +4,21 @@ + + + + + + + + + + + + + + + From 8100e7de5acb913ca1ee42f63945d802ddbee1db Mon Sep 17 00:00:00 2001 From: Alvin Date: Thu, 20 Apr 2023 18:02:54 +0000 Subject: [PATCH 13/44] Apr 20, 2023, 2:02 PM --- posts/coder-and-nix/static/nix_tooling.drawio | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/posts/coder-and-nix/static/nix_tooling.drawio b/posts/coder-and-nix/static/nix_tooling.drawio index cf67a50..0290f05 100644 --- a/posts/coder-and-nix/static/nix_tooling.drawio +++ b/posts/coder-and-nix/static/nix_tooling.drawio @@ -1,6 +1,6 @@ - + @@ -8,16 +8,19 @@ - + - - + + - + + + + From 84241386efc0f43fc9540f5e19652f7db508e8e7 Mon Sep 17 00:00:00 2001 From: Alvin Date: Thu, 20 Apr 2023 18:09:20 +0000 Subject: [PATCH 14/44] Apr 20, 2023, 2:09 PM --- posts/coder-and-nix/static/nix_tooling.drawio | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/posts/coder-and-nix/static/nix_tooling.drawio b/posts/coder-and-nix/static/nix_tooling.drawio index 0290f05..5cd43da 100644 --- a/posts/coder-and-nix/static/nix_tooling.drawio +++ b/posts/coder-and-nix/static/nix_tooling.drawio @@ -1,6 +1,6 @@ - + @@ -10,17 +10,20 @@ - - + + + + + - + - - + + - - + + From 110b60a8fe58bc7bf8e74db34aabd3c7062624e6 Mon Sep 17 00:00:00 2001 From: Alvin Date: Thu, 20 Apr 2023 18:14:40 +0000 Subject: [PATCH 15/44] Apr 20, 2023, 2:14 PM --- posts/coder-and-nix/static/nix_tooling.drawio | 55 +++++++++++++++---- 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/posts/coder-and-nix/static/nix_tooling.drawio b/posts/coder-and-nix/static/nix_tooling.drawio index 5cd43da..1d0b107 100644 --- a/posts/coder-and-nix/static/nix_tooling.drawio +++ b/posts/coder-and-nix/static/nix_tooling.drawio @@ -1,29 +1,60 @@ - + - + + + + - + + + + - + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + From 6630127026a1dc938b7634f38c0e76e4f626a489 Mon Sep 17 00:00:00 2001 From: Alvin Date: Thu, 20 Apr 2023 18:16:44 +0000 Subject: [PATCH 16/44] Apr 20, 2023, 2:16 PM --- posts/coder-and-nix/static/nix_tooling.drawio | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/posts/coder-and-nix/static/nix_tooling.drawio b/posts/coder-and-nix/static/nix_tooling.drawio index 1d0b107..311226f 100644 --- a/posts/coder-and-nix/static/nix_tooling.drawio +++ b/posts/coder-and-nix/static/nix_tooling.drawio @@ -14,7 +14,12 @@ - + + + + + + From df7cf3d0ef6fc5307f39b9d397c210d24ee6d163 Mon Sep 17 00:00:00 2001 From: Alvin Date: Thu, 20 Apr 2023 18:24:38 +0000 Subject: [PATCH 17/44] Apr 20, 2023, 2:24 PM --- posts/coder-and-nix/static/nix_tooling.drawio | 71 ++++++++----------- 1 file changed, 30 insertions(+), 41 deletions(-) diff --git a/posts/coder-and-nix/static/nix_tooling.drawio b/posts/coder-and-nix/static/nix_tooling.drawio index 311226f..b843159 100644 --- a/posts/coder-and-nix/static/nix_tooling.drawio +++ b/posts/coder-and-nix/static/nix_tooling.drawio @@ -1,65 +1,54 @@ - + - - + + - - + + - - + + - - - - - - - + + - - + + - - + + - - + + - - - - - - - + + - - + + - - - - - - + + + + + - - + + - + - + - - + + From 1aac9d6b6de20eccce79bd3c5a5d7de023698f78 Mon Sep 17 00:00:00 2001 From: Alvin Date: Thu, 20 Apr 2023 18:28:43 +0000 Subject: [PATCH 18/44] Apr 20, 2023, 2:28 PM --- posts/coder-and-nix/static/nix_tooling.drawio | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/posts/coder-and-nix/static/nix_tooling.drawio b/posts/coder-and-nix/static/nix_tooling.drawio index b843159..3c11151 100644 --- a/posts/coder-and-nix/static/nix_tooling.drawio +++ b/posts/coder-and-nix/static/nix_tooling.drawio @@ -5,7 +5,7 @@ - + @@ -28,15 +28,6 @@ - - - - - - - - - From 730e4461d5d79300caac400fb617d5f6c5c98bdc Mon Sep 17 00:00:00 2001 From: Alvin Date: Thu, 20 Apr 2023 18:38:58 +0000 Subject: [PATCH 19/44] Apr 20, 2023, 2:38 PM --- posts/coder-and-nix/static/nix_tooling.drawio | 39 ++++--------------- 1 file changed, 7 insertions(+), 32 deletions(-) diff --git a/posts/coder-and-nix/static/nix_tooling.drawio b/posts/coder-and-nix/static/nix_tooling.drawio index 3c11151..dfdcb32 100644 --- a/posts/coder-and-nix/static/nix_tooling.drawio +++ b/posts/coder-and-nix/static/nix_tooling.drawio @@ -1,46 +1,21 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + From 2936625362d4acffe68255edf6345f461970b9c5 Mon Sep 17 00:00:00 2001 From: Alvin Date: Thu, 20 Apr 2023 18:42:16 +0000 Subject: [PATCH 20/44] Apr 20, 2023, 2:42 PM --- posts/coder-and-nix/static/nix_tooling.drawio | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/posts/coder-and-nix/static/nix_tooling.drawio b/posts/coder-and-nix/static/nix_tooling.drawio index dfdcb32..fc78d4a 100644 --- a/posts/coder-and-nix/static/nix_tooling.drawio +++ b/posts/coder-and-nix/static/nix_tooling.drawio @@ -8,13 +8,28 @@ - + - + + + + + + + + + + + + + + + + From a0a773fa18f1aac927d59b2306a8e143fe41d05a Mon Sep 17 00:00:00 2001 From: Alvin Date: Thu, 20 Apr 2023 18:49:21 +0000 Subject: [PATCH 21/44] Apr 20, 2023, 2:49 PM --- posts/coder-and-nix/static/nix_tooling.drawio | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/posts/coder-and-nix/static/nix_tooling.drawio b/posts/coder-and-nix/static/nix_tooling.drawio index fc78d4a..ef8f5b0 100644 --- a/posts/coder-and-nix/static/nix_tooling.drawio +++ b/posts/coder-and-nix/static/nix_tooling.drawio @@ -1,6 +1,6 @@ - + @@ -13,10 +13,13 @@ - - + + + + + - + @@ -31,6 +34,18 @@ + + + + + + + + + + + + From 3444f8e7ea8e4bfdb7caaad5b2828b3351d20bc4 Mon Sep 17 00:00:00 2001 From: Alvin Date: Thu, 20 Apr 2023 18:58:53 +0000 Subject: [PATCH 22/44] Apr 20, 2023, 2:58 PM --- posts/coder-and-nix/static/nix_tooling.drawio | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/posts/coder-and-nix/static/nix_tooling.drawio b/posts/coder-and-nix/static/nix_tooling.drawio index ef8f5b0..8ff66de 100644 --- a/posts/coder-and-nix/static/nix_tooling.drawio +++ b/posts/coder-and-nix/static/nix_tooling.drawio @@ -1,6 +1,6 @@ - + @@ -34,17 +34,20 @@ - + - + - - + + + + + - - + + From 0d24787f3e648102c843acfe66c1a4e46d0ee920 Mon Sep 17 00:00:00 2001 From: Alvin Date: Thu, 20 Apr 2023 19:21:54 +0000 Subject: [PATCH 23/44] Apr 20, 2023, 3:21 PM --- posts/coder-and-nix/static/nix_tooling.drawio | 67 ++++++++++++------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/posts/coder-and-nix/static/nix_tooling.drawio b/posts/coder-and-nix/static/nix_tooling.drawio index 8ff66de..4050a9b 100644 --- a/posts/coder-and-nix/static/nix_tooling.drawio +++ b/posts/coder-and-nix/static/nix_tooling.drawio @@ -1,54 +1,73 @@ - + - + - + - + - - + + + + + + + - + - + - - - - + + + + - + + + + + + + - - + + - + - - + + + + + + + + - + + + + + + + - - + - - - From 16e5be10f0f7ec519fc1ee0c1556b3b27400fbed Mon Sep 17 00:00:00 2001 From: Alvin Date: Thu, 20 Apr 2023 19:22:59 +0000 Subject: [PATCH 24/44] Apr 20, 2023, 3:22 PM --- posts/coder-and-nix/static/nix_tooling.drawio | 2 +- posts/coder-and-nix/static/nix_tooling.png | Bin 0 -> 26183 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 posts/coder-and-nix/static/nix_tooling.png diff --git a/posts/coder-and-nix/static/nix_tooling.drawio b/posts/coder-and-nix/static/nix_tooling.drawio index 4050a9b..60a3afb 100644 --- a/posts/coder-and-nix/static/nix_tooling.drawio +++ b/posts/coder-and-nix/static/nix_tooling.drawio @@ -5,7 +5,7 @@ - + diff --git a/posts/coder-and-nix/static/nix_tooling.png b/posts/coder-and-nix/static/nix_tooling.png new file mode 100644 index 0000000000000000000000000000000000000000..1fd0c3a57bb193d585d89eb9baa7f003a5f6a629 GIT binary patch literal 26183 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 i6l$oINm6e1HvG8XYN-Ar2O7kmkoc Date: Thu, 20 Apr 2023 19:24:43 +0000 Subject: [PATCH 25/44] Apr 20, 2023, 3:24 PM --- posts/coder-and-nix/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index 5166e84..1791673 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -69,7 +69,7 @@ mkshell { To use this `shell.nix` file you can run `nix-shell` without any arguments. The `nix-shell` tool will look for this file by default. -{++ ![](diagram showing how nix shell is related to nix package and how resources are loaded) ++} +![Nix Shell Resources](static/nix_tooling.png) ### Adding Your Tools to A Shared `shell.nix` Configuration From 01e11e412a19ec82384bba06ccec06078dda4cff Mon Sep 17 00:00:00 2001 From: Alvin Date: Thu, 20 Apr 2023 19:32:28 +0000 Subject: [PATCH 26/44] Apr 20, 2023, 3:32 PM --- posts/coder-and-nix/index.md | 12 +- posts/coder-and-nix/static/.DS_Store | Bin 0 -> 6148 bytes .../static/docker_infra_and_dev.drawio | 105 ------------------ posts/coder-and-nix/static/nix_tooling.drawio | 74 ------------ 4 files changed, 9 insertions(+), 182 deletions(-) create mode 100644 posts/coder-and-nix/static/.DS_Store delete mode 100644 posts/coder-and-nix/static/docker_infra_and_dev.drawio delete mode 100644 posts/coder-and-nix/static/nix_tooling.drawio diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index 1791673..cb9705b 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -99,13 +99,19 @@ Adding template to Coder that includes Nix (Docker template modified with nix-devcontainer image) ++} -At this point you're ready to start using Nix with Coder. There are a few different ways you can combine thee two tools, but one really effective method to get the most of both environments is to run Coder within a Nix environment by using Docker. +At this point you're ready to start using Nix with Coder. There are a few different ways you can combine thee two tools, but one really effective method to get the most of both environments is to run Coder within a Nix environment by using Docker. In this example we will be using modifying the Docker template in Coder to add the [nix-devcontainer image](https://github.com/xtruder/nix-devcontainer). -To get started you will need to create a new template in Coder. {++ Instructions with screenshots and code samples ++} +### NixOS Docker Template + +To get started you will need to copy the Docker template in Coder. We will add the `nix-devcontainer` image to the template {++ where, what line? what is it replacing? ++}{++ Any other instructions with screenshots and code samples... ++} + +After adding your template you can begin to use Coder inside your Nix environment. + +### Using Your `shell.nix` File Now that your Nix Docker template is set up in Coder, lets add your `shell.nix` configuration into the Coder workspace. {++ Instructions on how and where to add this configuration ++} -After adding your template you can begin to use Coder inside your Nix environment. As a final step, lets say you have a Todo application you prefer to use alongside your code. You can clone this app and add it to Nix by doing the following: + As a final step, lets say you have a Todo application you prefer to use alongside your code. You can clone this app and add it to Nix by doing the following: {++ Describe how to clone a "todo" project (or something cooler) diff --git a/posts/coder-and-nix/static/.DS_Store b/posts/coder-and-nix/static/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/posts/coder-and-nix/static/nix_tooling.drawio b/posts/coder-and-nix/static/nix_tooling.drawio deleted file mode 100644 index 60a3afb..0000000 --- a/posts/coder-and-nix/static/nix_tooling.drawio +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From cadbe4c5c0739ba14227dd86e3d6c645eae3348f Mon Sep 17 00:00:00 2001 From: Alvin Date: Thu, 20 Apr 2023 20:29:33 +0000 Subject: [PATCH 27/44] Apr 20, 2023, 4:29 PM --- posts/coder-and-nix/static/nix_tooling.png | Bin 26183 -> 10457 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/posts/coder-and-nix/static/nix_tooling.png b/posts/coder-and-nix/static/nix_tooling.png index 1fd0c3a57bb193d585d89eb9baa7f003a5f6a629..5ae6d3646cf00918967bbebb07231e4634204b60 100644 GIT binary patch literal 10457 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 i6l$oINm6e1HvG8XYN-Ar2O7kmkoc Date: Thu, 20 Apr 2023 20:30:58 +0000 Subject: [PATCH 28/44] Apr 20, 2023, 4:30 PM --- posts/coder-and-nix/static/nix_tooling.png | Bin 10457 -> 23872 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/posts/coder-and-nix/static/nix_tooling.png b/posts/coder-and-nix/static/nix_tooling.png index 5ae6d3646cf00918967bbebb07231e4634204b60..ef28d5df38aec4a57aaba0b7a5772cb67d9faae6 100644 GIT binary patch literal 23872 zcmd_S1zeTewl^#Yf*?|ol8ch=Zdi0mcX#Kaq*XelLzEJvOA#bRKoAg61f&tAk&?!D zE(Evx?sLvP=ic+(_x|3`UF(_id1j0`@;}Dh5vs~E7-+<3mo8nxkduX~UAlyj0De!R zUIG91eXFtq{)6DICL?jFyq{$0(j~HF4=EiFM{g@z2g^$|oRU9((QrzE-xju})^4Vb zG#qTU7Brkt8V(LOIdLsjS#evl+fZ%}m>HXtyB;%W25&f-I$HjGN7dBYl9?UedNzoo zw~U*qi;a@Ag{1>{&%*oXTRgmMKR>ka`PsnD!S%Dj+U;Vtvq3o6;0@}wzURZUpMPiV zX=`EW{`1@O7d@Pv9XxDZ{@iHp?Brx=?(wG=P2Jp_z5e`~m9xY79?u7J0o(Y~NAL!9 zb5n=&RyG!1?w<>WcWB#Mc-Wl3&dzqeM0kg+rLDEi`Rsh$=N*ow7cZYTxZ9XoID7s4 z{;cVYbZ*Yh;7h5qQ<1cEfRpcnG(W$S{yV+Dw%}&zbUyb#{(y`B=T=~*4xZ=x``O^` z;d8NJH)l^L3rjeW*l9Q=yliYeEY)31&EcFnU_ zcD6xID{lB-;C(A+Cy(FSInVxpc6SdqXM4-vdU($MfSwD2|FN(0t->tbJS@*y>#XU5 z_biAz+0T#dobT8#7}4vGBjma`L7U%BkAvgJh=Jj06v7%_Uu6y{=fof$FoN$ zoK1dpLgAZ&Kfzg5+SJk30p1{M=>W6zur)V5?>JXZV3S}FZ(EOFSk?up=8cU0;dBQ3%vDr(6Y#$@%m7m&*E2 z-sfQZDW-qO)z1~2&2}bbG8f|aN7FwLybDtOrs05wa&TaAvi1H+>)%uzP{%HCx;Qy| z!1?DtkwG(4b9?JE?Wp4E;b04Axib}MVd`eD0yLzp$Js%%fE{s4{8@{_+3JFO03{{P zsS1vbTLSzINGAE`f4IScN?!D^z)j|FFZ{U^(C_c|!A;lS=>**Jw|ZDOfQk661OEHh zd_a8uao^t?l$-Y-e8_t?BMV$#|2FZ(q-R620Dby*`?&c2K_|~Y8kO&FuNU6>mmaX5 ze;}>@f?c}Mn{Z|U9LaI<{F@%VP__SdH42Ua?!^5j0{=BN%JFa0qdynqV)_?L|0n$i z4iUcYKk2{oz5M(1-#=^H;VcDT&2K8k*WKnXl)X?c=ALH%jB@$ubt#%%cvkZ%!p8hp94vky^#2+w1LOM_ zgAJ$zH_B(`n(K_GFYGl~=)zA2J~F)X4=>^D>CAe7zMmWW z&qU(f{QoZziSyO`CK6V@R)0C6|Mx|L`7@w#9+mzcx}P_hI@nq}0ZU*G%m6$Rlz`h@5NA4wpLaOgT3EpGn7Q!yx=qs_@ro{O2I^{{(H|xX6EqGil&R z5Zf7)#dZd3{e@V+S))Jb29E|!&D@o0})!56UoMV9&E`Bw&dpH^1+(j|&Za!_#%Z=*Fs z6ptI41kE=E=R7F~9x(`9XMv#(f;Ie(pAd9(4 zC%Zv`grt7DEj)qM?gX>)f>~RC>E|ag-};igG3nQ`x8AhyqW zDupVIDoHDCP;ekrR3*kQ+-OwH%;qNFrgK)HqoZeDE|rcZObF-*$KLGc*`&4RepjH7 zx|Pmh*&}K@l#hgo8Rr{@NgnX^aCfCZSXh`dnZ+;z?Z&N{(!v);(m~iJNY_GJho7h{ zb;jJ>SsbM5NuWYm=*!$|eq$l9^+DU%@}=8C∨|)Py{AS_TR|Ubv=ugDzoaX2wlK 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 JmP?p~{2$RnGnW7W literal 10457 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 Wmt Date: Thu, 20 Apr 2023 20:32:22 +0000 Subject: [PATCH 29/44] Apr 20, 2023, 4:32 PM --- posts/coder-and-nix/static/nix_tooling.png | Bin 23872 -> 30707 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/posts/coder-and-nix/static/nix_tooling.png b/posts/coder-and-nix/static/nix_tooling.png index ef28d5df38aec4a57aaba0b7a5772cb67d9faae6..96495ec5ae743763d075d940d005dd27943dc004 100644 GIT binary patch literal 30707 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 delta 17085 zcmb8XWk6M5(>E*#Qc?#=$-@DpyIT%jN_TgIG{PoCy1PUv=|&MGML<$O5s*fdMoJo= zh5vZ3>%N~4&+7-|oW0kqS+i!%n)%HP2fHYpEhs!u57gvwu_>@`+_-_OsDRYCaRVg@ z{62?y3;gsSQa=R$p*+%%zkj28gmV4H4eGQy9yHVxp_{EKZY0bpCg>Q9+}!*OJUk3M zTz(9^NbnoCAlF}?eeA6~?f&|Xk1J&n^$rS8iW=JLKLbU$1^#~VpMk>vdmu0O-{09; z+uPcC{zXj)kdaBrA=pldCafao=KF6lyu5#XmP?_9krMsSr#xKzDGe~y2J~C*sQ+*x z%>B>Ie{;g~&*%SG!avOZZ$?}xN>WJgK2K4=n*RSN3jDWFczFKz+WwK#e^TW8v$WTD zcT!$bK2N#A{)-|9F{aS}Smpmeg7Q?wDLYipQ_648{llUN@Bi4h|7VI^Dfz@Q4K{eT zDF4#p7W(f!_*bC+A;5nY@Sn@&2tW~iJgl*Hts|0>bnr2hTk-4C-{3H1Pc+UNQ)APTj^OdF|C6d;kh=>2bh0M#(m2!_R96DiC zP`h!1_J$%-TFcjD+Ze<1jy7rgT@l677rKP^qwcKB@&zB#Dm2jMA)*h1$CDqRt+zde zqY$FV%C_*?zhF_o-(ynPrA0&2ygCq{CFpkXw(;?{wf#OKOli6QJ#BX`pyPO_?ciCI z(V^$={N>SYavr|J!$UUhM!PZ5xmL(Wa%pKPDPTC8|LVs`9&5nShPJ6^u|~0ysHo4* zTOvt$Ik__$asN;G(5O(YSglDdRjnNc3{Fp9Vfw~{LEXY)d2T3+w+06XC+B9RTr62q zP){V`-iW{+qb>i(V&#neEFS9tN&E34G<^I7{|J1VpdV*Po5kYd;=E}b#@P_|oqLOw zC2vgRf(gygZijVFyi{NBjk|leHby^?M31pLoO9g%!AfNRv#zQ2TaVR&1wq&OStaCx zJQ8`adi%j0rliHiMGpxH2_i9Z@j>l!E#_TA*S6L5*!V|zu{Y>DF}YAD2^AC+p0BOh zT?7~vDI__kv1n&+Y;U(2+YjA=7?PTso2k|FB`y!QrW?`*GB|5IP2WiTVTTN*kKn|4 zxhLwkQTyZ5ujn`=L+}DbUpc);Cer`c)-d0 zms`Q~fdVZ$P1ncSO;+kNmZd!s{#$0lbZ(N|+;v_G3jI5gk&%$|kqInH%=hQ>_K1kS zTW|~1y6}6y^ZsxZM-Tn{VhV{Hw|K6PWM*dSROr?OOhS3-WMl(+uMvu?SbcNRa#{lKYne0{gFDwL2CJzI6q>c8oqLR zeC z&{ETHA5!FP0*rG15}}kjrr6^Xw@)8m$dGaxG_Kv>aMz!W67xSS_1DlCM-dO{v^4)~ z?ppki%k$$2&W?+E@7ZQ|cIRXTH#fI;J9DiG2L}fgPNt78Nd6Kp6g*F$2PFBKh)FFr zDl#%N&%>$A2TpBnZvL>!@O8BbQ0O-E&Xs=%6NNnbF*5ccg~`@u?c<9KZ5Y<=+gpZ( za&bTLB~F4H>bB6bP5%f$ss9~`{A;Iao*0L=ABFM(!ZZ*T8I-diGaZi^m46ciMiRCdEjc1Se0MKj4< z^5KCCo+)l+RGkOY^>8vwyC@_VeNZq)08_naT5-w|{vY53X& zmlv0e%giK(ggq3Tk)7V3?Nj`Wgu^PtKB<5%0{)!eXYz$igx$gS;iZzUFbr3hh4#S0 z@nX}HWaH)9&&<6$Y+i0ZbgtLthiS)Ni-#aE5{x6~g={n<@Te#p*Gq};Dn->3-`Idt z`~U-mJy}6RLxX9eP(I;|fq_9)8$;mSAWa#L1OG7=;VcPPSLd9@mALxBy*=BO$8w@w zbRQjO(Es<=8{Wgw6sUCBG0m#2FZ_BsUrf8=XW%L9Npj)RmIFHn8vBGfWpIe&fCY%`o~tlc@Z!?=2Dl9ba>YUO2I@slUW?$=!6A{Y;AI@`ak zuV>9hYsA!RHl3l+8xN*4eOAHWr3T=WrlrHt=!9`Ksr*8A*Nj% zGI-}?Z)KG3y`cSuma1Pv&r*yBzFDPSDiU;x+r}rDOhFR@qkX1j6dt5Jfk4O z9lz}1C1c}mC-p!Yui*ClTgfa4$)a7VlC;29;!08lbE*5{kX|zT=5eV_lR;z9!KhYi z?_EBD$6}{~6*Bp^e!XaxcW<;hh0nCE(h_s@^tIXz-f?p!M>!|>m@SG^NXcuXQt5#3 z_|{K2Q)_;cO2{qP&2n-$N01qTc+!5cuY7JJ)orM#sK}YBlrJI9U-=~y`mSo2sRIA{ zWt*h+W^?Cax5L-^K%S^ZY&+Ek(xK;A6YU62bRj-LGbPi4PEG^HZ2FExCrDqc*nO?(c<}mJp4|lg*V0N?;qtG|CA87pFIGxT zI`4)WWeYgT?Y^>8PGfniwhm1cXK?Xwbb}kfKwc^)#0ySgP9frHw^eKYF8YlFs#?B; zDsYgRZIWgh?PXlsPZ`r#b>sJcjBt}1LUA~gxz;yppn;IAO7UDpMW^;-fK4Xk%k?R zjuIk5&-S*y`e!Z*gyrDulCT@a&IkQqA6QAr&|x!Cbrif(Sg16Rdx&uywZEz3TmrVg zNUGZ!T<%gUn0Dz%V8Oe)7^^#>i4xVrF?pJYdU|9>>l1z8SlHM`W%hrnOHGW-?2q|o zzVqY`tW5I&cgX`{(I~x_7cU{(HRnJ6G4X*k-1obhp~54Qq33IvcBtfC;@;o4>?w#O z;thO!BP7=6V_Lknq(5Jans@!$ z<&t|M3(Uz!JX8ZuTUl9Ic4_Z)Wd$_RL~#3#gL_|9H5=k{x3k$E9@!WZ7V`U%)N*r* z+bkk+QqAhT+8M4>|LC1bwn#wziQhza)u&gMtaSmWo8#zpGUPCx+?ghSPGQE-t;)`M zWBb8hs*SrDGEe+%&wkaZX-K(=9pV_+LUk&c#a+Qv#jt! z1~`FF5e$`M+Hu#;cR-MbzPHZ#uWj_G!=1UWOHs*p^%C^V=8Jw?cY?|H^b z6Gl&giS`T)wo&XMp4P`K@Y(pJ*dv|l`z<*V2052#M`R%hB3~aZ2Ba;v&%LikQxAEJ ze$V4dP^(3Y+^}YU;o460VcL!5t=4Zg|X9ObD~)Akzum%LTGfLHS!0lOU5 zBf0vI>ETCFF#-3+Ll3@xU=n^I34H*T>@U6+bK<`Q5#xny)x4F-l8^!%~XN$$nmFR0P zwDww2jgs=h!|<|@w=3>KVs1b~5`%+D=JYuRM>MjLc&=iK?+5q0p1{5($6T`|NAS_f zYz|0HDFqW_lD~j>R`q&F?BDWKfhVs<;_!eMr3pV4hz?p`zZhA(RVflzF}6CG!Ot1g zePp+uqONyube+ef1qXk9-Ahi5&m}?QC_Z7yEdwK=_3!eUfCI`1y9;%{ z*Hio=@$Z}2xRsj>qJx!NnPiN~jl}tN$*yGj)lQbZ9@cjY8H}c!TL+ZDVUb; z^_W+y&8a+NkwT)ZxEHB-m4*W&O6;9ZlvV1OmJG(z?TRF9k4 zN#C~ENLw1%^77Ks&8@;S)Zjo0)-~={RH^NowOSetAztD(w)#0r^GRYdz3KJ5Nn#na zK+xt^l|`1ttgtahZxW&?uaNYDEfvIHWVhzpilI*$BO@L!M3o(`A6ugpC1c)|w{I2T z9gtgCuQw9*p3eh{>pwbT0Z$^m(exxEDXx(6ot@{nbtR?fu37`a;>i{pBh0VM0{q}k z`s7QV=DC_2Ii@JsH0$P_jx(qK%gUBJNyvsQuKedOGPzzQli=ynq8thaFfCn_9@H}Z z(ZpJ?pqp1`yhF;Sl8jY2b*(>RJDY*9(Ast{9%)iLwN}k8uh3(MbEkJB>(!JpA~$cf zJ1??uT3?O{CZ9H^(3@1}U(Nn1mL6yYtFnLs5JjPlEqRtg>I3gW0xZj;f|4Rx1W>n1 zPg%JChY|k{L&uHj3Z~CBrlwFl&V+?N+Sz>>nf2xOF?e5!z0t#QNMDHO;Jy8b+dHsd z*^FAT^e$oogwmf#a3a3?pzHWgN-Gm}PU~}c+UgIC%v^2iZ2YokGHCHEgCjLcAJ8eO zsCep4f2!_$_b!Yh_wCtzK{D3C2B47{lb-A254WON*>qvF4G7(IlL^Sl%$U>G)?6c% zFP=83s0e`tU!Ip$VVqD#bnEFq;{`j&_KvHBkuaUr&m*m+(MA!;Ij#R4>tVFQp&DF? zMa+_6?qma<)e)%BQ9YZUVQvw}hksa8ntlsI7LZ!MX6TIl{OE&uWl@T`0ixhe5}7Q< zaOoqkJ&Mq`u{NeBkiB?3g*-hLm*tU4vQttdtoI?Ohjk2+jCDPRXgDR(1gI@xG(Grs zfa5)vNcqp$v_s;zCbh};;cU9&q)hj&r<{$_8yKmdeA|XxR^ zDp)9%A(kV%MQ>KTi@?_e;bW=Qhh)yU!vzTXT}&nF{Q%$}%phEZCDj_MROn4pXYDf- zB}cY?AU-=7mHbUmKgeU%pLlyHg-N|fjnA?-cG(An6fe8OaWqGAg{f|-mmAp&)Kf)JrQ3an4t8R4>2;e4?8I((npf?_z z=Hm^v>c9s@8P4REA!HB~e9m7v@4JF~cJ#$GT-x)9J_5PL04rW);owk9d}o^5C{`47e{+U0iwkLP@rW#k~T{aaD8L}111lQB~0#xas~%q(1mYAI4Q9L z@nUM+2L>2JEzfIcsT)1i{Vnucf?cmRxHq2a92Jl2M*ib{tkn-G5wBbq)ZRxEYoamv zbU7?_hx2)DXaPsBjmsr59Kq>8&)@v8zy#TUtiNLc5>1_IFK{SDfgy8y;BKrgolE^fnGq)cj zROU`q;vR}U)bKjpYPCEOS$g^SBCtCXAvZC4P9%O`JgQR&Yrj04Q0KEBM{s`+Jpc6& zL{)2xU11ib5I9#Q?_)?Oa)lqEMZLW`+dS;Tpuwc%#`qPPR~J9oRX12I@cbU6HhJ9 z5_yYerrNZ_no-n96TC;FO94NxqTiNFg*wqKn& zN)G@wi6O_&Kq|c{UYHR_eYSRTs+^L8ERQ0H@5N&1gz2FRpD7TVDQ_zPRja!%`F%J?{!6tn zQ7=AzEXvPrB_8PN;t<@!4<9@r;I~_x@+vCps}#^VX(p})0S+4nh_vq0rmIU{9x}i} z9zXBUdmc>oI54m*;CRPE;dFns5S(4?dUn%xvD4Gjs6w4u?7nH;IOwimiRAAK&D8L^ z_ju@XM9${Nnq?XcEssy@6J?7Pk$6c{th%&>{Wx5mH;m;zIdo*lp-Gdnpa-9*8wof`#nK7@=`s9t=!TDI&2dUFKRCyz|}Kw5klW$=W_4P&0_V z>zEbMDjc@7YNLC@tZtG?^b?Y>$VT5G>=@1Fub`bz-4m=FH<#KI?1y8n_e2qec8>dR zx!V?3st=&PH+h2^_2kJDg4qwg0FxWA=dqgcrJF36@lKa@YIyl$V)ctR4|2 zRV$&H%`Sb~AD`k$nz!wT4Jl- zd0qqQ)!pyE<9+A+c$c&n)+*4$7fr&h)aHK#JEHSOy=fnXtTijstAmR_K6%irPpIk6 z7$p>~Z4h`fDwu6FUy{>8Y)U`m0qx5&MYLxqJxK&HHzzw$Flta`dXS4xf1j)*tOHax z)Nb1kSaaY=$n}rZM<}Fn#e$fQ&*9U(7to<^z3nK6H=Uj}JTrcXfb15U_*@p!iTN!| zPajTLnGBBEy(_C;f?KFhKhDkSYv@kfn}=JWR%R}>M(o{`4ptzL56eL>D?`V=^Bf@E zm@pIxx7TL!F&*^pFmW6EL&%op`hs|+6UTmMz*R`ix$JGl6h^)UL9N@dZZav9G~FtOFmz2~9mIMK4V zB5xu?p4_~MHEuiYTF93O%zk@c4uYY!S1Gnx$PMAvA=r#k{VBa{73quvRzF|Ay_{D!jgC@hIfCw**! zS4Sy1vWW^<5^F|6tI{{`=(REU@9KRS9DW*)t?Ur~S~r+#J7RoSnHVw?-saI69~)=Y z0bV-;FyR<=GBW;cyxzp)wpV_NWg?~eFm4O)^i(RWcD>IBf$(4V!uUziEYk$CnWK=L zdct8y4WcOE3Mj$Bxx4R^4x8406^Vw{jerje@#wr_o>oElcMa$xl9LqqV)7zY*8pz(cqS1MUOvF3#WKn5TJ0jjuaGeP3AjhUm0Pp)pREC$W@RLSyw zk$#TmEA3K}z{h!EAseGPNu$y4_dvmQGeTCWT4gm9#2CQ$8b~gD za9|3lorb=0`ifkUS1sAlcDSci5un3+uTj#t<#AL=T)yn-{5uEGK^~HSH>@OKK)oh(R%$Wr`mZ6s|pB6NOTZu{JBP&WcB$o2^^dkOJUt*6Bx$Y z8{v-GdEBlnRcA|v*#a&k+JSA^juf92SZO>VM|r9lpQ2#KUAv;bUtR|v0C?z`2D@`< zSUDj%(^M0&KYx9hv^3;qq`%kR(r-=2~`k9Mhrz~N>{+Y2vuNZOjdwkC~0)W11fvc z+{}H_TWC3geVp$4VVuKd&TE)%aUOExBy`)QauR>j=_T%wkUnpx6=tKJrA};G@r|0w z<38u%9eflq;9h|^BGj{0G0l|S6uI&;o*3oWCtF;U(I^2QW7hPUcI8J-(>Dr$*U~;_ zQp<5oF|?H>aDb4X=SD}ytI{FDu`8MLCjk|HD8{eL8F2Zr(@$wqcUb9#O zj4~Llw)!2|7{|&FhDAn48+0QIR>`%V?<%LWy)bF>$AYhaDoa7-Z?Po?ZY|N%J4lTN z8`a~jA}GZlJq!o-{&LCR7i0&ScY^V8aX-Iv;}d^+b$Onm7&EP(EjNcN3Z48k-dO?d~>oxZm%~<2g6R+==2GLDzBCnz!&sz z>(z>?*NRE{KMy3P{n({OXERcdo{X^_Keb`+k=SfLyFj1u7RV~Z`|0q>e9 zW`C#xi&m)=ukFYu25dRZzu(z;=?ypzdbIpY95pFd#7oJ_H4WsGw$B~aF^;I+zBsgS z_Q`A|*}Uv{H?6N0p%;O>NLgN6%O#E2o@ts`!i*Y1IR?6_0aY0^dGgD#mz;Zu^*GCd zfMeF%VfL*h@cc=p4MA>=v6=kvWKDRny2;bDM}|=~8<`{EJYHC8@2!%XS3F(zC?S5K zEkKt5i=(xhztvL;RQaf0*Ai4COeHSo7)!qdw@!`+g59GQ$!{SAJU=@qcw+)GKTp#+ zj9DU~BI&SO*_$0zc$@r-)y1Bs@exzW8eUf;)A}2W)q^_kt#$K*l!Q#$O*?{GC=2IN zcMKGdSA8ST%Zb1hwL5E9Z!6clg^l8~)$-H4VDjeQj}3Efj*KMpii5Da&=k7V9$}46 zeLwtI^QBrb$YZl=Zg1_ zo*Z8uFE~C`I1HLjGXe7}T+biq{f^ib+?6V+pAm#s6OFD5CYs2Ct*!w zX>f3WW$>WrrXa7b&RyMKHcm$NU}hL+-P}3hsx#{fC`F#0ray}TaF`lHg%X(IJjM+K- zECNRtI+Q~Aw{Iyaqa3HMx07<3AacjW0?#}LQkhd!;*xYJo!{>D-qk8rB3|~56x-5b z8wO5ar;iV8>}Jy1X+0~Lld_oT&K;y>Uwkn*X#IqWFH=>sc4A~0mpmT-Tny2iQPN)r zk)%>{p$#xuXydBn_-_Dqe0p*s)P_F`1v{Y$0by7f&=QIhT+2&|$}OVnHYVnCfWKnB zerAv`{UB!|kT7Mc&Jx3VC^N}rwt4B$WeGb3lw&*qnXw*pTXw@&2!h>_JkheC%d_P} ztDspN6tH|@8Us2&6s!07kHKn*v zx_ValE;~iC@WhTeT%H@w^&CNplKYtSJR8jCdT=O3+ zcFjJuNf85V4CjwT9(A?>Y$;UiI;?PsZ~`H+$_K5I6Hp|Bo)sdbA<^F6et5py!8)Np z(PY#Nxk>lP5NHWXX7SpRw5Ci}8H%TsVpt3>xu!Gh5(VxZYXfJ7>3`|m3Pt1e@)ZYzflS94~K~xd3&voGf2Zv zIB)Z#eu=!9nJ?fxQ%a4Lqow+Sck%11>!)gCQFp3Z)@LAx^1#;@YQ`*Dfe8f7QeW>F zudD$hp*UgGGmh5#Qg>adKxi6OkujPlDj#{1QZgv_I`1YgmZw3|nwZV+I9{ZflB)r2 zC?%EMf=xHO7h-N5tju4ZilNgnk*KvOgsT!-;{8I$%%$V)|eAi$pm*lZqKO-@9CApGG*J!{i<-4ZencR}gS z3#ynLPx&;L>ytP2nTLm9GBrduYwneSQHAcd0YxG#!?=vULur`l%ZdS7CK7EP$VPta z6A#Y_oUmZI1iudKMfijGR7Y1^@S%?C8c-`^! zykD|f`n*K(Q5XrkrL&Y(RN&*`D(v(tPOvfhq^U>KX$A+Z#;9+KMCm#a_j>@-3>x4m z_VrUUl}V1)nN}aprKwYZy)h|=fOj=-ziG~)?L_R;M4_RhGpOc?K%dJdx_8+67QKk0 z*3uN%jJ^4tXZWyjaOf$eHA+;-xusR$@gK^@=51hvOwN7TnaHA;cEDpAqCgj}7&!eo zf+pzRNNM+}3aC7=ge6tqGTN8CUKma#K9vZc_f)O<`&?%7W>O3A+lW&)gI9$t+_mi} z-L0+ptShP<0zitlSA&`(=c=`?kj}UL)xlJWK!2c-WY;*A4_r;gB%hc!>Ovk~jam6) zC`*%)594FgMX4;jSwcHbKEd?ca%MCr0$`-+h{wqk@!CMTxq>Zl7-E0DE`+KA=NKC4 zE*20ns+I~tjUUa8<|iBOUsF^B{YQf26|E7Jv)_f10N~dK{nu|g z0kHd?>L;kiO1p@EhO?n4xs}J1VQtIrI-h&%HklMI1z+v!8karllt@FBFyp*VsLGF+ zRp-tQ>+DkAKH3ekug{;;0@Y4uLDYlNmTto1k3<9*7X1Cxz{jM@6Y+{>RLL}ZG(=_! zK*u%UAE60;1DB795IR{aXD*HoC{z2^0-RDLFkIEcEyL&^<;^0M%V(EP&o*n;7ogw8 z00b@{r(z@|wXuz(;8%h$xm?^Q_E#{Yq^8W@HXg1$R2;d6RcQ5^cBkrO$c$&1;;AsJ zt+g$g#w+!Cv4LHFCLVyj*ID;-ety0npO$RaAJe1DeXE%byOn76SH#Nr=46%f!H-c= zQC365K7inHbWH{@1j${#zKU~uD=~A!yzTURPNew*e0n^~>i9-56tHi5u^aI)JIGJK?NfK092O>A2XBp%v><4LDpg zcXzVGw{Ecd0OzPYTPsXh1D^T|pa_u?Rr(E2=Y!6jGb+-lk7PI^L4q+fczHn8DWd6O zN*T_D>U#|E|8ttQ{Q=fwIxs;ws(+Igqk!`rI^kPwEiwC@N)9*5S zcVhAEX9GK|YlpS?0u2KLXFoVZZuwSFZ&^QN_il7leQO9@MNBRNe66VNzeQt3ZVMZQ zt@(h9$PVb$^6^}Y7d-(#CgE`}bTBOVL>8eyxUiMVqOH`=8;PFfPDn_o)$C?oN7N&x zM{ySuYZv&GN(d>f8k0OX9f}>3zTp_MRtg-x!nFw8o6Fe^4Ii;)lb>p*r0*(wL;O*l zQk{7y*5S#)4~7=_rYvrqOqu(dWo`w=mLPtO)U=(HJjTC8T5+Bqbf#E2;{K5M`(07= zi&l^VSnW@eNu=yYbzvs+-=e0a(R=X~o;3UBktRqXBFsONs4s7zZ^S!7oFSs-A0BF&k_^X zHGqct;=O!y(&r-m8*yc0R z*7obj&atMA(R;v6F-x&$e2TX9`!ScvR;r3kd%!|=2~hDUV)CEC(71Wit=Bg%mR~9K zR34U+DusKylM1B5uACY~aZnUy*W=RItEu0Y!=^o6Rnu6*>SQXme9?C*W||x|YfRdn z;)n>nk}mn|8(Tt?&gBh?G6s6-YBN2_ z_%O+J#ua!yBhHJQu?pB>r<*k$r69QPelD{#)TK~Kw#PAhNAEJnn5gqckBHyCRd*|a zQss@M`tG@}v`-pm^#REGin`sgK@|0&Q>}LlwBg91qXIlkfsOE1T5B^Z=0d$`_@i6S zN`63L9g-sbI2IkA3}U-uF{^|0i{4{%=(yll*a;R7*V0q%i9c;DdKh%>wh7hbHz1b%h-#KGg0A3QRIiI};^D(~?F7 z_&)(n5J&}l3RvmIT^d1kr&S9ZVzYYkLZat6!2{W9$RJ@X6*+LRA)D?;8BcG=MbI)8jNdK69lK}RvBE(B~)@f}dl=h{o950WYCaiF{hI0BxJ?9@L zukmsQV@Uj8n(N7<4D57&_(!p|{qPC5kes}bIcnx0VB4G0S=1v+?frZShP%48(o6T~ zfB>5!kN1x>!&t(ZAs6+}w_Nxx7q{5Zk*d!0g`EUe+U9%=4<7|VG40Z(Rg$tztRzee z%YOHAUY^Nk^}|R=Nv=e9XrklWAjOA$7G=r@9$M47d7J)mB{Trl2u`f9x4N^|zQuB_ zwZprgzq<2zuhTgkc%!qV3btdEhKM@4ZF*XIDTXVLh}cJt=8k z##)&IsCD+jyrz#vKK>?)sNbz}=U%~9dm9MKNSFfKgk=W88)k0@a`LP>tx8`5rTuRU zXd=F65aZ{nMAN!opQ;tAPScd&cY_RMhYeo&kd@>a3MT&kI!sy3WR1S}`%0N9;kR15 zwP_)ne!Wupc|Jrvk(B}^X7~uOtQ!iPQaN_K)?rSGL^S7VM2>>czXGhqMv$1*B?>7; z{T1p^YE3XE#^8%zf2jTUY)!Iou8)vrU-;NcU&7i*)!k3W2ZV~T%x)GE(X}ytKlECP>zNhS zRz=4TrjwZ!dsL_cu9}rn54WByF!D!#yt|rj+EwnfSzV)AbqXf;*_|!$gC_bO=1VW7 z3M=b`h*wuM{d!C;kw`5bT^LKwJN6C(nuy$M=-FAEjC163?e%rXF;glOcRwU(@i`WV z%YsS22$P^w=X9l@l<0D}1l<$G%$5-;FJB72e=q(#-C5+p>PD0O7f>2_)u+9D*&KnN z{I$(}8#|8X=*^USFhK;w4W-pv1zrXAZ82M}O`yCpaTuN1)g=9v7rE*6eioh&g7AQ* z*w`T#79GmojghvF_apCAsQ0223$7}&CNzD23`94r;t_*@19%Tp7vA@xUsamYd(+>H zh-27wn$!$A-ky>B9V0A5<8_{jw{@QO?BXDEzH$LUzWk||+$)|En$2kmoXsa0%~4uf zu_;+kzMn_Rd66&^^f7HDPh1vUBXk}6H8`+0ek&ABejPa53k_kQ>SG=E_ftN{ebP^L z0qO(K=t*Vsg%!tMCTMoH?iy|!Or4GF49KC^rl##k0z) zU5xX?a_#VgN`5LsiF}{D6Kqy)e6ej-= zR8pcxeH+$&(A+Tc+fRo;ZsmJbndRm!t(MtGq`L9BZ_0H0-53cO(zM%JqkpA32ha;4TkOxU6viTBmO zwkjh&AXOdjybz%zN@AAfBz?U)(&BN->3{YO3)CNQN8Sn#Qmje$fA%4@MIdpp7Dd{E zDYUt-UbbQFWb7TE`FGe%lO-?J?@O-jxg(s8v5_r+F+ zK3F!Me2q)x2=tG!%n@~F14Tg^^N&y0x7LZe1GQU>{3yn2TBo9JQ%a=Us8Opz&%|Yk zY~`WxG-YV)ctK91{Q`aMS5?lp)zv%|k-h|K#U1riCG96)aYZSVJ6_-7>qAnKNVl>A zBcJt=JPSGW;PQYk#M{hv9|J7=4o$^-=cLHf_p7GEFYt^5SUy+2JDP3r%X_@9pkCP= zxOvNZ@L3qBp;~kM%FGH%O7E!Yrvdnu4Qh_eL_WKDi$~b=X$KI`eUcbu2116JaZ4%{ z_{J~`pxyIK5y@yq!CF0e!4oCKcn<&)OF#O*g5C^z)yEAlJTU4>mq2Af*^~-SEW~1;K(l* zR>d7<=QeKTIi2_Y_|)fs=ayMwL7BST1IH;jCc?#MnVD0ae7-*ye}aCignPy_SB1r& zvyr;5H`U~Ni7f^H_%6nDGX5^_uDufuP-k!!O?w1Dt^lOfrQQQ^<Jvfz$J625Y_Y^7QPkCUHE#%NJ!w{GD% zeSF?kO2TfS*8w~)n1%V_FkW}~(Bb#l-Jak8|x(sx8eMD%*yt(y35^1p0l zT97rufz#oaZE0a~UASfrJl*ByN>cc`ySux5WaLeHozw#RiIT>EW0!ZODgZFB2YJS) z}r@4#^RS9m!lT{#d|Go$SaD6&tVIcvmY-~;tXfv%i2#Hm?KkCJe z3SD>f1fnG;C%5?d`30tVAUFe!r$E16GN>R=Smc~)l3Wr)1@+!$XsP!XK|fvxsJy!@ z&V2J;{S#&|+$){__$U$~IjsD6Ni;jy^L7t#?(L$MYM)Odt(=`bI8} z0)^7*%lwl^3817Nv^imiOhHq625&r8r-1@_f@;2b=?@4PCFN`@D3r|ywUTWQ0N9ka zf&b<2mdodKXw^n<>H|Sfs3sf^pETU?&Sv5OC&9-d>=v#B(2x+3V|52iyB(H4{eAv2 zH>ULfH1Ab!J?K3+Gv!46^)4x?Zg}KR2GIq<0zoWjY41ZGXr?U9tJ-3EFsX9TK}Vsmv|`(t=`)_>71rl ztfr<50syA(FLFKc_53r2j5GwKFM9wSX7l6p;D=}sK#_c$>FDg4LLnt!nlg%!Q83dC zkkd5*R6HoQA3=svfBFtU^M(j2XxJHJOj&;iP}XNt&F(8i%qvMM@b3d4Up?&!%DM6h z9^x?Lx{?3A0mpK*A|lz>{b!|swc&B>0z-;$Cm6RbjFeRH0+gl|ng(q1AIn7q^kH&A z*L|I4#3;Ec?XC;$4WQsJ$4Vkg7thE$MFC(m9^VEtTpxl`Qjk_Q7KK1B@wdi7>p!~( zy6NO-nVIeTK;_|;55UPlI+dewGZogV*dz7}GzC|KOiLBe&cRF-M$J4uvKx2J+kgMu@&U`{rN~kbNBaySJ|| zpF-UKuyv&8qdg+IenMJWnmn?Uno#@j*RNl=xVXkyz%Zjydr(uqd8v{$4$60#^lL!v zsKfrZ5A?&k;hwB%>iJir xASf}yynXwzDCqgX01)-h&MdUhmf!emJ-_kl`%wJAAELOSD6597zHb)#e*hPl*h&BZ From 0fa5dd4d7e16a825d4d65dff3c69cf6f8bf2101f Mon Sep 17 00:00:00 2001 From: Alvin Date: Fri, 21 Apr 2023 15:47:05 +0000 Subject: [PATCH 30/44] Apr 21, 2023, 11:47 AM --- posts/coder-and-nix/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index cb9705b..86f6aa8 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -103,7 +103,7 @@ At this point you're ready to start using Nix with Coder. There are a few differ ### NixOS Docker Template -To get started you will need to copy the Docker template in Coder. We will add the `nix-devcontainer` image to the template {++ where, what line? what is it replacing? ++}{++ Any other instructions with screenshots and code samples... ++} +Much of the functionality of Coder comes from the flexibility of [template](https://coder.com/docs/v2/latest/templates). To get started you will need to copy the Docker template in Coder. We will add the `nix-devcontainer` image to the template {++ where, what line? what is it replacing? ++}{++ Any other instructions with screenshots and code samples... ++} After adding your template you can begin to use Coder inside your Nix environment. From 5d3c5a7feee378e7e6e65f256573d81bf24b08b2 Mon Sep 17 00:00:00 2001 From: Alvin Date: Fri, 21 Apr 2023 17:10:41 +0000 Subject: [PATCH 31/44] Apr 21, 2023, 1:10 PM --- posts/coder-and-nix/index.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index 86f6aa8..d5482dd 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -103,7 +103,14 @@ At this point you're ready to start using Nix with Coder. There are a few differ ### NixOS Docker Template -Much of the functionality of Coder comes from the flexibility of [template](https://coder.com/docs/v2/latest/templates). To get started you will need to copy the Docker template in Coder. We will add the `nix-devcontainer` image to the template {++ where, what line? what is it replacing? ++}{++ Any other instructions with screenshots and code samples... ++} +Much of the functionality of Coder comes from the flexibility of [template](https://coder.com/docs/v2/latest/templates). To get started you will need to copy the Docker template in Coder. We will add the `nix-devcontainer` image to the template + +```dockerfile +FROM ghcr.io/xtruder/nix-devcontainer:v1 +ARG USER=coder +``` + +{++ Any other instructions with screenshots and code samples... ++} After adding your template you can begin to use Coder inside your Nix environment. From 7d8438936f755805e345050e519e34a6a41d489b Mon Sep 17 00:00:00 2001 From: Alvin Date: Fri, 21 Apr 2023 17:38:20 +0000 Subject: [PATCH 32/44] Apr 21, 2023, 1:38 PM --- posts/coder-and-nix/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index d5482dd..7b59e3c 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -103,7 +103,7 @@ At this point you're ready to start using Nix with Coder. There are a few differ ### NixOS Docker Template -Much of the functionality of Coder comes from the flexibility of [template](https://coder.com/docs/v2/latest/templates). To get started you will need to copy the Docker template in Coder. We will add the `nix-devcontainer` image to the template +Much of the functionality of Coder comes from the flexibility of [template](https://coder.com/docs/v2/latest/templates). To get started you will need to copy the Docker template in Coder. We will add the `nix-devcontainer` image to the `Dockerfile` ```dockerfile FROM ghcr.io/xtruder/nix-devcontainer:v1 From dd3803006f19ecd7dc5490f424bd65a3142caf53 Mon Sep 17 00:00:00 2001 From: Alvin Date: Fri, 21 Apr 2023 17:50:13 +0000 Subject: [PATCH 33/44] Apr 21, 2023, 1:50 PM --- posts/coder-and-nix/index.md | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index 7b59e3c..6f97a9d 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -103,22 +103,28 @@ At this point you're ready to start using Nix with Coder. There are a few differ ### NixOS Docker Template -Much of the functionality of Coder comes from the flexibility of [template](https://coder.com/docs/v2/latest/templates). To get started you will need to copy the Docker template in Coder. We will add the `nix-devcontainer` image to the `Dockerfile` +Much of the functionality of Coder comes from the flexibility of [template](https://coder.com/docs/v2/latest/templates). To get started you will need to copy the Docker template in Coder. You copy this template using the Coder CLI by entering `coder templates init` into your terminal and selecting the `Develop in Docker` option. + +![screenshot of selecting docker]() + +`Develop in Docker` will create a directory named `docker` in your current directory. + +![screenshot of extracing template]() + +Next, navigate to the `docker` directory and edit the `Dockerfile` located at `build/Dockerfile`. We will edit this file to include the `nix-devcontainer` image and the `nix-shell` command mentioned earlier in the article. ```dockerfile FROM ghcr.io/xtruder/nix-devcontainer:v1 ARG USER=coder + +RUN nix-shell ``` -{++ Any other instructions with screenshots and code samples... ++} +Finally, be sure to add your `shell.nix` file to the After adding your template you can begin to use Coder inside your Nix environment. -### Using Your `shell.nix` File - -Now that your Nix Docker template is set up in Coder, lets add your `shell.nix` configuration into the Coder workspace. {++ Instructions on how and where to add this configuration ++} - - As a final step, lets say you have a Todo application you prefer to use alongside your code. You can clone this app and add it to Nix by doing the following: +As a final step, lets say you have a Todo application you prefer to use alongside your code. You can clone this app and add it to Nix by doing the following: {++ Describe how to clone a "todo" project (or something cooler) From f2297090ab2a3b058146d99610532006f3a37cb3 Mon Sep 17 00:00:00 2001 From: Alvin Date: Fri, 21 Apr 2023 18:06:52 +0000 Subject: [PATCH 34/44] Apr 21, 2023, 2:06 PM --- posts/coder-and-nix/index.md | 37 ++++++------------ .../static/develop_in_docker.png | Bin 0 -> 28150 bytes .../static/extract_docker_template.png | Bin 0 -> 17419 bytes 3 files changed, 12 insertions(+), 25 deletions(-) create mode 100644 posts/coder-and-nix/static/develop_in_docker.png create mode 100644 posts/coder-and-nix/static/extract_docker_template.png diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index 6f97a9d..2769bef 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -94,22 +94,17 @@ Now running the `nix-shell` command will create an environment containing the sh ## Using Nix with Coder -{++ -Adding template to Coder that includes Nix (Docker -template modified with nix-devcontainer image) -++} - At this point you're ready to start using Nix with Coder. There are a few different ways you can combine thee two tools, but one really effective method to get the most of both environments is to run Coder within a Nix environment by using Docker. In this example we will be using modifying the Docker template in Coder to add the [nix-devcontainer image](https://github.com/xtruder/nix-devcontainer). ### NixOS Docker Template Much of the functionality of Coder comes from the flexibility of [template](https://coder.com/docs/v2/latest/templates). To get started you will need to copy the Docker template in Coder. You copy this template using the Coder CLI by entering `coder templates init` into your terminal and selecting the `Develop in Docker` option. -![screenshot of selecting docker]() +![screenshot of selecting docker](static/develop_in_docker.png) `Develop in Docker` will create a directory named `docker` in your current directory. -![screenshot of extracing template]() +![screenshot of extracing template](static/extract_docker_template.png) Next, navigate to the `docker` directory and edit the `Dockerfile` located at `build/Dockerfile`. We will edit this file to include the `nix-devcontainer` image and the `nix-shell` command mentioned earlier in the article. @@ -120,21 +115,7 @@ ARG USER=coder RUN nix-shell ``` -Finally, be sure to add your `shell.nix` file to the - -After adding your template you can begin to use Coder inside your Nix environment. - -As a final step, lets say you have a Todo application you prefer to use alongside your code. You can clone this app and add it to Nix by doing the following: - -{++ -Describe how to clone a "todo" project (or something cooler) -and run it in Coder: https://github.com/nix-community/todomvc-nix -++} - -First, find project you would like to clone. In this example we are using the [Nix Todo MVC](https://github.com/nix-community/todomvc-nix). - -{-- -Now that you have your NodeJS environment and custom toolchain setup in `shell.nix`, lets add Coder to your environment. Coder is available as a nix package and can be added to your config as the same way you have added your custom software in your tool chain. You can do so by modifying your `shell.nix` file to include the Coder package, like in the example code below: +Finally, be sure to add your `shell.nix` file to the same directory as your `Dockerfile`, which is `build` in this example. Your `shell.nix` file should contain the following code ```nix # shell.nix @@ -143,7 +124,6 @@ with (import {}); mkshell { buildInputs = [ (import ./nodejs.nix { inherit pkgs; }) - coder fzf zsh zsh-autoenv @@ -152,8 +132,15 @@ mkshell { } ``` -Now when you run `nix-shell` you will have your NodeJS tooling, custom zsh configuration, and Coder available. These tools will be available immediately so you can get to work right away. ---} +Your template is now set up and your `shell.nix` file has been copied to your template folder. Now you can upload your template to Coder using the `coder templates push` command in your terminal. + +Once this template is uploaded you can create a new [workspace](https://coder.com/docs/v1/latest/workspaces) in Coder that is running in a full NixOS environment that contains all of the tools you defined in your `shell.nix` file. + +### Using Other Applications + +As a final step, lets say you have a Todo application you prefer to use alongside your code. You can clone this app and add it to Nix by doing the following: + +First, find project you would like to clone. In this example we are using the [Nix Todo MVC](https://github.com/nix-community/todomvc-nix). ## Conclusion diff --git a/posts/coder-and-nix/static/develop_in_docker.png b/posts/coder-and-nix/static/develop_in_docker.png new file mode 100644 index 0000000000000000000000000000000000000000..6a3c5eef344b2546922afd539bd92ba5a3bf4397 GIT binary patch literal 28150 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 P0zyGXRk~i%Ed2igbA#Ho literal 0 HcmV?d00001 From 62ceb5b36f79579cb4647c713c811e768a932bca Mon Sep 17 00:00:00 2001 From: Alvin Date: Fri, 21 Apr 2023 18:08:59 +0000 Subject: [PATCH 35/44] Apr 21, 2023, 2:08 PM --- posts/coder-and-nix/index.md | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index 2769bef..9d2f70b 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -100,11 +100,32 @@ At this point you're ready to start using Nix with Coder. There are a few differ Much of the functionality of Coder comes from the flexibility of [template](https://coder.com/docs/v2/latest/templates). To get started you will need to copy the Docker template in Coder. You copy this template using the Coder CLI by entering `coder templates init` into your terminal and selecting the `Develop in Docker` option. -![screenshot of selecting docker](static/develop_in_docker.png) + + +```txt +> coder templates init +A template defines infrastructure as code to be provisioned for individual +developer workspaces. Select an example to be copied to the active directory: + +Type to search + + > Develop in Docker + Run workspaces on a Docker host using registry images + https://github.com/coder/coder/tree/main/examples/templates/docker +``` `Develop in Docker` will create a directory named `docker` in your current directory. -![screenshot of extracing template](static/extract_docker_template.png) + + +```txt +Extracting docker to ./docker... +Create your template by running: + + cd ./docker && coder templates create + +Examples provide a starting point and are expected to be edited! 🎨 +``` Next, navigate to the `docker` directory and edit the `Dockerfile` located at `build/Dockerfile`. We will edit this file to include the `nix-devcontainer` image and the `nix-shell` command mentioned earlier in the article. From bbb82b770f2e3f774cf125336ade1d164d6a9ab5 Mon Sep 17 00:00:00 2001 From: Alvin Date: Fri, 21 Apr 2023 18:14:59 +0000 Subject: [PATCH 36/44] Apr 21, 2023, 2:14 PM --- posts/coder-and-nix/index.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index 9d2f70b..2bf1370 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -163,6 +163,13 @@ As a final step, lets say you have a Todo application you prefer to use alongsid First, find project you would like to clone. In this example we are using the [Nix Todo MVC](https://github.com/nix-community/todomvc-nix). +```sh +git clone https://github.com/nix-community/todomvc-nix.git +cd todomvc-nix +``` + +The TodoMVC app has an [`.envrc`](https://github.com/nix-community/todomvc-nix/blob/master/.envrc) file in the root directory. This means that when you `cd` to this directory Nix knows to begin building the application based on the instructions from `.envrc`. + ## Conclusion In this article you learned a bit about Coder and Nix, and how you can combine the two platforms to create a robust remote development environment that is reproducible and can be extended to incorporate your own tools. Nix and Coder both aim to provide developers with a worry-free environment, allowing your team to focus on work and not troubleshooting. From 03b25605caf20a2fc4ffb3cfdb13ab88875d515d Mon Sep 17 00:00:00 2001 From: Alvin Date: Fri, 21 Apr 2023 18:16:36 +0000 Subject: [PATCH 37/44] Apr 21, 2023, 2:16 PM --- posts/coder-and-nix/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index 2bf1370..c6fcddb 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -168,7 +168,7 @@ git clone https://github.com/nix-community/todomvc-nix.git cd todomvc-nix ``` -The TodoMVC app has an [`.envrc`](https://github.com/nix-community/todomvc-nix/blob/master/.envrc) file in the root directory. This means that when you `cd` to this directory Nix knows to begin building the application based on the instructions from `.envrc`. +The TodoMVC app has an [`.envrc`](https://github.com/nix-community/todomvc-nix/blob/master/.envrc) file in the root directory. This means that when you `cd` to this directory Nix knows to begin building the application based on the instructions from `.envrc`. After a few moments of building you will be able to start using this application by {++ what / how? ++} ## Conclusion From 36b193bba4406354680e16f11714f5465a1ced8f Mon Sep 17 00:00:00 2001 From: Alvin Date: Fri, 21 Apr 2023 14:29:16 -0400 Subject: [PATCH 38/44] changed heading title --- posts/coder-and-nix/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index c6fcddb..c8a2b76 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -96,9 +96,9 @@ Now running the `nix-shell` command will create an environment containing the sh At this point you're ready to start using Nix with Coder. There are a few different ways you can combine thee two tools, but one really effective method to get the most of both environments is to run Coder within a Nix environment by using Docker. In this example we will be using modifying the Docker template in Coder to add the [nix-devcontainer image](https://github.com/xtruder/nix-devcontainer). -### NixOS Docker Template +### NixOS, Docker, and `nix-shell` -Much of the functionality of Coder comes from the flexibility of [template](https://coder.com/docs/v2/latest/templates). To get started you will need to copy the Docker template in Coder. You copy this template using the Coder CLI by entering `coder templates init` into your terminal and selecting the `Develop in Docker` option. +Much of the functionality of Coder comes from the flexibility of [template](https://coder.com/docs/v2/latest/templates). To get started you will need to copy the Docker template in Coder. You copy this template using the [Coder CLI](https://github.com/coder/coder) by entering `coder templates init` into your terminal and selecting the `Develop in Docker` option. From 4c61ae251e7614cf9386fdf4b2b1709547207ce1 Mon Sep 17 00:00:00 2001 From: Alvin Date: Fri, 21 Apr 2023 14:31:08 -0400 Subject: [PATCH 39/44] looking for a replacement for todomvc-nix... --- posts/coder-and-nix/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index c8a2b76..2544863 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -159,6 +159,8 @@ Once this template is uploaded you can create a new [workspace](https://coder.co ### Using Other Applications +{>> todo: looking for a different application to use <<} + As a final step, lets say you have a Todo application you prefer to use alongside your code. You can clone this app and add it to Nix by doing the following: First, find project you would like to clone. In this example we are using the [Nix Todo MVC](https://github.com/nix-community/todomvc-nix). From d6a9e05f64c3b74a21e6d77b878b33af3a5d7a3b Mon Sep 17 00:00:00 2001 From: Alvin Date: Fri, 21 Apr 2023 16:05:41 -0400 Subject: [PATCH 40/44] todo: update last section to include --- posts/coder-and-nix/index.md | 10 +++++----- posts/coder-and-nix/static/.DS_Store | Bin 6148 -> 0 bytes 2 files changed, 5 insertions(+), 5 deletions(-) delete mode 100644 posts/coder-and-nix/static/.DS_Store diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index 2544863..54d7e77 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -153,14 +153,13 @@ mkshell { } ``` -Your template is now set up and your `shell.nix` file has been copied to your template folder. Now you can upload your template to Coder using the `coder templates push` command in your terminal. - -Once this template is uploaded you can create a new [workspace](https://coder.com/docs/v1/latest/workspaces) in Coder that is running in a full NixOS environment that contains all of the tools you defined in your `shell.nix` file. +Your template is now set up and your `shell.nix` file has been copied to your template folder. Now you can upload your template to Coder using the `coder templates push` command in your terminal. Once this template is uploaded you can use this template to create a new [workspace](https://coder.com/docs/v1/latest/workspaces). This workspace will create a full NixOS environment that contains all of the tools you defined in your `shell.nix` file. ### Using Other Applications -{>> todo: looking for a different application to use <<} +{>> todo: update the section below using [makes](https://github.com/fluidattacks/makes) <<} +{-- As a final step, lets say you have a Todo application you prefer to use alongside your code. You can clone this app and add it to Nix by doing the following: First, find project you would like to clone. In this example we are using the [Nix Todo MVC](https://github.com/nix-community/todomvc-nix). @@ -170,7 +169,8 @@ git clone https://github.com/nix-community/todomvc-nix.git cd todomvc-nix ``` -The TodoMVC app has an [`.envrc`](https://github.com/nix-community/todomvc-nix/blob/master/.envrc) file in the root directory. This means that when you `cd` to this directory Nix knows to begin building the application based on the instructions from `.envrc`. After a few moments of building you will be able to start using this application by {++ what / how? ++} +The TodoMVC app has an [`.envrc`](https://github.com/nix-community/todomvc-nix/blob/master/.envrc) file in the root directory. This means that when you `cd` to this directory Nix knows to begin building the application based on the instructions from `.envrc`. After a few moments of building you will be able to start using this application by {>> what / how? <<} +--} ## Conclusion diff --git a/posts/coder-and-nix/static/.DS_Store b/posts/coder-and-nix/static/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 Date: Sat, 22 Apr 2023 00:35:52 -0400 Subject: [PATCH 41/44] fixed issues with Dockerfile, add instructions, diagrams --- posts/coder-and-nix/index.md | 64 +++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index 54d7e77..3510e1c 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -127,50 +127,54 @@ Create your template by running: Examples provide a starting point and are expected to be edited! 🎨 ``` -Next, navigate to the `docker` directory and edit the `Dockerfile` located at `build/Dockerfile`. We will edit this file to include the `nix-devcontainer` image and the `nix-shell` command mentioned earlier in the article. +The `docker` directory that contains your newly copied template should look something like the diagram below: -```dockerfile -FROM ghcr.io/xtruder/nix-devcontainer:v1 -ARG USER=coder - -RUN nix-shell +```txt +├── docker +│   ├── README.md +│   ├── build +│   │   ├── Dockerfile +│   └── main.tf ``` -Finally, be sure to add your `shell.nix` file to the same directory as your `Dockerfile`, which is `build` in this example. Your `shell.nix` file should contain the following code +Next, be sure to add the tools from your `shell.nix` file to the Docker image. To do this we will create a new file called `tools.nix`. This file will contain the following code: ```nix -# shell.nix +with import {}; [ fzf zsh zsh-autoenv zsh-powerlevel10k ] +``` -with (import {}); -mkshell { - buildInputs = [ - (import ./nodejs.nix { inherit pkgs; }) - fzf - zsh - zsh-autoenv - zsh-powerlevel10k - ]; -} +After saving the code to the `tools.nix` file, be sure to move this file to the same directory as your `Dockerfile`. In this example, this file will live in the `docker/build` directory + +```txt +├── docker +│   ├── README.md +│   ├── build +│   │   ├── Dockerfile +│   │   └── tools.nix # docker/build/tools.nix +│   └── main.tf ``` -Your template is now set up and your `shell.nix` file has been copied to your template folder. Now you can upload your template to Coder using the `coder templates push` command in your terminal. Once this template is uploaded you can use this template to create a new [workspace](https://coder.com/docs/v1/latest/workspaces). This workspace will create a full NixOS environment that contains all of the tools you defined in your `shell.nix` file. +Finally, we need to tell Docker how to load the NixOS container, create a user named `coder`, and install the tools from your `tools.nix` file into your local environment. To do this we will replace the default Dockerfile located at `docker/build/Dockerfile` with the new code below. Edit your Dockerfile to include on the following commands: -### Using Other Applications +```dockerfile +FROM ghcr.io/xtruder/nix-devcontainer:v1 +ARG USER=coder +ADD tools.nix /tools.nix +RUN nix-env -if /tools.nix && echo "tools.nix installed" +``` -{>> todo: update the section below using [makes](https://github.com/fluidattacks/makes) <<} +To use this new template with Coder, you have to add the template to your running Coder instance. -{-- -As a final step, lets say you have a Todo application you prefer to use alongside your code. You can clone this app and add it to Nix by doing the following: +1. Navigte to the root of the template `docker` template directory +2. Next, update the template by running `coder templates edit docker` in your terminal +3. Now add the template to your Coder instance by running `coder templates push docker` -First, find project you would like to clone. In this example we are using the [Nix Todo MVC](https://github.com/nix-community/todomvc-nix). +Once this template is uploaded you can use this template to create a new [workspace](https://coder.com/docs/v1/latest/workspaces). This workspace will create a full NixOS environment that contains all of the tools you defined in your `tools.nix` file. -```sh -git clone https://github.com/nix-community/todomvc-nix.git -cd todomvc-nix -``` +### Using Other Applications + +{>> todo: update the section below using ?? <<} -The TodoMVC app has an [`.envrc`](https://github.com/nix-community/todomvc-nix/blob/master/.envrc) file in the root directory. This means that when you `cd` to this directory Nix knows to begin building the application based on the instructions from `.envrc`. After a few moments of building you will be able to start using this application by {>> what / how? <<} ---} ## Conclusion From 4e04ed85188829fd40eb8b005a44cf71922f8531 Mon Sep 17 00:00:00 2001 From: Alvin Date: Sat, 22 Apr 2023 00:37:59 -0400 Subject: [PATCH 42/44] change header name to match command --- posts/coder-and-nix/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index 3510e1c..5107cf9 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -96,7 +96,7 @@ Now running the `nix-shell` command will create an environment containing the sh At this point you're ready to start using Nix with Coder. There are a few different ways you can combine thee two tools, but one really effective method to get the most of both environments is to run Coder within a Nix environment by using Docker. In this example we will be using modifying the Docker template in Coder to add the [nix-devcontainer image](https://github.com/xtruder/nix-devcontainer). -### NixOS, Docker, and `nix-shell` +### NixOS, Docker, and `nix-env` Much of the functionality of Coder comes from the flexibility of [template](https://coder.com/docs/v2/latest/templates). To get started you will need to copy the Docker template in Coder. You copy this template using the [Coder CLI](https://github.com/coder/coder) by entering `coder templates init` into your terminal and selecting the `Develop in Docker` option. From 4854f57f742b66b15eabe8c002ccc51a0fdf8841 Mon Sep 17 00:00:00 2001 From: Alvin Date: Sat, 22 Apr 2023 12:23:45 -0400 Subject: [PATCH 43/44] add content to Using Other Applications section --- posts/coder-and-nix/index.md | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index 5107cf9..03a9ad1 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -98,7 +98,7 @@ At this point you're ready to start using Nix with Coder. There are a few differ ### NixOS, Docker, and `nix-env` -Much of the functionality of Coder comes from the flexibility of [template](https://coder.com/docs/v2/latest/templates). To get started you will need to copy the Docker template in Coder. You copy this template using the [Coder CLI](https://github.com/coder/coder) by entering `coder templates init` into your terminal and selecting the `Develop in Docker` option. +Much of the functionality of Coder comes from the flexibility of [template](https://coder.com/blog/managing-templates-in-coder). To get started you will need to copy the Docker template in Coder. You copy this template using the [Coder CLI](https://github.com/coder/coder) by entering `coder templates init` into your terminal and selecting the `Develop in Docker` option. @@ -137,13 +137,15 @@ The `docker` directory that contains your newly copied template should look some │   └── main.tf ``` -Next, be sure to add the tools from your `shell.nix` file to the Docker image. To do this we will create a new file called `tools.nix`. This file will contain the following code: +Next, be sure to add the tools from your `shell.nix` file to the Docker image. To do this we will create a new file called `tools.nix`. This file will be loaded using the `nix-env` to load your tools into the current shell by default, whereas `shell.nix` can be used for ad-hoc dependencies. + +The contents of your `tools.nix` should contain the following contents: ```nix with import {}; [ fzf zsh zsh-autoenv zsh-powerlevel10k ] ``` -After saving the code to the `tools.nix` file, be sure to move this file to the same directory as your `Dockerfile`. In this example, this file will live in the `docker/build` directory +After saving the above code to the `tools.nix` file, be sure to move this file to the same directory as your `Dockerfile`. In this example, this file will live in the `docker/build` directory ```txt ├── docker @@ -163,18 +165,23 @@ ADD tools.nix /tools.nix RUN nix-env -if /tools.nix && echo "tools.nix installed" ``` -To use this new template with Coder, you have to add the template to your running Coder instance. +To use this new template with Coder, you have to add the template to your running Coder instance. You can do this from your terminal: 1. Navigte to the root of the template `docker` template directory -2. Next, update the template by running `coder templates edit docker` in your terminal -3. Now add the template to your Coder instance by running `coder templates push docker` +2. Next, register your updated template with Coder by running `coder templates edit docker` +3. Now upload the template to your Coder instance by running `coder templates push docker` Once this template is uploaded you can use this template to create a new [workspace](https://coder.com/docs/v1/latest/workspaces). This workspace will create a full NixOS environment that contains all of the tools you defined in your `tools.nix` file. ### Using Other Applications -{>> todo: update the section below using ?? <<} +Since Nix is an OS and a package manager you can use nix tools to install just about any software to your environment. Let's say you want to use [emanote](https://emanote.srid.ca/start) to take project notes and share those notes with your team. You can install `emanote` to your [nix profile](https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-profile.html) by running the following command: + +```bash +nix profile install github:srid/emanote +``` +Nix will ask you to confirm a few settings and then will install `emanote` in your environment. Point `emanote` to your notes folder and enter `emanote run --port 8080` to start a server to view your notes. ## Conclusion From 3c557831efae54c9e9846bc08bd9965fd761c8b1 Mon Sep 17 00:00:00 2001 From: Alvin Date: Sat, 22 Apr 2023 12:26:55 -0400 Subject: [PATCH 44/44] add nodejs.nix to example --- posts/coder-and-nix/index.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/posts/coder-and-nix/index.md b/posts/coder-and-nix/index.md index 03a9ad1..a2169fd 100644 --- a/posts/coder-and-nix/index.md +++ b/posts/coder-and-nix/index.md @@ -46,7 +46,6 @@ The nix-shell command resolves many of the uncertainties of the shared developme ```bash nix-shell -p fzf - ``` The above command will add `fzf` to your local nix store and temporarily modify your $PATH variable to include the command in your shell. `fzf` will be available immediately. @@ -142,7 +141,7 @@ Next, be sure to add the tools from your `shell.nix` file to the Docker image. T The contents of your `tools.nix` should contain the following contents: ```nix -with import {}; [ fzf zsh zsh-autoenv zsh-powerlevel10k ] +with import {}; [ fzf zsh zsh-autoenv zsh-powerlevel10k (import ./nodejs.nix { inherit pkgs; })] ``` After saving the above code to the `tools.nix` file, be sure to move this file to the same directory as your `Dockerfile`. In this example, this file will live in the `docker/build` directory