From 7d1731d86aeb686212d9347b0b39564a5e2933a8 Mon Sep 17 00:00:00 2001 From: "Zachary J. Fields" Date: Tue, 22 Oct 2019 16:20:24 -0500 Subject: [PATCH 1/3] Update `firmware-buildpack-builder` dependency --- docs/upd-build-env.md | 47 +++++++++++++++++++++++++++++++++++++++++ scripts/fetch-buildpack | 3 +-- 2 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 docs/upd-build-env.md diff --git a/docs/upd-build-env.md b/docs/upd-build-env.md new file mode 100644 index 0000000000..79ef827eb0 --- /dev/null +++ b/docs/upd-build-env.md @@ -0,0 +1,47 @@ +Updating Build Environment +========================== + +Generating the build system environment requires several moving parts. There are multiple repositories that are linked together in order to create a buildpack system. + +Repositories +------------ + +There are four main repositories involved in generating the environment. + +- [`buildpack-hal`](https://github.com/particle-iot/buildpack-hal/): Contains the `Dockerfile` that specifies the contents of the environment, which is consumed by CI, CD, WebIDE and the Workbench. +- [`device-os`](https://github.com/particle-iot/device-os/): Contains the `.workbench/manifest.json` file, which specifies the necessary components. +- [`firmware-buildpack-builder`](https://github.com/particle-iot/firmware-buildpack-builder/): Contains the Dockerfile fragments, which are used during CI to validate builds and create the images consumed by the WebIDE compiler. +- [`workbench`](https://github.com/particle-iot/workbench/): Contains the dependency installer script that consumes the manifest file from the `device-os` repository. + +Relationship Mapping +-------------------- + +Examples +-------- + +### Upgrading the `gcc-arm` compiler + +#### Create the dependency bundle + +1. Download the dependency for your platform +1. [Create a bundle](https://github.com/particle-iot/workbench#development) +1. Generate a SHA-256 hash for the bundle +1. Upload the bundle to Amazon S3 + +#### Update `device-os` + +1. Update `/.workbench/manifest.json` to reflect the new dependency +1. Update the `BUILDPACK_FILES` variable to target new `branch` or `tag` in `/scripts/fetch-buildpack` +1. Create a PR against `particle-iot/device-os` + +#### Update `buildpack-hal` + +1. Update the `GITHUB_BRANCH` in the `build-and-push` script, to identify which `device-os` branch will provide the updated version of the manifest file +1. Update the `COPY` command in the `Dockerfile` to copy the new dependency from the `worker` stage to the `buildpack-hal` stage +1. Tag the commit with a version to be used. (i.e. `0.1.0`) +1. Create a PR against `particle-iot/buildpack-hal` + +#### Update `firmware-buildpack-builder` + +1. Update `BUILDPACK_VERSION` in `/scripts/constants` to reflect the name of the tag provided to `buildpack-hal` +1. Create a PR against `firmware-buildpack-builder` diff --git a/scripts/fetch-buildpack b/scripts/fetch-buildpack index fb1cad5437..2e0758a5ca 100755 --- a/scripts/fetch-buildpack +++ b/scripts/fetch-buildpack @@ -1,5 +1,4 @@ -BUILDPACK_FILES=$(mkdir buildpack && wget https://api.github.com/repos/particle-iot/firmware-buildpack-builder/tarball/0.0.8 -O - | tar -xvz -C buildpack --strip-components 1) +BUILDPACK_FILES=$(mkdir buildpack && wget https://api.github.com/repos/particle-iot/firmware-buildpack-builder/tarball/ch39834/workbench-installer -O - | tar -xvz -C buildpack --strip-components 1) SHORT_REF=$(echo "$BUILDPACK_FILES" | head -n1 | cut -d '/' -f 1 | rev | cut -d '-' -f 1 | rev) mkdir buildpack/.git echo "${SHORT_REF}" > buildpack/.git/short_ref - From 9459bb1037fe89263caa4aaf7fdb0c8f1e627248 Mon Sep 17 00:00:00 2001 From: "Zachary J. Fields" Date: Mon, 18 Nov 2019 09:48:20 -0600 Subject: [PATCH 2/3] Capture git tag requirement as variable --- scripts/fetch-buildpack | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/fetch-buildpack b/scripts/fetch-buildpack index 2e0758a5ca..5284fb5701 100755 --- a/scripts/fetch-buildpack +++ b/scripts/fetch-buildpack @@ -1,4 +1,5 @@ -BUILDPACK_FILES=$(mkdir buildpack && wget https://api.github.com/repos/particle-iot/firmware-buildpack-builder/tarball/ch39834/workbench-installer -O - | tar -xvz -C buildpack --strip-components 1) +BUILDPACK_BUILDER_VERSION_TAG="0.0.9" +BUILDPACK_FILES=$(mkdir buildpack && wget https://api.github.com/repos/particle-iot/firmware-buildpack-builder/tarball/${BUILDPACK_BUILDER_VERSION_TAG} -O - | tar -xvz -C buildpack --strip-components 1) SHORT_REF=$(echo "$BUILDPACK_FILES" | head -n1 | cut -d '/' -f 1 | rev | cut -d '-' -f 1 | rev) mkdir buildpack/.git echo "${SHORT_REF}" > buildpack/.git/short_ref From 52af5f0c293be6b61ba743a57164de4119c9c567 Mon Sep 17 00:00:00 2001 From: "Zachary J. Fields" Date: Mon, 18 Nov 2019 10:37:01 -0600 Subject: [PATCH 3/3] Update buildpack documentation --- docs/img/buildpack-dependency-chart.png | Bin 0 -> 65912 bytes docs/upd-build-env.md | 42 ++++++++++++++---------- 2 files changed, 24 insertions(+), 18 deletions(-) create mode 100644 docs/img/buildpack-dependency-chart.png diff --git a/docs/img/buildpack-dependency-chart.png b/docs/img/buildpack-dependency-chart.png new file mode 100644 index 0000000000000000000000000000000000000000..a647c1d55d9a2431949e47547a0b7b6711571afc GIT binary patch literal 65912 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≪ovOt+px?CXib4^lYv+qib*d0%YBh)i#e9DSqBC% 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 literal 0 HcmV?d00001 diff --git a/docs/upd-build-env.md b/docs/upd-build-env.md index 79ef827eb0..479dbbcd5d 100644 --- a/docs/upd-build-env.md +++ b/docs/upd-build-env.md @@ -11,37 +11,43 @@ There are four main repositories involved in generating the environment. - [`buildpack-hal`](https://github.com/particle-iot/buildpack-hal/): Contains the `Dockerfile` that specifies the contents of the environment, which is consumed by CI, CD, WebIDE and the Workbench. - [`device-os`](https://github.com/particle-iot/device-os/): Contains the `.workbench/manifest.json` file, which specifies the necessary components. - [`firmware-buildpack-builder`](https://github.com/particle-iot/firmware-buildpack-builder/): Contains the Dockerfile fragments, which are used during CI to validate builds and create the images consumed by the WebIDE compiler. -- [`workbench`](https://github.com/particle-iot/workbench/): Contains the dependency installer script that consumes the manifest file from the `device-os` repository. +- [`workbench`](https://github.com/particle-iot/workbench/)*: Contains the dependency installer script that consumes the manifest file from the `device-os` repository. Relationship Mapping -------------------- +!["Buildpack Dependency Chart"](./img/buildpack-dependency-chart.png "Circular Dependency") + Examples -------- ### Upgrading the `gcc-arm` compiler -#### Create the dependency bundle +1. Create the dependency bundle + + 1. Download the dependency for your platform + 1. [Create a bundle](https://github.com/particle-iot/workbench#development) + 1. Generate a SHA-256 hash for the bundle + 1. Upload the bundle to Amazon S3 + +1. Update `device-os` -1. Download the dependency for your platform -1. [Create a bundle](https://github.com/particle-iot/workbench#development) -1. Generate a SHA-256 hash for the bundle -1. Upload the bundle to Amazon S3 + 1. Update `/.workbench/manifest.json` to reflect the new dependency + 1. Update the `BUILDPACK_BUILDER_VERSION_TAG` variable to tell Travis CI to use the new `branch` or `tag` from `/scripts/fetch-buildpack` + 1. Push a new branch to the `particle-iot/device-os` repository -#### Update `device-os` + > _**NOTE:** Travis CI will fail, because the new `branch` or `tag` in `firmware_buildpack_builder` can't exist due to the circular dependency (depicted above)._ -1. Update `/.workbench/manifest.json` to reflect the new dependency -1. Update the `BUILDPACK_FILES` variable to target new `branch` or `tag` in `/scripts/fetch-buildpack` -1. Create a PR against `particle-iot/device-os` +1. Update `buildpack-hal` -#### Update `buildpack-hal` + 1. Update the `GITHUB_BRANCH` variable in the `build-and-push` script, to identify which `device-os` branch will provide the updated version of the manifest file + 1. Update the `COPY` command in the `Dockerfile` to copy the new dependency from the `worker` stage to the `buildpack-hal` stage + 1. Tag the commit with a version to be used. (i.e. `0.1.0`) + 1. Push a new branch to the `particle-iot/buildpack-hal` repository -1. Update the `GITHUB_BRANCH` in the `build-and-push` script, to identify which `device-os` branch will provide the updated version of the manifest file -1. Update the `COPY` command in the `Dockerfile` to copy the new dependency from the `worker` stage to the `buildpack-hal` stage -1. Tag the commit with a version to be used. (i.e. `0.1.0`) -1. Create a PR against `particle-iot/buildpack-hal` +1. Update `firmware-buildpack-builder` -#### Update `firmware-buildpack-builder` + 1. Update `BUILDPACK_VERSION` in `/scripts/constants` to reflect the name of the tag provided to `buildpack-hal`, which was used to tag the resulting Docker image + 1. Push a new branch to the `firmware-buildpack-builder` repository -1. Update `BUILDPACK_VERSION` in `/scripts/constants` to reflect the name of the tag provided to `buildpack-hal` -1. Create a PR against `firmware-buildpack-builder` +1. Restart the original `device-os` Travis CI job _(above)_ \ No newline at end of file