From de127a21ba1b1780b99205ed83c66f984a93e399 Mon Sep 17 00:00:00 2001 From: Raphael Wegmueller Date: Thu, 2 Dec 2021 14:20:51 +0100 Subject: [PATCH] chore: refresh docs (#235) --- CONTRIBUTING.md | 181 ++--------------------------------------------- README.md | 26 +++---- architecture.md | 182 ------------------------------------------------ dummy.png | Bin 7736 -> 0 bytes index.html | 2 +- 5 files changed, 16 insertions(+), 375 deletions(-) delete mode 100644 architecture.md delete mode 100644 dummy.png diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index aba2c0e..2725a29 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,188 +4,19 @@ Thank you for your interest in contributing to Project Helix. As an Open Develop ## Where to contribute in Project Helix -A lot of the code of Project Helix and many of the most exciting areas for contributions are already Open Source, so some of the more interesting areas for contributions are: - -1. [HTL Engine](https://github.com/adobe/htlengine) -2. [HelpX on Helix](https://github.com/adobe/helix-helpx) -3. [Petridish](https://github.com/adobe/petridish) -4. [OpenWhisk Loggly Wrapper](https://github.com/adobe/openwhisk-loggly-wrapper) -5. [HTL/Sightly Plugin for Parcel](https://github.com/adobe/parcel-plugin-htl) -6. [Hypermedia Pipeline](https://github.com/adobe/hypermedia-pipeline) -7. [Helix CLI](https://github.com/adobe/helix-cli) -8. [git-server](https://github.com/adobe/git-server) -9. [Parcel Plugin JST](https://github.com/adobe/parcel-plugin-jst) - -There is also a [list of all Project Helix-related repositories on GitHub](https://github.com/search?q=topic%3Ahelix+org%3Aadobe&type=Repositories). - -The Project Helix repository contains the few parts that remain closed source, including - -1. `/prototypes/custom-dockerimage`: a custom docker image for Adobe I/O Runtime -2. `fastly`: the default Fastly configuration -3. `logging`: a log processing pipeline that gets request logs from Fastly and pushes them to Azure CosmosDB +Here's a [list of all Helix-related repositories on GitHub](https://github.com/search?q=topic%3Ahelix+org%3Aadobe&type=Repositories). ## How to contribute to Project Helix -For each of the Open Source projects, refer to the project's `CONTRIBUTING.md`. For Project Helix: +For each of the Open Source projects, refer to the project's `CONTRIBUTING.md`, then: 1. Create a GitHub issue for stuff that you want to work on, even if it's just an idea -2. Open Pull Requests for code changes -3. Make sure your code is tested and covered by CircleCI +2. Make sure your code coverage is 100 +3. Open Pull Requests for code changes -A good start point is to check the issue tagged with ["good first issue"](https://github.com/search?q=is:open+repo:%22adobe/project-helix%22+repo:%22adobe/htlengine%22+repo:%22adobe/helix-cli%22+repo:%22adobe/git-server%22+repo:%22adobe/petridish%22+repo:%22adobe/parcel-plugin-htl%22+repo:%22adobe/helix-helpx%22+repo:%22adobe/parcel-plugin-jst%22+repo:%22adobe/openwhisk-loggly-wrapper%22+repo:%22adobe/helix-dockerimage%22+repo:%22adobe/parcel-plugin-jst%22+repo:%22adobe/hypermedia-pipeline%22+label%3A%22good+first+issue%22&type=Issues). +A good start point is to check the issue tagged with ["good first issue"](https://github.com/search?q=helix+org%3Aadobe+label%3A%22good+first+issue%22). ## How to communicate with Project Helix 1. Join us in the [`#helix-chat`](https://adobe.slack.com/messages/C9KD0TT6G/) Slack channel (Enterprise Grid) -2. Come to the next [Project Helix Hackathon](/hackathons) - -## Development - Check out all modules - -### Related Repositories - -This umbrella project contains a [gitslave](http://gitslave.sourceforge.net) config that can be used to check out all relevant modules that are hosted as individual repositories: - -**Code** -- https://github.com/adobe/helix-cli -- https://github.com/adobe/helix-simulator -- https://github.com/adobe/helix-shared -- https://github.com/adobe/hypermedia-pipeline -- https://github.com/adobe/git-server -- https://github.com/adobe/parcel-plugin-htl -- https://github.com/adobe/parcel-plugin-jst -- https://github.com/adobe/openwhisk-loggly-wrapper -- https://github.com/adobe/helix-dockerimage -- https://github.com/adobe/htlengine - -**Projects** -- https://github.com/adobe/helix-helpx -- https://github.com/adobe/project-helix.io - -**Related** -- https://github.com/tripodsan/probot-serverless-openwhisk -- https://github.com/tripodsan/probot-openwhisk-docker - -### Setup - -This requires [gitslave](http://gitslave.sourceforge.net). - -#### Mac - - $ brew install gitslave - -### Working with gitslave - -When checking out for the first time, do this: - - $ git clone git@github.com:adobe/project-helix.git - $ cd project-helix - $ gits populate - -To update later, do this (inside the `project-helix` dir): - - $ git pull && gits pull - - -If the `.gitslave` config has changed, just re-populate and pull again: - - $ gits populate && gits pull - -## Debugging Tips - -Some random debugging tips for Helix developers - -### Debug Header for Fastly - -When making requests to a site in production, you can add the `X-Debug` HTTP header to your request to get more information in the response headers. - -### Using `npm link` for Modules - -When developing locally it might be neccessary to make changes to a downstream dependency. `npm link` allows you to let a local checkout of an NPM project satisfy a dependency in your `package.json`. - -Let's say you want to work on `parcel-plugin-htl`, but you need access to `htlengine` code: - -```bash -# check out htlengine -$ git checkout `https://github.com/adobe/htlengine.git` -$ cd htlengine -$ npm install -# make this version of htlenine available to all npm projects -$ npm link -# we're done here, let's go back to parcel-plugin-htl -$ cd ../parcel-plugin-htl -# tell npm to use the htlengine from above instead of downloading a package from npmjs -$ npm link @adobe/htlengine -``` - -# Releasing - -## NPM Packages - -Package version follow [semantic versioning](https://github.com/npm/node-semver). But since most of -our packages still are on 0.x, it is rather good practice to use minor / patch versions accordingly. - -Our CI automatically creates a new [pre-release](https://semver.org/#spec-item-9) versions for every -merged pull request. The _pre-release_ versions have the form `x.y.z-pre.c` (where `c` is a counter). -The subsequent release version `(x.y.z)` will take [precedence](https://semver.org/#spec-item-11) -over the _pre-release_ version. - -the _pre-release_ versions are attributed with the [dist-tag](https://docs.npmjs.com/cli/dist-tag) `@next`. - -### How to cut a release - -Based on the changes that follow up a release, we used [semantic versioning](https://github.com/npm/node-semver) -to define the next release type: `major`, `minor` or `patch`: - -> **Note:** The packages have a `postversion` script that will push the updated package.json along -> with the git-tag. so no need to do this manually - -Creating a _patch_ release: - -```bash -$ npm version patch -$ npm publish --tag latest --access public -``` - -Creating a _minor_ release: - -```bash -$ npm version minor -$ npm publish --tag latest --access public -``` - -Creating a _major_ release: - -```bash -$ npm version major -$ npm publish --tag latest --access public -``` - -### Adding release notes - -It is good practice to write some release notes on git for the respective release. -For example: https://github.com/adobe/helix-cli/releases/tag/v0.3.1 - -In the future, the release notes can be generated automatically from the information from git issues -and commits. - -# Other Questions - -## What do all the bots do in my code? - -Most of the bots are benign and won't harm you as long as you don't make any sudden moves. The bots you will find in Project Helix repositories are: - -- Semantic Release bot: triggered when a release is being made and leaves a comment on all issues and pull requests affected by the release -- Semantic Release Comment bot: triggered by commits on pull requests. Leaves a comment telling you what kind of release merging the pull request will cause. -- Commitlint: triggered by commits on pull requests. Tells you when commit messages don't conform to the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) format -- Renovatebot: triggered by NPM releases of modules we depend on. Creates pull requests that update dependencies. Renovatebot is allowed to merge some pull requests it's creating automatically. -- Renovate auto-approver: triggered by pull requests made by Renovatebot. Automatically approves these pull requests in repositories that require approvals for pull requests -- CircleCI: triggered by commits, runs the continuous integration and deployment pipelines -- Codecov: triggered by successful test runs, tells you if code coverage went down -- LGTM: triggered by all commits, performs a deep analysis of your code and finds issues that eslint can't see -- Dependabot: triggered by security vulnerabilities in our dependencies, creates pull requests that updates these dependencies to a version that has a fix. There is some overlap with Renovatebot, but Dependabot works for some transitive dependencies that Renovate can't do anything about -- Org Project bot: triggered by all issue updates, adds issues to a large org-wide GitHub board. - - - - - +2. Come to the next [Project Helix Hackathon](/hackathons/README.md) diff --git a/README.md b/README.md index 08883c8..8d561a8 100644 --- a/README.md +++ b/README.md @@ -4,40 +4,32 @@ --- -## TL;DR? +## Welcome to Project Helix! -* [Start Developing Your First Helix Project](https://main--helix-website--adobe.hlx.live/tutorial) +* Visit our [official website](https://www.hlx.live/) ## Background Read all of this. -* [How we work, who we are, what we use, what we build](manifesto.md) -* [Technology Architecture Vision](architecture.md) -* [Architecture Deep Dive](docs/architecture.md) +* [How we work, who we are, what we use, what we build](https://www.hlx.live/docs/manifesto) +* [Architecture Deep Dive](https://www.hlx.live/docs/architecture) * [How to contribute](CONTRIBUTING.md) ## Developing Helix -* *New:* [All Helix Repositories](https://github.com/search?q=topic%3Ahelix+org%3Aadobe&type=Repositories) -* *New:* [Helix Project Board](https://github.com/orgs/adobe/projects/2) +* [All Helix Repositories](https://github.com/search?q=topic%3Ahelix+org%3Aadobe&type=Repositories) +* [Helix Project Board](https://github.com/orgs/adobe/projects/2) (restricted access) * Javacript code style should follow the [Airbnb JavaScript Style Guide()](https://github.com/airbnb/javascript) -## Video Walkthoughs - -To catch a glimpse of Helix, check out these video walkthoughs: - -* [Sept 15th 2018: Re-Cap of the second Helix Hackathon in Basel](https://vimeo.com/290650915/6a68ba7af8) -* [August 14th 2018: Things that changed over the summer](https://vimeo.com/285070570) (password: `helixsummer`) -* [June 8th 2018: Re-Cap of the first Helix Hackathon in Salt Lake City](https://vimeo.com/274350388/afe38b8c33) -* [May 28th 2018: @trieloff describes the Primordial Soup Prototype](https://my.adobeconnect.com/pe0gjswvlm7n/) - ## Hackathons - There's always a next [hackathon](hackathons/README.md). Check the list and sign up! +There's always a next [hackathon](hackathons/README.md). Check the list and sign up! ## Communication +Anything relevant should be persisted in a GitHub issue (and a pull request) in the respective repository, or a [GitHub discussion](https://github.com/adobe/helix-home/discussions). + We hang out in the [`#helix-chat`](https://adobe.slack.com/messages/C9KD0TT6G/) Slack channel (Enterprise Grid). There is also the distribution list `grp-project-helix-friends` (Enterprise Grid) where we send around invites for our bi-weekly Helix Show & Tells. diff --git a/architecture.md b/architecture.md deleted file mode 100644 index 37bc47f..0000000 --- a/architecture.md +++ /dev/null @@ -1,182 +0,0 @@ -# Overall thoughts - -Generally a digital content management architecture consist of an "authoring experience" and a "content delivery experience". - -The authoring experience is used by the content managers, contributors, communicators to produce the digital experience for the consumer. - -Underlying both there is a content repository that persists and manages the content in a serialized form implementing access control, versioning, search etc. - -# Content Delivery Architecture - -Historically in content management there are two flavors of the delivery architecture, (a) is called a "baking" architecture and (b) is called a "frying" architecture. - -A baking architecture statically produces HTML (or other formats) and deploys it into a webserver (or other delivery mechanism), while a "frying" architecture dynamically responds to the incoming HTTP request and assembles the (HTML or other) response on the fly. - -It is generally accepted that the "frying" architecture is more flexible and scalable, but initally a little bit more daunting, so the goal is to get to a frying architecture. - -The initial block diagram looks as follows. - -``` - ^ +-----------------------------+ - | | | - | | Browser, Client, Device | - | | | - | +--------------+--------------+ -Delivery | -Layer | - | +--------------v--------------+ - | | | - | | CDN | - | | Cache | - | | | - v +--------------+--------------+ - | - | - +--------------v--------------+ - | | -Rendering | Serverless | -Layer           |       Template Engine | - | | - +--------------+--------------+ - | - | - +--------------v--------------+ - | | -Repository | API Abstraction | -Layer           |     Git[Hub], Markdown | - | | - +-----------------------------+ -``` - - - -# Authoring Architecture - -The authoring experience needs to start with very simple and efficient mobile interface, possibly support web for desktop. - -Some form of intermittently disconnected experiences need to be supported along the lines of google doc style collaboration. - -The general block diagram would look like this. - -``` - +-----------------------------+ - | | -Authoring App     | Native (+web) | - | Spark | - | | - +--------------+--------------+ - | - | - +--------------v--------------+ - | | -Authoring | Serverless | -Service         |       Authoring Service | -                 | Template Engine     | - | | - +--------------+--------------+ - | - | - +--------------v--------------+ - | | -Repository | API Abstraction | -Layer           |     Git[Hub], Markdown | - | | - +-----------------------------+ -``` - - -# Extensibility - -Gradually providing extensibility on every layer is what allows for enterprise scalability from a functional standpoint. - -Whenever extensibility is needed developers play a crucial role. GitHub gives developers a simple and native way to interact with both code (templates, authoring extensions, processing, ...) and content and avoid having to design, explain and teach how interactions work. - -# Local Development - -Serverless is great for deployment and scalability, but a dog to develop and work with. - -So it is important that we get to a place where a developer can start extending in minutes, without any unreasonable cloud dependencies against their local checkout in the filesystem. - - -# Publishing? - -The concept of preparing content in one environment (branch, fork in GitHub speak) and a point in time publish (push or merge in GitHub speak) is a very typical scenario for larger bodies of work and bigger organizations. - -The number of stages (think forks) as well as the approval processes (think PR in github) vary greatly. - -In very small organizations the act of publishing is more of a hurdle than really desired, especially when it comes to quick iterations. - -# Assets - -## What is an Asset? - -For the purposes of Helix, an asset is a piece of content that is not diffable at a line by line level in a human readable way. - -Selected Asset examples: - -* Rasterized binary formats - * Jpeg - * GIF - * PNG -* Text formats - * PostScript - * SVG -* Composite formats - * PDF - * Indesign - * PSD - * Word -* Web formats - * DCX - -## Requirements for delivery via Fastly - -Fastly has specific delivery requirements for dynamic delivery of assets. These assets must have a final rendition in [jpeg, png, gif, or webbp](https://docs.fastly.com/guides/imageopto-setup-use/serving-images.html#input-and-output-formats) format to deliver dynamic content. - -For delivering experiences from Helix, the content must either be stored directly in one of these formats or it must be a format natively supported by the browser/app. Careful consideration for the format of your assets must be considered for this purpose. - -When in one of the supported Fastly formats, Fastly enables [resizing, cropping, and other transformations](https://docs.fastly.com/guides/imageopto-setup-use/serving-images.html#transformation-order) - -## Location of Asset Storage - -### Github Storage - -Github does not offer renditions of asset formats, meaning that for any assets stored in git, they must be in one of the formats described in [Requirements for delivery via Fastly](#requirements-for-delivery-via-fastly) - -Github offers two storage models: [Git LFS](https://git-lfs.github.com) and direct storage in git. - -Direct storage of assets in git is **NOT RECOMMENDED**. When assets are directly stored in git, all versions, of all assets, on all branches must be downloaded on any clone operation. With even moderately sized assets, this will quickly become untenable for content authors. - -Git LFS allows git to store assets externally, but requires some setup on all machines. -It is higly recommended to leverage LFS for all the binaries. This will keep the authoring workflows, consisting of git cloning and pushing, efficient and the entire git repo smaller. Assuming assets are stored in a subdirectory `/assets`, a `.gitattributes` file in there could enable LFS for all the binaries in it, not affecting markdown files. - -Git LFS will still place the requirement on content authors to download the version of the binaries for the branch they are working on. For this reason, it is recommended not to store full-size assets in github, only renditions with adequate quality to serve to Fastly. - -[Git LFS setup howto](https://help.github.com/articles/configuring-git-large-file-storage/) - -### DAM Storage - -DAM storage, through services such as AEM Assets is **RECOMMENDED** over git storage models, because the full-size digital asset can be ingested, stored, versioned, etc. without the limitations of git described in [Github Storage](#github-storage). - -Most DAM services provide the ability to access a rendition of the content in one of the [Fastly formats](#requirements-for-delivery-via-fastly). - -To provide responsive experiences via Fastly metadata such as crop coordinates, alt texts, etc. through sidecar files or an API must be provided in association with an asset. - -# Open Questions - -- What is the .md of something like an adobe.com website going to look like? Can we keep it still readable? - - Answer: take a look at the work-in-progress [developer.adobe.com index.md](https://github.com/adobe/developer.adobe.com/blob/master/index.md) -- How does serverless work in a request/response environment? -- How do we have to batch-up edits into commits and PRs to get to a place where it makes sense? -- Is +1m md files in a single github repo feasible? -- Do repository references work virtually tie together code and content? -- Should very small, non-extensible (think Spark Page) projects be persisted as md outside of git (probably)? -- How would Helix read the crop metadata on an asset and provide this to Fastly? What about other responsive experiences? -- We are conveying a lot of specific details how Fastly serves assets to our implementations. Is there a better way to make this generic, or translate/transcode content that fastly doesn't serve? -- What about video delivery? -- __ - - -# More Info - -Check out the [Architecture Deep Dive](docs/architecture.md) \ No newline at end of file diff --git a/dummy.png b/dummy.png deleted file mode 100644 index b4bd2c51ba3572e58789c1b6e883ad8b994c4cf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7736 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 diff --git a/index.html b/index.html index 3d28bd1..27b3572 100644 --- a/index.html +++ b/index.html @@ -1,7 +1,7 @@ Redirecting to Helix Home - +