diff --git a/CHANGELOG.md b/CHANGELOG.md index 61f94d8a..a40f9991 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,8 +5,8 @@ ## __WORK IN PROGRESS__ (at the beginning of a new line ) --> - ## __WORK IN PROGRESS__ +* (UncleSamSwiss) Remove rsync from parcel devcontainer (#589) ยท [Migration guide](docs/updates/20200924_devcontainer_parcel.md) * (AlCalzone) Fix TypeError resulting from CI answer change (fixes #590) ## 1.29.0 (2020-09-22) diff --git a/docs/updates/20200924_devcontainer_parcel.md b/docs/updates/20200924_devcontainer_parcel.md new file mode 100644 index 00000000..6e0d5f3d --- /dev/null +++ b/docs/updates/20200924_devcontainer_parcel.md @@ -0,0 +1,62 @@ +# Remove rsync from parcel devcontainer + +This migration is **only relevant** if you're using a **React UI** for Admin. + +Since the introduction of [VSCode devcontainers](./20200902_vscode_devcontainers.md) we were using our own file system polling for the `parcel` container. +Because parcel (or rather Chokidar) supports polling, the container setup can be simplified. + +## Simple migration + +- Recreate the `.devcontainer` folder or copy it from the template on GitHub +- Replace the `parcel` container definition in `./.devcontainers/docker-compose.yml` with the newly created +- Delete the folder `./.devcontainers/parcel` and replace it with the newly generated folder of the same name +- Rebuild the remote container with the following command in VS Code: + `Remote-Containers: Rebuild Container` + +## Manual migration + +- Change the `parcel` section of `./.devcontainers/docker-compose.yml` to the following (add the environment variable `CHOKIDAR_USEPOLLING`): + +```yml +parcel: + container_name: parcel- + build: ./parcel + expose: + - 1234 + ports: + - "1235:1235" + volumes: + - ..:/workspace:cached + environment: + - CHOKIDAR_USEPOLLING=1 +``` + +- Remove the following two scripts in `./.devcontainers/parcel/` + - `run-sync.sh` + - `sync.sh` +- Change `./.devcontainers/parcel/run.sh` to contain the following: + +```bash +#!/bin/bash +cd /workspace + +echo "Installing all dependencies..." +npm install + +npm run watch:parcel +``` + +- Change `./.devcontainers/parcel/Dockerfile` to contain the following: + +```Dockerfile +FROM node:12 + +RUN mkdir -p /usr/app + +COPY *.sh /usr/app/ + +CMD /bin/bash -c "/usr/app/run.sh" +``` + +- Rebuild the remote container with the following command in VS Code: + `Remote-Containers: Rebuild Container` diff --git a/templates/_devcontainer/docker-compose.yml.ts b/templates/_devcontainer/docker-compose.yml.ts index 1784a1e7..5c1fa09e 100644 --- a/templates/_devcontainer/docker-compose.yml.ts +++ b/templates/_devcontainer/docker-compose.yml.ts @@ -38,6 +38,8 @@ ${needsParcel ? (` - '1235:1235' volumes: - ..:/workspace:cached + environment: + - CHOKIDAR_USEPOLLING=1 `) : ""} # Reverse proxy to load up-to-date admin sources from the repo nginx: diff --git a/templates/_devcontainer/parcel/_Dockerfile.ts b/templates/_devcontainer/parcel/_Dockerfile.ts index 40ba7a9f..e37eafce 100644 --- a/templates/_devcontainer/parcel/_Dockerfile.ts +++ b/templates/_devcontainer/parcel/_Dockerfile.ts @@ -8,10 +8,7 @@ const templateFunction: TemplateFunction = answers => { const template = ` FROM node:12 -RUN apt-get update && apt-get install -y rsync - RUN mkdir -p /usr/app -RUN mkdir -p /usr/workspace COPY *.sh /usr/app/ diff --git a/templates/_devcontainer/parcel/run-sync.sh.ts b/templates/_devcontainer/parcel/run-sync.sh.ts deleted file mode 100644 index e1f59e32..00000000 --- a/templates/_devcontainer/parcel/run-sync.sh.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { TemplateFunction } from "../../../src/lib/createAdapter"; - -const templateFunction: TemplateFunction = answers => { - - const devcontainer = answers.tools && answers.tools.includes("devcontainer"); - if (!devcontainer) return; - - const template = ` -#!/bin/bash -while : -do - /usr/app/sync.sh - sleep 1 -done -`; - return template.trim(); -}; - -templateFunction.customPath = ".devcontainer/parcel/run-sync.sh"; -templateFunction.noReformat = true; -export = templateFunction; diff --git a/templates/_devcontainer/parcel/run.sh.ts b/templates/_devcontainer/parcel/run.sh.ts index b343ab66..bc71bd82 100644 --- a/templates/_devcontainer/parcel/run.sh.ts +++ b/templates/_devcontainer/parcel/run.sh.ts @@ -7,18 +7,12 @@ const templateFunction: TemplateFunction = answers => { const template = ` #!/bin/bash -echo "Starting initial sync..." -/usr/app/sync.sh - -cd /usr/workspace +cd /workspace echo "Installing all dependencies..." npm install -# run the following two commands in parallel (honoring Ctrl-C) -# - npm run watch:parcel -# - /usr/app/run-sync.sh -(echo "npm run watch:parcel"; echo "/usr/app/run-sync.sh") | xargs -I{} -n 1 -P 2 /bin/bash -c "{}" +npm run watch:parcel `; return template.trim(); }; diff --git a/templates/_devcontainer/parcel/sync.sh.ts b/templates/_devcontainer/parcel/sync.sh.ts deleted file mode 100644 index e960bdf8..00000000 --- a/templates/_devcontainer/parcel/sync.sh.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { TemplateFunction } from "../../../src/lib/createAdapter"; - -const templateFunction: TemplateFunction = answers => { - - const devcontainer = answers.tools && answers.tools.includes("devcontainer"); - if (!devcontainer) return; - - const template = ` -#!/bin/bash -rsync -aiz --inplace --exclude={'node_modules','.git','.cache','admin/build'} /workspace/ /usr/workspace -`; - return template.trim(); -}; - -templateFunction.customPath = ".devcontainer/parcel/sync.sh"; -templateFunction.noReformat = true; -export = templateFunction; diff --git a/templates/index.ts b/templates/index.ts index 20fc1092..7d6c51e1 100644 --- a/templates/index.ts +++ b/templates/index.ts @@ -5,33 +5,6 @@ import { TemplateFunction } from "../src/lib/createAdapter"; const templates: { name: string, templateFunction: TemplateFunction }[] = [ - { name: "LICENSE.ts", templateFunction: require("./LICENSE") }, - { name: "README.md.ts", templateFunction: require("./README.md") }, - { name: "_babelrc.ts", templateFunction: require("./_babelrc") }, - { name: "_create-adapter.json.ts", templateFunction: require("./_create-adapter.json") }, - { name: "_devcontainer/README.md.ts", templateFunction: require("./_devcontainer/README.md") }, - { name: "_devcontainer/devcontainer.json.ts", templateFunction: require("./_devcontainer/devcontainer.json") }, - { name: "_devcontainer/docker-compose.yml.ts", templateFunction: require("./_devcontainer/docker-compose.yml") }, - { name: "_devcontainer/iobroker/_Dockerfile.ts", templateFunction: require("./_devcontainer/iobroker/_Dockerfile") }, - { name: "_devcontainer/nginx/nginx.conf.ts", templateFunction: require("./_devcontainer/nginx/nginx.conf") }, - { name: "_devcontainer/parcel/_Dockerfile.ts", templateFunction: require("./_devcontainer/parcel/_Dockerfile") }, - { name: "_devcontainer/parcel/run-sync.sh.ts", templateFunction: require("./_devcontainer/parcel/run-sync.sh") }, - { name: "_devcontainer/parcel/run.sh.ts", templateFunction: require("./_devcontainer/parcel/run.sh") }, - { name: "_devcontainer/parcel/sync.sh.ts", templateFunction: require("./_devcontainer/parcel/sync.sh") }, - { name: "_eslintrc_javascript.json.ts", templateFunction: require("./_eslintrc_javascript.json") }, - { name: "_eslintrc_typescript.js.ts", templateFunction: require("./_eslintrc_typescript.js") }, - { name: "_github/ISSUE_TEMPLATE/bug_report.md.ts", templateFunction: require("./_github/ISSUE_TEMPLATE/bug_report.md") }, - { name: "_github/auto-merge.yml.ts", templateFunction: require("./_github/auto-merge.yml") }, - { name: "_github/dependabot.yml.ts", templateFunction: require("./_github/dependabot.yml") }, - { name: "_github/workflows/dependabot-auto-merge.yml.ts", templateFunction: require("./_github/workflows/dependabot-auto-merge.yml") }, - { name: "_github/workflows/test-and-release.yml.ts", templateFunction: require("./_github/workflows/test-and-release.yml") }, - { name: "_gitignore.ts", templateFunction: require("./_gitignore") }, - { name: "_npmignore.ts", templateFunction: require("./_npmignore") }, - { name: "_prettierignore.ts", templateFunction: require("./_prettierignore") }, - { name: "_prettierrc.js.ts", templateFunction: require("./_prettierrc.js") }, - { name: "_travis.yml.ts", templateFunction: require("./_travis.yml") }, - { name: "_vscode/extensions.json.ts", templateFunction: require("./_vscode/extensions.json") }, - { name: "_vscode/settings.json.ts", templateFunction: require("./_vscode/settings.json") }, { name: "admin/admin.d.ts.ts", templateFunction: require("./admin/admin.d.ts") }, { name: "admin/custom_m.html.ts", templateFunction: require("./admin/custom_m.html") }, { name: "admin/icon.png.ts", templateFunction: require("./admin/icon.png") }, @@ -47,10 +20,12 @@ const templates: { name: string, templateFunction: TemplateFunction }[] = [ { name: "io-package.json.ts", templateFunction: require("./io-package.json") }, { name: "lib/adapter-config.d.ts.ts", templateFunction: require("./lib/adapter-config.d.ts") }, { name: "lib/tools.js.ts", templateFunction: require("./lib/tools.js") }, + { name: "LICENSE.ts", templateFunction: require("./LICENSE") }, { name: "main.es6.js.ts", templateFunction: require("./main.es6.js") }, { name: "main.js.ts", templateFunction: require("./main.js") }, { name: "main.test.js.ts", templateFunction: require("./main.test.js") }, { name: "package.json.ts", templateFunction: require("./package.json") }, + { name: "README.md.ts", templateFunction: require("./README.md") }, { name: "src/lib/tools.ts.ts", templateFunction: require("./src/lib/tools.ts") }, { name: "src/main.es6.ts", templateFunction: require("./src/main.es6") }, { name: "src/main.test.ts.ts", templateFunction: require("./src/main.test.ts") }, @@ -66,5 +41,28 @@ const templates: { name: string, templateFunction: TemplateFunction }[] = [ { name: "widgets/style.css.ts", templateFunction: require("./widgets/style.css") }, { name: "widgets/template.html.ts", templateFunction: require("./widgets/template.html") }, { name: "widgets/template.js.ts", templateFunction: require("./widgets/template.js") }, + { name: "_babelrc.ts", templateFunction: require("./_babelrc") }, + { name: "_create-adapter.json.ts", templateFunction: require("./_create-adapter.json") }, + { name: "_devcontainer/devcontainer.json.ts", templateFunction: require("./_devcontainer/devcontainer.json") }, + { name: "_devcontainer/docker-compose.yml.ts", templateFunction: require("./_devcontainer/docker-compose.yml") }, + { name: "_devcontainer/iobroker/_Dockerfile.ts", templateFunction: require("./_devcontainer/iobroker/_Dockerfile") }, + { name: "_devcontainer/nginx/nginx.conf.ts", templateFunction: require("./_devcontainer/nginx/nginx.conf") }, + { name: "_devcontainer/parcel/run.sh.ts", templateFunction: require("./_devcontainer/parcel/run.sh") }, + { name: "_devcontainer/parcel/_Dockerfile.ts", templateFunction: require("./_devcontainer/parcel/_Dockerfile") }, + { name: "_devcontainer/README.md.ts", templateFunction: require("./_devcontainer/README.md") }, + { name: "_eslintrc_javascript.json.ts", templateFunction: require("./_eslintrc_javascript.json") }, + { name: "_eslintrc_typescript.js.ts", templateFunction: require("./_eslintrc_typescript.js") }, + { name: "_github/auto-merge.yml.ts", templateFunction: require("./_github/auto-merge.yml") }, + { name: "_github/dependabot.yml.ts", templateFunction: require("./_github/dependabot.yml") }, + { name: "_github/ISSUE_TEMPLATE/bug_report.md.ts", templateFunction: require("./_github/ISSUE_TEMPLATE/bug_report.md") }, + { name: "_github/workflows/dependabot-auto-merge.yml.ts", templateFunction: require("./_github/workflows/dependabot-auto-merge.yml") }, + { name: "_github/workflows/test-and-release.yml.ts", templateFunction: require("./_github/workflows/test-and-release.yml") }, + { name: "_gitignore.ts", templateFunction: require("./_gitignore") }, + { name: "_npmignore.ts", templateFunction: require("./_npmignore") }, + { name: "_prettierignore.ts", templateFunction: require("./_prettierignore") }, + { name: "_prettierrc.js.ts", templateFunction: require("./_prettierrc.js") }, + { name: "_travis.yml.ts", templateFunction: require("./_travis.yml") }, + { name: "_vscode/extensions.json.ts", templateFunction: require("./_vscode/extensions.json") }, + { name: "_vscode/settings.json.ts", templateFunction: require("./_vscode/settings.json") }, ]; export = templates; diff --git a/test/baselines/devcontainer/.devcontainer/parcel/Dockerfile b/test/baselines/devcontainer/.devcontainer/parcel/Dockerfile index 6df14671..cd3bc5c0 100644 --- a/test/baselines/devcontainer/.devcontainer/parcel/Dockerfile +++ b/test/baselines/devcontainer/.devcontainer/parcel/Dockerfile @@ -1,9 +1,6 @@ FROM node:12 -RUN apt-get update && apt-get install -y rsync - RUN mkdir -p /usr/app -RUN mkdir -p /usr/workspace COPY *.sh /usr/app/ diff --git a/test/baselines/devcontainer/.devcontainer/parcel/run-sync.sh b/test/baselines/devcontainer/.devcontainer/parcel/run-sync.sh deleted file mode 100644 index fce4e8f6..00000000 --- a/test/baselines/devcontainer/.devcontainer/parcel/run-sync.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -while : -do - /usr/app/sync.sh - sleep 1 -done \ No newline at end of file diff --git a/test/baselines/devcontainer/.devcontainer/parcel/run.sh b/test/baselines/devcontainer/.devcontainer/parcel/run.sh index 398a1431..eec1a86e 100644 --- a/test/baselines/devcontainer/.devcontainer/parcel/run.sh +++ b/test/baselines/devcontainer/.devcontainer/parcel/run.sh @@ -1,13 +1,7 @@ #!/bin/bash -echo "Starting initial sync..." -/usr/app/sync.sh - -cd /usr/workspace +cd /workspace echo "Installing all dependencies..." npm install -# run the following two commands in parallel (honoring Ctrl-C) -# - npm run watch:parcel -# - /usr/app/run-sync.sh -(echo "npm run watch:parcel"; echo "/usr/app/run-sync.sh") | xargs -I{} -n 1 -P 2 /bin/bash -c "{}" \ No newline at end of file +npm run watch:parcel \ No newline at end of file diff --git a/test/baselines/devcontainer/.devcontainer/parcel/sync.sh b/test/baselines/devcontainer/.devcontainer/parcel/sync.sh deleted file mode 100644 index e6bb188b..00000000 --- a/test/baselines/devcontainer/.devcontainer/parcel/sync.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -rsync -aiz --inplace --exclude={'node_modules','.git','.cache','admin/build'} /workspace/ /usr/workspace \ No newline at end of file