diff --git a/.gitignore b/.gitignore index bbc187b..25f2b64 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ .env.test.local .env.production.local .idea +cspell.json npm-debug.log* yarn-debug.log* diff --git a/docs/api.md b/docs/api.md index 24d6e09..6cf869a 100644 --- a/docs/api.md +++ b/docs/api.md @@ -1,25 +1,26 @@ --- -sidebar_position: 8 +id: api +title: πŸ§ͺ Tramline API +sidebar_label: πŸ§ͺ Tramline API +sidebar_position: 7 --- -# πŸ§ͺ Tramline API +Tramline currently exposes 3 API endpoints to fetch release information and to send custom build metadata. Before you start, you need your API credentials to make requests. To get these click on **Organization Settings** in the top navbar: -Tramline currently exposes three API endpoints to fetch release information and to send custom build metadata to Tramline. +![](/img/organization-settings-dropdown.png) -You need your `Account ID` and `API Key` before you can make any requests. To get these click on **Settings** in the dropdown on the top-right: +Under the **Settings** tab, inside the **API** section, you will find the `Account ID` and the `API key` that will be used later for all API calls. -![](/img/org-settings.png) - -Here you will find the relevant API settings: - -![](/img/api-settings.png) +

:::info -Only a user with owner or developer privileges can access these API settings. +Only a user with owner or developer privileges can view these API settings. ::: ### Get the latest release made to the store for an app +#### Request + ```bash curl -H "Authorization: Bearer your-api-key" \ -H "X-TRAMLINE-ACCOUNT-ID: your-account-id" \ @@ -27,6 +28,8 @@ curl -H "Authorization: Bearer your-api-key" \ https://tramline.dev/api/v1/apps/ ``` +#### Response + This API would respond with a format like this: ```json @@ -60,6 +63,8 @@ jq '.latest.android.build_version' ### Get all release versions sent to the store for a given release +#### Request + You can either specify a particular branch ```bash @@ -78,6 +83,8 @@ curl -H "Authorization: Bearer your-api-key" \ https://tramline.dev/api/v1/releases/ ``` +#### Response + This API would respond with a format like this: ```json @@ -123,6 +130,8 @@ jq '.releases.android | map(.build_version)' ### Send custom metadata for a build +#### Request + You can send custom metadata to be displayed on Tramline dashboard about your build. Each metadata should have a unique identifier, and its value can be numerical or textual. The trend of all numeric metadata will be shown on Tramline dashboard. Examples of metadata: app launch time, unit test coverage etc. @@ -197,6 +206,7 @@ The `external_metadata` in the request body should adhere to the following schem ``` Sample request body: + ```json { "external_metadata": [ @@ -227,3 +237,7 @@ Sample request body: ] } ``` + +#### Response + +If the schema is valid and the request is successful, the response will be a `200 OK`. diff --git a/docs/automations.mdx b/docs/automations.mdx index 7b72f02..bb77b00 100644 --- a/docs/automations.mdx +++ b/docs/automations.mdx @@ -1,9 +1,10 @@ --- -sidebar_position: 7 +id: automations +title: πŸ€– Automations +sidebar_label: πŸ€– Automations +sidebar_position: 4 --- -# πŸ€– Automations - export const ReleaseBranch = ({name, n}) => { function date() { const today = new Date() @@ -21,82 +22,216 @@ export const ReleaseBranch = ({name, n}) => { return (r/{name}/{date()}{n ? '-1' : ''}) }; -Tramline automates away a lot of boilerplate work and opines on some sensible defaults. We will continue to add more automations and hopefully also add controls to chose which ones to run. +Tramline automates away a lot of boilerplate work and opines on some sensible defaults. We will continue to add more automations and hopefully also add controls to chose which ones to run. Currently, some sensible automations (that everyone should do) are just magically done for you, and some require enabling manually. + +If you have suggestions for common processes that Tramline can automate for you, which don't exist in this list down below, [please let us know](mailto:hello@tramline.app)! + +## Cut a release branch + +:::tip +This automation is run when a [new release is prepared](/using-tramline/release-management/new-release). +::: +:::info +Release branches are only cut for specific branching strategies. See [Branching Strategies](using-tramline/release-management/branching-strategies). +::: + +On starting a new release, we automatically cut a release branch from the configured working branch for the repo. The release branch takes the pattern of `r/name-of-release-train/date-of-release`. For example, if your release train is called **Nightly**, the release branch will be . Additional releases during the day will be . + +## Pre-release pull requests + +:::tip +This automation is run when a [new release is prepared](/using-tramline/release-management/new-release). +::: +:::info +Only works for [Parallel Working and Release Branch](/using-tramline/release-management/branching-strategies#parallel-working-and-release-branch) strategy. +::: + +```mermaid +gitGraph + branch release + commit id: "previously" + checkout main + commit id: "commit 1" + commit id: "commit 2" + checkout release + merge main tag: "Start of release 1.0.0" + checkout main + commit id: "commit 3" + commit id: "commit 4" + commit id: "commit 5" + checkout release + merge main tag: "Start of Release 1.1.0" + checkout main + commit id: "commit 6" +``` -This is a list of important things Tramline currently automatically does with little to no user intervention. +The working branch (eg. `main`) is merged into the static release branch (eg. `release`) automatically at the the start of every release. -## Cutting a release branch +## Start release flow for new commits -On starting a new release, we automatically cut a release branch from the specified working branch for the repo. +:::tip +This automation is run when [new commits land on the release branch](/using-tramline/working-pane/stability). +::: -This is always in the form of `r/name-of-release-train/date-of-release`. +When you land fixes to your release branch for an active release, the Tramline release flow automatically kicks off again. If you have Internal Releases enabled, on the arrival of every new commit, a new internal release process will start. If you only have Release Candidates enabled, only the release candidate process will automatically start. When any of this happens, the previous internal or RC builds are marked as stale, so that you can start working on the fresh builds. -For example, if your release train is called **Nightly**, the release branch will be . Additional releases during the day will be . +## Trigger workflows -The release will listen to commits on this branch after it has been created. +:::tip +This automation is run when [new commits land on the release branch](/using-tramline/working-pane/stability). +::: -## Cutting a release tag at the end of a release +When an internal or release candidate process starts, the associated workflow is automatically triggered. The subsequent updates to that workflow are also tracked and updated in the dashboard. -Once the release is finalized, we automatically tag the last commit that was released with the version generated by the release train. If the released version is `1.0.0`. The tag will be `v1.0.0`. +## Trigger distributions -If you're using the GitHub integration for source control, we will also create a [GitHub release](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository) with an auto-generated changelog. +:::info +Enable this in your [submission settings](/using-tramline/release-management/release-settings#submission-settings). +::: -## Creating and merging pull requests +When a workflow finishes and a build is found, Tramline can optionally auto-submit the build to the configured distribution channel. -We wholly manage pull requests around release branches while starting and ending a release (depending on the branching strategy selected). +## Cancel previous workflow run -See [Branching Strategies](/branching-strategies) for more information. +When a new commit lands, and if there's already a workflow running for a previous commit, Tramline will attempt to cancel the previous workflow run. We do this to avoid wasting compute minutes. -## Managing version names and build numbers +## Apply change queue -### Build number +:::info +Enable build queues in your [release train settings](/using-tramline/release-management/release-settings#advanced-settings). +::: -Every app that is added to Tramline maintains an atomic counter for the build number. Regardless of what trains are running for the app, every workflow run will internally and externally update the build number for the generated build. +Changes that land on the release branch can optionally be staged in a [Change Queue](/using-tramline/build-processing/build-queue). The change queue gets automatically drained if either the number of changes in the queue exceed the configured limit or if the configured batch-time has passed. -This ensures that every build generated by Tramline across configured workflows always have a unique value. +## Track ongoing work -### Version Name +:::tip +This automation is always available as long as the release is active. See [changeset tracking](/using-tramline/working-pane/changeset-tracking). +::: -Version names are processed in a `major.minor.patch` format, where the `patch` term is optional. +All the pull requests that directly target the release branch (eg. `r/production/2022-12-31-1`) are automatically tracked and updated in the [changeset tracking](/using-tramline/working-pane/changeset-tracking) dashboard. -βœ… Allowed versions: -``` -1.2.0 -4.2.1 -16.9 -``` +![](/img/ongoing-work.png) -❌ Invalid versions: -``` -1 -1.2.3.4 -``` +## Bumping versions and build numbers -Every new release increments the `minor` version. +### Versions -Once your release has reached a store (App Store or Play Store) production channel and has been distributed to at least some percentage of users (via staged rollout), any new commit on the release branch increments the `patch` version. When that happens, your release enters a `hotfix` mode. +Versions are automatically managed by Tramline. New releases start with a minor or major version bump (in SemVer terminology). When fixes land in the middle of a production rollout, the patch version always gets auto-bumped for the new changes. -### Hotfix +Similarly, when starting new hotfix releases, the patch version always get auto-bumped. -A release in `hotfix` mode simply means that you are pushing changes on the build that has reached some of your user-base and has a bug that warrants immediate fix rather than a new release altogether. +### Build numbers -### New release +Every build created generated through Tramline always has a unique build number. This is true across workflows, and across trains. Tramline maintains an atomic counter internally and automatically updates the build number through the [workflow triggering](/using-tramline/working-pane/stability) mechanism. -``` -1.0.0 --> 1.1.0 -``` +## Merging fixes back -### New commits after production distribution has begun +:::tip +This is applicable for all [branching strategies](/using-tramline/release-management/branching-strategies). +::: +:::tip +Tramline will always automatically try to merge (not just create) all PRs that are created by Tramline, whenever possible (depending on required checks etc.). +::: -``` -1.1.0 --> 1.1.1 -``` -## Triggering step workflows on commits -When you start a release or when you land commits on a release branch; we automatically run the steps and their workflows and send the builds generated from the workflows to the correct build channels. +Tramline can automatically backmerge changes from the release branch to your working branch and any upcoming release branches. There are two backmerge strategy options available. + +### Continuously as changes land + +Any PRs or commits merged into the release branch will be "backmerged" into the working branch. As new changes land, this process repeats so that the working branch is always up to date with the release branch. This is helpful for teams that do a number of fixes directly on the release branch so that the code is merged back to the "trunk" as _quickly_ as possible. + +:::info +Depending on the [VCS integration](/integrations/version-control), the way cherry-picks happen have will slight variations. +::: + +These running PRs created by Tramline are sometimes referred to as _Patch PRs_. These PRs get also get assigned to the original authors of the relevant change/commit. + +### End of release + +:::info +A backmerge branch will only be created if commits are found on the release branch that are not on the working branch. +::: + +At the end of the release cycle, Tramline will create a backmerge branch and open a pull request to merge the release branch back into the working branch and also to any upcoming release branch. + +## Notifications + +:::info +Enable [Notifications](/using-tramline/quality-and-monitoring/notifications) in your [release train settings](/using-tramline/release-management/release-settings). +::: + +### Attach builds + +Along with all the available notifications, the "build available" notification specifically attaches the Internal or Release Candidate build as a part of the Slack notification. This is helpful for QAs or other folks in the configured Slack channel to quickly download the build for testing. + +### Tester notes + +When a new build is available to download from Tramline, in addition to the build itself, Tramline also sends the list of changes that were made for the build (since the last build) in the Slack notification. This tells anyone who is downloading the build what changes were made in it. The same information is also available in the Tramline dashboard. + +## Create VCS tags + +:::info +Enable tagging in your [release train settings](/using-tramline/release-management/release-settings). +::: + +Tramline cuts git tags on your version control in a couple of different scenarios: + +### End of a release + +When the release ends, we automatically tag the last commit that was released at the end. If the released version is `1.0.0`. The tag will be `v1.0.0`. + +### When a production submission finishes + +For cases where you anticipate sending more than one build to the store, we also allow tagging each submission that actually went to the store. So in a single release, if you first partially release 1.0.0 to the production track on Play Store, and then land a patch fix and release 1.0.1 to 100%, you will get two tags: `v1.0.0` and `v1.0.1` against the appropriate commits. + +## Create VCS release + +:::tip +VCS releases are created at the [end of a release](#end-of-a-release). +::: + +If you're using the [GitHub integration](/integrations/version-control/github) for version control, Tramline will automatically create a [GitHub release](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository) with an auto-generated changelog. + +## Pick the correct version for hotfixes + +When you start a [hotfix release](/using-tramline/special-cases/hotfix), Tramline will automatically pick the correct version to be hotfix'd (the last completed release). When the hotfix release starts, and if there's a diff β€” between the current hotfix changes and the last release β€” the release will jump straight into to creating a new Release Candidate build and will skip Internal builds to save time. + +## Start releases on a schedule + +:::info +Add a schedule to your release in the [release train settings](/using-tramline/release-management/release-settings). +::: + +[Scheduled releases](/using-tramline/release-management/scheduled-release) automatically start a new release on the specified date and retain the schedule for subsequent releases. You can also optionally set a scheduled release to automatically stop on failure. + +Additionally, if your release spans across a future release, the future release gets automatically adjusted. + +![](/img/scheduled-release.png) + +## Update Export Compliance Information in App Store Connect + +If enabled, Tramline will automatically sets the `usesNonExemptEncryption` to be `false` for all builds as they get upload to the App Store. + +## Upload builds to Tramline + +By default, all builds generated by your CI workflows as artifacts are automatically uploaded to Tramline. This is true for the following file types: `aab`, `apk` and `ipa`. They are subsequently also available for download from the [Tramline dashboard](/using-tramline/working-pane/stability) and [Slack notifications](/using-tramline/working-pane/stability#notifications). + +## Default release notes from last release + +Tramline will automatically apply "What's new" text or release notes from your previous release version to populate the release notes for the current release. + +Additionally, if you manually add new locales for your release notes directly on the stores, Tramline will automatically pull them up in the next release. + +## Pull Requests + +:::tip +Pull requests are created under a variety of circumstances ([see above](/automations)). +::: -This ensures that all the users and stakeholders of all the relevant build channels are kept up-to-date on new changes without requiring manually sharing builds around. This is especially handy when the app is being QA'd (internally or externally) via the review steps. +There are a few default automatic settings for all pull requests created by Tramline: - - + * If the PR is on the [GitHub VCS integration](/integrations/version-control/github), Tramline will try to set the [auto-merge](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/automatically-merging-a-pull-request) option (if possible). + * Even if auto-merge flag is not possible (eg. other VCS integrations), Tramline will continually try to auto-merge until all the checks pass. + * For [cherry-pick PRs](#continuously-cherry-pick-commits) (or "patch" PRs), Tramline will reference-tag the name of the author of the cherry-pick commit in the body of the PR. diff --git a/docs/branching-strategies.md b/docs/branching-strategies.md deleted file mode 100644 index c5ce525..0000000 --- a/docs/branching-strategies.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -sidebar_position: 5 ---- - -# 🌳 Branching Strategies - -We support 3 types of branching strategies when setting up a [release train](using-tramline/release-trains). - -:::info -Tramline creates [release branches](docs/automations.mdx#cutting-a-release-branch) and appropriate [pull requests](docs/automations.mdx#creating-and-merging-pull-requests) automatically across all branching strategies. -::: - -## Almost Trunk -Almost Trunk is the simplest strategy and the one that we generally recommend. - -For every release, we create a new release branch from the `HEAD` of the working branch. Release-specific fixes should not be committed to the release branch directly. Instead, you should land the fixes on your working branch, and then cherry-pick them on to the release branch. - -![](/img/branching-atrunk.png) - -## Release with Backmerge - -Release with Backmerge creates a new release branch from the `HEAD` of the working branch, for every release. Once the release is finalized, two things happen: - -1. The release branch is merged into the backmerge (production) branch -2. The backmerge branch is "backmerged" into the working branch - -![](/img/branching-rbm.png) - -## Parallel Working and Release Branch - -Parallel Working and Release does not create a new release branch for every release. Instead, at the start of a release, the working branch is merged into the release branch. Release-specific fixes land on the release branch directly. At the end of the release, the release branch is merged back into the working branch. - -![](/img/branching-pwr.png) diff --git a/docs/checks-and-balances.md b/docs/checks-and-balances.md new file mode 100644 index 0000000..d8914d2 --- /dev/null +++ b/docs/checks-and-balances.md @@ -0,0 +1,70 @@ +--- +id: checks-and-balances +title: πŸ’° Checks & Balances +sidebar_label: πŸ’° Checks & Balances +sidebar_position: 5 +--- + +Tramline has a variety of important checks that help ensure that minimum-to-no human errors are made during a release. This isn't just a list of [automations](/automations) that you get or you can enable, but a set of fundamental constraints enforced by the system. + +### Blocking release to stores + +#### Approvals + +:::info +The Approvals feature is currently only available to the Enterprise users. +::: + +If you use the [Approvals feature](/using-tramline/working-pane/approvals), until all the approvals are signed-off on or overridden, no one, including the release captain is allowed to submit a release to stores. + +#### Upcoming release + +If you have an upcoming release running alongside your current release, the upcoming release cannot be submitted to stores until either the current release is fully rolled-out, manually completed or stopped. + +#### Hotfix in progress + +If a hotfix release is in progress, all production submission to stores in any other release β€” current or upcoming β€” get blocked until the hotfix is fully completed. This ensures no accidental sideway releases get pushed out. + +#### Release Candidate required + +A store (production) submission can only be made with a good "Release Candidate" build. + +### Before starting a new release + +Tramline checks if you actually have new code changes to release. If the configured working branch (eg. `main`) does not have any new changes, no new releases can be made. + +### Before finishing a release + +:::tip +This is applicable for all [branching strategies](/using-tramline/release-management/branching-strategies). +::: + +Tramline checks if all your code in the release branch is merged back into the working branch. If not, Tramline disallows completing the current release. Additionally, if there are conflicts in merging, we ask you to sign-off on the fact that you're finishing the release with _potential_ conflicts. + +### Locking the release branch + +:::tip +This does not apply to the [Parallel Working and Release Branch Strategy](/using-tramline/release-management/branching-strategies#parallel-working-and-release-branch-strategy). +::: + +Once the release is completed, and if the release branch is not removed, we stop accepting any new commits to the branch. This ensures that the branch cannot be accidentally used to create a new release. + +### Workflow completion before build submission + +:::info + CI/CD workflows are run during the [stability phase](/using-tramline/working-pane/stability) of a release. +::: + +Even if the build is available from the CI workflow to download, Tramline ensures that your entire Internal or Release Candidate workflow is successful before we allow distributing it to Beta channels or stores. + +### Build locality + +Our dashboard always shows the correct build associated with the correct version and mapping tracks all the way to the notifications and + +### Internal releases to Release Candidate promotions + +If your have [Internal Releases](/using-tramline/working-pane/stability) configured, Tramline always enforce that you must create them first, distribute the builds and only then do we allow promoting the appropriate commit/SHA to a Release Candidate build. This ensures that the process of Internal β†’ RC is always followed and cannot be skipped. + +:::info +The only exception to this rule is when you're creating a [hotfix release](/using-tramline/special-cases/hotfix). +::: diff --git a/docs/getting-started/_category_.json b/docs/getting-started/_category_.json new file mode 100644 index 0000000..eb6946b --- /dev/null +++ b/docs/getting-started/_category_.json @@ -0,0 +1,12 @@ +{ + "position": 1, + "collapsed": false, + "label": "πŸš€ Getting Started", + "link": { + "type": "generated-index", + "title": "Getting Started" + }, + "customProps": { + "description": "Quick guide to getting started with Tramline" + } +} diff --git a/docs/getting-started/app.md b/docs/getting-started/app.md new file mode 100644 index 0000000..f8595c0 --- /dev/null +++ b/docs/getting-started/app.md @@ -0,0 +1,23 @@ +--- +id: app +title: Add your app +sidebar_label: Add your app +sidebar_position: 0 +--- + +To kick things off, add your first app. + +

+ +You will need the following details to create your app. + +![](/img/create-new-app.png) + +The **Bundle Identifier** is the [Application ID](https://developer.android.com/studio/build/configure-app-module#set-application-id) in Android, and the [Bundle ID](https://developer.apple.com/documentation/appstoreconnectapi/bundle_ids) in iOS. + +The **Timezone** is the timezone that you want to use for the app. This is used to show all the time-related data in Tramline and schedule releases for your app. + +The **Build Number** is just the initial version code you'd like to use to start off releases. After this, all increments are managed by Tramline. +It is equivalent to the `versionCode` in Android, and the `cfBundleVersion` in iOS. You can read more about Tramline's build number management [here](/using-tramline/version-management/build-numbers). + +Once the app is saved and validated, the next step is to add integrations and configure those integrations. diff --git a/docs/getting-started/invite-team.md b/docs/getting-started/invite-team.md new file mode 100644 index 0000000..c575410 --- /dev/null +++ b/docs/getting-started/invite-team.md @@ -0,0 +1,17 @@ +--- +id: invite-team +title: Invite your team +sidebar_label: Invite your team +sidebar_position: 5 +--- + +Invite your team members to join the Tramline workspace so they can collaborate on the releases with you. + +If you have enabled [SSO](/inviting-team#sso), any member of your organization can login via SSO to join Tramline as a viewer without an invitation. +If you have not enabled SSO, you will need to invite your team members to join the Tramline workspace. + +![](/img/invite-team.png) + +Your team members can run releases, approve or reject builds, request changes in the release, or simply follow the progress of the release, view release history, and much more. + +For more details on teams and memberships, see [Teams](/inviting-team) page. diff --git a/docs/getting-started/prepare-release.md b/docs/getting-started/prepare-release.md new file mode 100644 index 0000000..4728e34 --- /dev/null +++ b/docs/getting-started/prepare-release.md @@ -0,0 +1,109 @@ +--- +id: prepare-release +title: Prepare for release +sidebar_label: Prepare for release +sidebar_position: 3 +--- + +Once your app and integrations are set up, you can set up your release process. + +![](/img/setup-first-release.png) + +## Configure the release cycle + +1. Choose the correct branching strategy for your release train. We recommend [Almost Trunk](/using-tramline/release-management/branching-strategies#almost-trunk). +2. Select the versioning strategy that you use for you app. We support [SemVer](/using-tramline/version-management/version-strategies#semver) and [CalVer](/using-tramline/version-management/version-strategies) version schemes. +3. Depending on your [Branching Strategy](/using-tramline/release-management/branching-strategies), configure the correct set of branches that Tramline will read and write to. + +![](/img/create-new-train.png) + +### Submission settings + +Once the release train is created, review the submission settings that Tramline automatically creates for you. + +![](/img/submission-settings.png) + +1. [**Release Candidate (RC) Workflow**](/using-tramline/release-management/release-settings#release-candidate-rc-workflow): This is a mandatory configuration. This workflow selected should generate an RC build (aab/apk/ipa) that will be sent to your production and beta testing submissions. +2. [**Production Release**](/using-tramline/release-management/release-settings#production-release-settings): This is enabled by default if you have connected the store integrations. You can disable this if you don't want to release the app to public. If enabled, you can also control the staged rollout configurations for your store release. +3. [**Beta Testing**](/using-tramline/release-management/release-settings#beta-testing-configuration): If you share your RC with internal or external testers on the store before releasing to public, you can enable this. This is disabled by default. +4. [**Internal Testing**](/using-tramline/release-management/release-settings#internal-testing-configuration): In addition to beta testing, if you generate an internal build (staging/debug) that your internal testers use for testing, you can enable this. This is disabled by default. Configure how you generate this build as well as where the internal builds are send to (likely a place like Firebase App Distribution). + +:::info +There are some changes required in your workflow and app codebase to ensure that the builds generated are identified correctly by Tramline. +::: + +The pre-requisite steps required for the workflows to work well with Tramline. + +1. They must accept version name and version code as input parameters. +2. You must use the version name and code passed to the workflow in your app's build. +3. They must output a valid build that can be shipped to the configured places. +4. Lastly, your workflow must accept a `workflow_dispatch` trigger (GitHub Action only) to allow Tramline to trigger the workflow using the API. + +We have a [deploy-action](https://github.com/tramlinehq/deploy-action) tool for [GitHub Actions](/integrations/ci-cd/github) that use you can use to manage the inputs in your workflows. For [Bitrise](/integrations/ci-cd/bitrise), and [Bitbucket](/integrations/ci-cd/bitbucket), your workflow should accept the version name and code as input parameters explicitly. + +Sample changes required on GitHub Actions: +```yaml +name: Android Prod Release + +on: + workflow_dispatch: + inputs: + tramline-input: + description: "Tramline input" + required: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Configure Tramline + id: tramline + uses: tramlinehq/deploy-action@v0.1.7 + with: + input: ${{ github.event.inputs.tramline-input }} + + - name: Setup versionName regardless of how this action is triggered + id: version_name + run: | + WORKFLOW_INPUT=${{ steps.tramline.outputs.version_name }} + VERSION_NAME=${WORKFLOW_INPUT:-"1.0.0"} + echo "ORG_GRADLE_PROJECT_VERSION_NAME=$VERSION_NAME" >> $GITHUB_ENV + + - name: Setup versionCode regardless of how this action is triggered + id: version_code + run: | + WORKFLOW_INPUT=${{ steps.tramline.outputs.version_code }} + VERSION_CODE=${WORKFLOW_INPUT:-"1"} + echo "ORG_GRADLE_PROJECT_VERSION_CODE=$VERSION_CODE" >> $GITHUB_ENV + +# rest of your workflow +``` + +To ensure that your build uses the correct version name and code, update your `build.gradle` file to include the following: + +```groovy +android { + defaultConfig { + // other default config + versionCode = + if (project.properties["VERSION_CODE"] != null) { + (project.properties["VERSION_CODE"] as String).toInt() + } else { + 1 + } + + versionName = + if (project.properties["VERSION_NAME"] != null) { + project.properties["VERSION_NAME"] as String + } else { + "1.0.0" + } + } +} +``` + +For more variations of these changes, please read the [CI/CD](/integrations/ci-cd) section carefully. + +Once all the submission settings are configured, you can start the release process. + +More details on the configuration options of the release cycle and submissions can be found in the [Release Settings](/using-tramline/release-management/release-settings) section. diff --git a/docs/getting-started/setup-integrations.md b/docs/getting-started/setup-integrations.md new file mode 100644 index 0000000..06b4431 --- /dev/null +++ b/docs/getting-started/setup-integrations.md @@ -0,0 +1,18 @@ +--- +id: setup-integrations +title: Set up integrations +sidebar_label: Set up integrations +sidebar_position: 2 +--- + +You need a set of core integrations to get started with your releases in Tramline. + +1. [VCS (Version Control System)](/integrations/version-control/) +2. [Build Servers (CI/CD)](/integrations/ci-cd/) +3. [Build Distribution](/integrations/distribution/) + +![](/img/setup-integrations.png) + +The remaining integrations are optional and can be added later as per your requirements. A detailed integration guide is available [here](/integrations/). + +Once the integrations are set up and configured, you can start creating your first release. diff --git a/docs/getting-started/start-release.md b/docs/getting-started/start-release.md new file mode 100644 index 0000000..68f6440 --- /dev/null +++ b/docs/getting-started/start-release.md @@ -0,0 +1,30 @@ +--- +id: start-release +title: Start the release +sidebar_label: Start the release +sidebar_position: 4 +--- + +Once you have reviewed the submission settings, you can start a new release by using the **Prepare New Release** button in the top right corner of your home page. + +This will open a new modal that will guide you to choose the correct version for your new release. + +![](/img/prepare-new-release.png) + +The first release will use the seed version that you configured in the release settings and use that as a base to create the next version. The next version can be a minor or major version bmp as per your selection. You can also choose to provide a custom version, if you want. Tramline will auto-correct the next version for the next release based on this custom version. + +You can read more about version management in [Version Management](/using-tramline/version-management). + +## Live Release + +Once the release is started, you will move the release forward the following stages: + +1. [**Kickoff**](/using-tramline/working-pane/overview) – Overview, changeset tracking and the homepage for the Release Captain +2. [**Stability**](/using-tramline/working-pane/stability) – Internal builds, RCs, internal(QA) as well as beta testing +3. [**Preparing for production release**](/using-tramline/working-pane/metadata) – Approvals, release notes, and preparing the release for store review +4. [**Production rollout**](/using-tramline/working-pane/store-releases) – Rolling out the release to public and monitoring the health of the release +5. [**Post-release automations**](/using-tramline/working-pane/finalization) – Automatic tasks that Tramline runs like cutting tags, ensuring all release changes are merged, etc. + +![](/img/live-release.png) + +The details of these are explain in the [Release](/using-tramline/working-pane) section. diff --git a/docs/getting-support.md b/docs/getting-support.md index fea014d..f908453 100644 --- a/docs/getting-support.md +++ b/docs/getting-support.md @@ -1,23 +1,25 @@ --- +id: getting-support +title: ☎️ Getting Support +sidebar_label: ☎️ Getting Support sidebar_position: 999 --- -# ☎️ Getting Support - ## Customers -If you're a customer β€” in trial or paid β€” you can use one of the following support options: +If you're a customer β€” in trial or paid β€” you can always drop us an email at support@tramline.app. For priority support, there are two options: -- Use the support chat inside Tramline itself. Check the bottom right corner of your screen, for the blue colored button: +#### In-app chat - +Use the support chat inside Tramline itself. Check the bottom right corner of your screen, for the blue colored button. The chat bubble will show our typical response times. -- Use the priority support Slack channel that your team shares with us. If you're not part of it, ask your team owner to add you. +

-- Drop us an email at support@tramline.app. +#### Shared Slack channel -## Open Source Community +Ping on the Slack channel that your team shares with us. If you're not part of it, ask your team owner to add you. This is the fastest way to reach out to us. -- Join our [Discord server](https://go.tramline.app/discord) and talk to us on the `#general` channel. +## Open Source +- Join our [Discord server](https://go.tramline.app/discord) and talk to us on the `#general` channel. - Create a new issue in our [GitHub issue queue](https://github.com/tramlinehq/tramline/issues). diff --git a/docs/integrations/_category_.json b/docs/integrations/_category_.json deleted file mode 100644 index 1cc1e39..0000000 --- a/docs/integrations/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "position": 3, - "collapsed": true -} diff --git a/docs/integrations/ci-cd/.gitlab.md b/docs/integrations/ci-cd/.gitlab.md index 730f211..1ebd208 100644 --- a/docs/integrations/ci-cd/.gitlab.md +++ b/docs/integrations/ci-cd/.gitlab.md @@ -1,5 +1,5 @@ --- -sidebar_position: 2 +sidebar_position: 999 --- # GitLab CI/CD diff --git a/docs/integrations/ci-cd/bitbucket.md b/docs/integrations/ci-cd/bitbucket.md new file mode 100644 index 0000000..8f76241 --- /dev/null +++ b/docs/integrations/ci-cd/bitbucket.md @@ -0,0 +1,6 @@ +--- +id: bitbucket +title: Bitbucket +sidebar_label: Bitbucket +sidebar_position: 2 +--- diff --git a/docs/integrations/ci-cd/bitrise.md b/docs/integrations/ci-cd/bitrise.md index 44b58db..fb8de4a 100644 --- a/docs/integrations/ci-cd/bitrise.md +++ b/docs/integrations/ci-cd/bitrise.md @@ -1,9 +1,10 @@ --- +id: bitrise +title: Bitrise +sidebar_label: Bitrise sidebar_position: 1 --- -# Bitrise - Navigate to the integrations page for your app and select __Bitrise__ under the __Build Servers__ section on the page. ![](/img/ci-cd-integration.png) @@ -11,3 +12,55 @@ Navigate to the integrations page for your app and select __Bitrise__ under the When you click the __Connect__ button, you'll be asked for a [Personal Access Token](https://devcenter.bitrise.io/en/accounts/personal-access-tokens.html) for your Bitrise account. ![](/img/connect-bitrise.png) + +## Workflow + +Here is a sample Bitrise workflow which uses Fastlane plugin for Bitrise to upload a signed build to TestFlight. + +```yaml +format_version: "11" +project_type: flutter +workflows: + deploy: + steps: + - activate-ssh-key@4: {} + - git-clone@7: {} + - certificate-and-profile-installer@1: {} + - flutter-installer@0: {} + - cache-pull@2: {} + - manage-ios-code-signing@1: + inputs: + - distribution_method: app-store + - flutter-build@0: + inputs: + - project_location: $BITRISE_FLUTTER_PROJECT_LOCATION + - platform: ios + - additional_build_params: --build-number=$versionCode --build-name=$versionName + - ios_output_type: archive + - xcode-archive@4: + inputs: + - distribution_method: app-store + - deploy-to-itunesconnect-deliver@2: + inputs: + - bundle_id: com.tramline.new_app + - skip_app_version_update: "yes" + - connection: api_key + envs: + - opts: + is_expand: false + BITRISE_PROJECT_PATH: ios/Runner.xcworkspace + - opts: + is_expand: false + BITRISE_SCHEME: Runner +meta: + bitrise.io: + stack: osx-xcode-14.2.x-ventura + machine_type_id: g2.4core +app: + envs: + - opts: + is_expand: false + BITRISE_FLUTTER_PROJECT_LOCATION: . +``` + +You can see a working iOS workflow for a Flutter app [here](https://github.com/tramlinehq/ueno/blob/main-ios/bitrise.yml). diff --git a/docs/integrations/ci-cd/ci-cd.md b/docs/integrations/ci-cd/ci-cd.md index 5368f51..f657b38 100644 --- a/docs/integrations/ci-cd/ci-cd.md +++ b/docs/integrations/ci-cd/ci-cd.md @@ -1,9 +1,10 @@ --- +id: ci-cd +title: Build Servers (CI/CD) +sidebar_label: Build Servers (CI/CD) sidebar_position: 1 --- -# Build Servers (CI/CD) - :::tip [Contact us](/getting-support) and we'll help you get setup, including your Continuous Integration (CI) workflow. ::: @@ -14,24 +15,6 @@ Tramline automatically triggers your CI/CD workflows and tracks the latest build After setting up all the required integrations, you can configure your app to use the correct CI/CD workflow from the list of available workflows. ::: -## Build Artifact Selection - -Tramline currently works on the following setup: - -``` -A single step --> configures a single CI workflow --> expects a single output build -``` - -By default, we pick up the largest build generated from your CI workflow. But you can override this behavior by specifying a file pattern in the Step configuration. - -![](/img/build-artifact-name.png) - -For an example on GitHub actions, if you have a bunch of generated artifacts. - -![](/img/github-artifacts.png) - -This setting will do a substring match for `tramline-release` and ignore the rest. - ## Android Tramline requires that your configured workflow accepts the `versionCode` and `versionName` as environment variables and uses them to generate the build that will be uploaded to the distribution channels. You should create separate workflows to generate debug (unsigned) and production (signed) builds. Debug builds are not mandatory, but they can be helpful for testing purposes. @@ -45,10 +28,63 @@ For non-production builds, Tramline looks for any artifact being generated by th - [GitHub Actions](github) - [Bitrise](bitrise) -A sample workflow for Android apps can be generated using our [Mobile App CI workflow GEnerator](https://macige.tramline.app/). Please check the checkbox to include support for `versionCode` and `versionName`. +### Workflow changes + +Take a look at the specific integrations to see a sample workflow for Android apps. + +### Version file changes + +In `build.gradle`: + +```groovy +android { + defaultConfig { + // other default config + versionCode = + if (project.properties["VERSION_CODE"] != null) { + (project.properties["VERSION_CODE"] as String).toInt() + } else { + 1 + } + + versionName = + if (project.properties["VERSION_NAME"] != null) { + project.properties["VERSION_NAME"] as String + } else { + "1.0.0" + } + } +} +``` -![](/img/macige.png) +In `build.gradle.kts`: + +```kotlin +android { + defaultConfig { + // other default config + versionCode = + if (project.properties["VERSION_CODE"] != null) { + (project.properties["VERSION_CODE"] as String).toInt() + } else { + 1 + } + + versionName = + if (project.properties["VERSION_NAME"] != null) { + project.properties["VERSION_NAME"] as String + } else { + "1.0.0" + } + } +} +``` +For flutter apps, you can simply pass the versionCode and versionName as environment variables to the flutter build command. + +```bash +flutter build appbundle --release --build-number=${{ github.event.inputs.versionCode }} --build-name=${{ github.event.inputs.versionName }} +``` ## iOS @@ -67,118 +103,31 @@ For iOS apps, [contact us](/getting-support) and we will help you set up workflo - [GitHub Actions](github) - [Bitrise](bitrise) -Here is a sample Bitrise workflow which uses Fastlane plugin for Bitrise to upload a signed build to the App Store. +### Workflow changes -```yaml -format_version: "11" -project_type: flutter -workflows: - deploy: - steps: - - activate-ssh-key@4: {} - - git-clone@7: {} - - certificate-and-profile-installer@1: {} - - flutter-installer@0: {} - - cache-pull@2: {} - - manage-ios-code-signing@1: - inputs: - - distribution_method: app-store - - flutter-build@0: - inputs: - - project_location: $BITRISE_FLUTTER_PROJECT_LOCATION - - platform: ios - - additional_build_params: --build-number=$versionCode --build-name=$versionName - - ios_output_type: archive - - xcode-archive@4: - inputs: - - distribution_method: app-store - - deploy-to-itunesconnect-deliver@2: - inputs: - - bundle_id: com.tramline.new_app - - skip_app_version_update: "yes" - - connection: api_key - envs: - - opts: - is_expand: false - BITRISE_PROJECT_PATH: ios/Runner.xcworkspace - - opts: - is_expand: false - BITRISE_SCHEME: Runner -meta: - bitrise.io: - stack: osx-xcode-14.2.x-ventura - machine_type_id: g2.4core -app: - envs: - - opts: - is_expand: false - BITRISE_FLUTTER_PROJECT_LOCATION: . -``` +Take a look at the specific integrations to see a sample workflow for iOS apps. + +### Version file changes + +In addition to accepting `versionCode` and `versionName` as environment variables, you'll need to update the `Info.plist` file with the correct `CFBundleVersion` and `CFBundleShortVersionString` to be uploaded to App Store. -You can see a working iOS workflow for a Flutter app [here](https://github.com/tramlinehq/ueno/blob/main-ios/bitrise.yml). +This can be done using the PlistBuddy tool (built-in on macOS) as part of your CI pipeline itself. -Here is a sample Github Actions workflow which uses Fastlane to upload a signed build to the App Store. +Example from a GitHub Actions workflow for a native iOS app: ```yaml -name: iOS Fastlane Release - -on: - workflow_dispatch: - inputs: - versionName: - description: 'User-facing release version name' - required: true - default: "1.0.0" - versionCode: - description: 'versionCode or build number' - required: true - default: '1' - -jobs: - deploy: - runs-on: macos-latest - - steps: - - uses: actions/checkout@v2 - - - name: Set up ruby env - uses: ruby/setup-ruby@v1.138.0 - with: - ruby-version: 3.2.1 - bundler-cache: true - - - name: Decode signing certificate into a file - env: - CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} - run: | - echo $CERTIFICATE_BASE64 | base64 --decode > signing-cert.p12 - - - name: Setup the flutter environment - uses: subosito/flutter-action@v2 - with: - channel: 'stable' - cache: true - - - name: Get flutter dependencies - run: flutter pub get - - - name: Build the app - run: | - flutter build ipa --release --build-number=${{ github.event.inputs.versionCode }} --build-name=${{ github.event.inputs.versionName }} --no-codesign - - - name: Sign and ship the build - working-directory: ios - run: bundle install && bundle exec fastlane ios ship_to_testflight - env: - ASC_KEY_ID: ${{ secrets.APPSTORE_API_KEY_ID }} - ASC_ISSUER_ID: ${{ secrets.APPSTORE_ISSUER_ID }} - ASC_KEY: ${{ secrets.APPSTORE_API_PRIVATE_KEY }} - SIGNING_KEY_PASSWORD: ${{ secrets.P12_PASSWORD }} - SIGNING_KEY_FILE_PATH: ../signing-cert.p12 +- name: Update Archive Version + run: | + /usr/libexec/Plistbuddy -c "Set CFBundleVersion ${{ steps.tramline.outputs.version_code }}" "app/Info.plist" + /usr/libexec/Plistbuddy -c "Set CFBundleShortVersionString ${{ steps.tramline.outputs.version_name }}" "app/Info.plist" ``` -The workflow requires setting up correct [distribution certificate](https://developer.apple.com/help/account/create-certificates/certificates-overview) and [API key](https://developer.apple.com/help/account/manage-keys/create-a-private-key) for App Store Connect and storing them in the Github Action secrets. +Do this in your CI pipeline before building the app. -![](/img/gh-actions-secrets.png) +For a Flutter app, you can simply pass the versionCode and versionName as environment variables to the flutter build command. + +```bash +flutter build ipa --release --build-number=${{ steps.tramline.outputs.version_code }} --build-name=${{ steps.tramline.outputs.version_name }} +``` -You can see a working iOS workflow for a Flutter app [here](https://github.com/tramlinehq/ueno/blob/main/.github/workflows/ios-fastlane-release.yml). +If you are using [Fastlane](https://docs.fastlane.tools/) to build your iOS app, ensure you pass the correct `versionCode` and `versionName` to the Fastlane command building your app. diff --git a/docs/integrations/ci-cd/github.md b/docs/integrations/ci-cd/github.md index 303c703..0e51577 100644 --- a/docs/integrations/ci-cd/github.md +++ b/docs/integrations/ci-cd/github.md @@ -1,9 +1,10 @@ --- +id: github +title: GitHub Actions +sidebar_label: GitHub Actions sidebar_position: 0 --- -# GitHub Actions - :::caution In order to connect this integration, you'll need to be logged in to GitHub as an admin/owner of the organization where your repository is located. ::: @@ -15,3 +16,130 @@ Navigate to the integrations page for your app and select __GitHub__ under the _ When you click the __Connect__ button, you'll be taken through a standard OAuth flow for [GitHub App](https://docs.github.com/en/apps). During this process, you can select one or multiple repositories to grant access to. + +## Android Workflow + +Here is a sample Github Actions workflow which uses Tramline's [deploy-action](https://github.com/tramlinehq/deploy-action) to accept input parameters and generates a signed AAB for Play Store. It produces a signed AAB file as artifact which is then downloaded by Tramline and sent to the relevant tracks on Play Store. + +```yaml +name: Android Release Build + +on: + workflow_dispatch: + inputs: + tramline-input: + required: false + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Configure Tramline + id: tramline + uses: tramlinehq/deploy-action@main + with: + input: ${{ github.event.inputs.tramline-input }} + + - uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: 11 + cache: 'gradle' + + - uses: subosito/flutter-action@v2 + with: + flutter-version: '3.22.0' + channel: 'stable' + cache: true + + - run: flutter pub get + + - name: Retrieve secrets + env: + KEYSTORE_B64: ${{ secrets.KEYSTORE_B64 }} + KEY_PROPERTIES_B64: ${{ secrets.KEY_PROPERTIES_B64 }} + run: | + echo $KEYSTORE_B64 | base64 --decode > android/app/ueno-upload-keystore.jks + echo $KEY_PROPERTIES_B64 | base64 --decode > android/key.properties + + - run: flutter build appbundle --release --build-number=${{ steps.tramline.outputs.version_code }} --build-name=${{ steps.tramline.outputs.version_name }} --flavor prod + + - uses: actions/upload-artifact@v4 + with: + name: release-aab + path: build/app/outputs/bundle/prodRelease/app-prod-release.aab +``` + +## iOS Workflow + +Here is a sample Github Actions workflow which uses Fastlane to upload a signed build to TestFlight. + +```yaml +name: iOS Fastlane Release + +on: + workflow_dispatch: + inputs: + tramline-input: + required: false + +jobs: + build: + runs-on: macos-latest + + steps: + - name: Configure Tramline + id: tramline + uses: tramlinehq/deploy-action@main + with: + input: ${{ github.event.inputs.tramline-input }} + + - name: Set up ruby env + uses: ruby/setup-ruby@v1.138.0 + with: + ruby-version: 3.2.1 + bundler-cache: true + + - name: Decode signing certificate into a file + env: + CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} + run: | + echo $CERTIFICATE_BASE64 | base64 --decode > signing-cert.p12 + + - name: Setup the flutter environment + uses: subosito/flutter-action@v2 + with: + flutter-version: '3.22.0' + channel: 'stable' + cache: true + + - name: Get flutter dependencies + run: flutter pub get + + - name: Build the app + run: | + flutter build ipa --release --build-number=${{ steps.tramline.outputs.version_code }} --build-name=${{ steps.tramline.outputs.version_name }} --no-codesign + + - name: Sign and ship the ipa + working-directory: ios + run: bundle install && bundle exec fastlane ios ship_to_testflight + env: + ASC_KEY_ID: ${{ secrets.APPSTORE_API_KEY_ID }} + ASC_ISSUER_ID: ${{ secrets.APPSTORE_ISSUER_ID }} + ASC_KEY: ${{ secrets.APPSTORE_API_PRIVATE_KEY }} + SIGNING_KEY_PASSWORD: ${{ secrets.P12_PASSWORD }} + SIGNING_KEY_FILE_PATH: ../signing-cert.p12 + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: iOS IPA + path: build/ios/*.ipa +``` + +The workflow requires setting up correct [distribution certificate](https://developer.apple.com/help/account/create-certificates/certificates-overview) and [API key](https://developer.apple.com/help/account/manage-keys/create-a-private-key) for App Store Connect and storing them in the Github Action secrets. + +![](/img/gh-actions-secrets.png) + +You can see a working iOS workflow for a Flutter app [here](https://github.com/tramlinehq/ueno/blob/main/.github/workflows/ios-fastlane-release.yml). diff --git a/docs/integrations/distribution/app_store.md b/docs/integrations/distribution/app-store.md similarity index 93% rename from docs/integrations/distribution/app_store.md rename to docs/integrations/distribution/app-store.md index 7af93d2..c5730cf 100644 --- a/docs/integrations/distribution/app_store.md +++ b/docs/integrations/distribution/app-store.md @@ -1,9 +1,10 @@ --- +id: app-store +title: App Store Connect +sidebar_label: App Store Connect sidebar_position: 0 --- -# App Store Connect - :::info For both TestFlight and App Store, you only need to add the integration once. ::: diff --git a/docs/integrations/distribution/distribution.md b/docs/integrations/distribution/distribution.md index 4278a2f..30fe5b5 100644 --- a/docs/integrations/distribution/distribution.md +++ b/docs/integrations/distribution/distribution.md @@ -1,9 +1,10 @@ --- +id: distribution +title: Build Distribution +sidebar_label: Build Distribution sidebar_position: 2 --- -# Build Distribution - Tramline distributes your app to the distribution channels you have configured. These channels can vary from a Slack channel to beta groups in app stores and production tracks. ## Android @@ -12,9 +13,8 @@ For Android apps, Tramline keeps a copy your release build in its system. It upl ### Supported integrations -- [Google Play Console](play_store) +- [Google Play Console](play-store) - [Firebase App Distribution](firebase) -- [Slack](slack) ## iOS @@ -23,5 +23,5 @@ For iOS apps, Tramline currently expects the build to be present in App Store Co ### Supported integrations - [TestFlight](testflight) -- [App Store](app_store) +- [App Store](app-store) - [Firebase App Distribution](firebase) diff --git a/docs/integrations/distribution/firebase.md b/docs/integrations/distribution/firebase.md index 12f2886..7b92586 100644 --- a/docs/integrations/distribution/firebase.md +++ b/docs/integrations/distribution/firebase.md @@ -1,9 +1,10 @@ --- +id: firebase +title: Firebase App Distribution +sidebar_label: Firebase App Distribution sidebar_position: 3 --- -# Firebase App Distribution - Navigate to the integrations page for your app and select __Firebase App Distribution__ under the __Distributions__ section on the page. ![](/img/build-integration.png) diff --git a/docs/integrations/distribution/play_store.md b/docs/integrations/distribution/play-store.md similarity index 96% rename from docs/integrations/distribution/play_store.md rename to docs/integrations/distribution/play-store.md index 4999a08..04fb64e 100644 --- a/docs/integrations/distribution/play_store.md +++ b/docs/integrations/distribution/play-store.md @@ -1,9 +1,10 @@ --- +id: play-store +title: Google Play Console +sidebar_label: Google Play Console sidebar_position: 2 --- -# Google Play Console - Navigate to the integrations page for your app and select __Google Play Store__ under the __Distributions__ section on the page. ![](/img/build-integration.png) @@ -79,4 +80,4 @@ Once you've properly setup things in both, Google Play Console and Google Cloud -When you click *Create* after uploading the JSON key file, Tramline will verify that the integration is working correctly by checking for any releases or bundles with the [bundle identifier that you would have specified](/using-tramline/app) while adding the app. +When you click *Create* after uploading the JSON key file, Tramline will verify that the integration is working correctly by checking for any releases or bundles with the [bundle identifier that you would have specified](/getting-started/app) while adding the app. diff --git a/docs/integrations/distribution/slack.md b/docs/integrations/distribution/slack.md deleted file mode 100644 index 12fd2a1..0000000 --- a/docs/integrations/distribution/slack.md +++ /dev/null @@ -1,20 +0,0 @@ - -# Slack - -:::caution -In order to connect this integration, you'll need to be logged in to Slack as an admin/owner of the workspace. -::: - -Navigate to the integrations page for your app and select __Slack__ under the __Distributions__ section on the page. - -![](/img/build-integration.png) - -When you click the __Connect__ button, you'll be taken through a standard OAuth flow for [Slack App](https://api.slack.com/authentication/oauth-v2). - - - -The Tramline app will be added to your workspace after the connection is successful. - -:::caution -If you want builds to be sent to a private channel, you'll need to manually invite the Tramline app to that private channel. -::: diff --git a/docs/integrations/distribution/testflight.md b/docs/integrations/distribution/testflight.md index e24b677..8367368 100644 --- a/docs/integrations/distribution/testflight.md +++ b/docs/integrations/distribution/testflight.md @@ -1,9 +1,10 @@ --- +id: testflight +title: TestFlight +sidebar_label: TestFlight sidebar_position: 1 --- -# TestFlight - :::info For both TestFlight and App Store, you only need to add the integration once. ::: diff --git a/docs/integrations/integrations.md b/docs/integrations/integrations.md index 9fc1119..c6bb8df 100644 --- a/docs/integrations/integrations.md +++ b/docs/integrations/integrations.md @@ -1,4 +1,9 @@ -# βš™οΈ Integrations +--- +id: integrations +title: πŸ”Œ Integrations +sidebar_label: πŸ”Œ Integrations +sidebar_position: 2 +--- Tramline is designed to seamlessly integrate with the services you already use to manage your app's release. These integrations provide Tramline with valuable data, events, and actions that allow it to create a comprehensive picture of your release train. diff --git a/docs/integrations/monitoring/bugsnag.md b/docs/integrations/monitoring/bugsnag.md index ddc3b0b..44ec564 100644 --- a/docs/integrations/monitoring/bugsnag.md +++ b/docs/integrations/monitoring/bugsnag.md @@ -1,9 +1,10 @@ --- +id: bugsnag +title: Bugsnag +sidebar_label: Bugsnag sidebar_position: 1 --- -# Bugsnag - Navigate to the integrations page for your app and select __Bugsnag__ under the __Monitoring and Analytics__ section on the page. ![](/img/monitoring-integration.png) diff --git a/docs/integrations/monitoring/crashlytics.md b/docs/integrations/monitoring/crashlytics.md index 77a8a95..9aa09ec 100644 --- a/docs/integrations/monitoring/crashlytics.md +++ b/docs/integrations/monitoring/crashlytics.md @@ -1,9 +1,10 @@ --- +id: crashlytics +title: Firebase Crashlytics +sidebar_label: Firebase Crashlytics sidebar_position: 2 --- -# Firebase Crashlytics - There are two tools in Firebase that collect data from your app: Crashlytics and Google Analytics. Crashlytics data available cannot be used for calculating aggregate stats like crash-free rate or adoption rate, because it only contains info on unhealthy sessions; without info on healthy session stats, there is no denominator for crash-free rates or adoption. diff --git a/docs/integrations/monitoring/monitoring.md b/docs/integrations/monitoring/monitoring.md index 9e4bbf9..22e3382 100644 --- a/docs/integrations/monitoring/monitoring.md +++ b/docs/integrations/monitoring/monitoring.md @@ -1,9 +1,10 @@ --- +id: monitoring +title: Monitoring and Analytics +sidebar_label: Monitoring and Analytics sidebar_position: 4 --- -# Monitoring and Analytics - Tramline gathers release health metrics from your bug tracking and monitoring systems to give a cohesive picture of your release health. ![](/img/release-health.png) diff --git a/docs/integrations/notifications/notifications.md b/docs/integrations/notifications/notifications.md index 78d4267..5d3418a 100644 --- a/docs/integrations/notifications/notifications.md +++ b/docs/integrations/notifications/notifications.md @@ -1,9 +1,10 @@ --- +id: notifications +title: Notifications +sidebar_label: Notifications sidebar_position: 3 --- -# Notifications - Tramline sends significant events in your release life cycle to your configured notification channel. ### Supported integrations diff --git a/docs/integrations/notifications/slack.md b/docs/integrations/notifications/slack.md index 96bb223..75ea89f 100644 --- a/docs/integrations/notifications/slack.md +++ b/docs/integrations/notifications/slack.md @@ -1,9 +1,10 @@ --- +id: slack +title: Slack +sidebar_label: Slack sidebar_position: 0 --- -# Slack - :::caution In order to connect this integration, you'll need to be logged in to Slack as an admin/owner of the workspace. ::: diff --git a/docs/integrations/version-control/github.md b/docs/integrations/version-control/github.md index b522aaf..50166d9 100644 --- a/docs/integrations/version-control/github.md +++ b/docs/integrations/version-control/github.md @@ -1,14 +1,14 @@ --- +id: github +title: GitHub +sidebar_label: GitHub sidebar_position: 0 --- -# GitHub - :::caution In order to connect this integration, you'll need to be logged in to GitHub as an admin/owner of the organization where your repository is located. ::: - Navigate to the integrations page for your app and select __GitHub__ under the __Version Control__ section on the page. ![](/img/vcs-integration.png) diff --git a/docs/integrations/version-control/version-control.md b/docs/integrations/version-control/version-control.md index 3dd69eb..33d3bac 100644 --- a/docs/integrations/version-control/version-control.md +++ b/docs/integrations/version-control/version-control.md @@ -1,9 +1,10 @@ --- +id: version-control +title: Version Control +sidebar_label: Version Control sidebar_position: 0 --- -# Version Control - ### Supported integrations - [GitHub](github) diff --git a/docs/intro.md b/docs/intro.md index d8f9593..6f93a5c 100644 --- a/docs/intro.md +++ b/docs/intro.md @@ -1,10 +1,10 @@ --- slug: '/' +title: πŸ‘‹ Welcome! +sidebar_label: πŸ‘‹ Welcome! sidebar_position: 0 --- -# πŸ‘‹ Welcome! - Tramline is a release coordination and deployment platform, designed especially for mobile app teams. - It **reduces the manual effort** involved in running release cycles for app. diff --git a/docs/inviting-team.md b/docs/inviting-team.md index 235f29b..5c52631 100644 --- a/docs/inviting-team.md +++ b/docs/inviting-team.md @@ -1,33 +1,68 @@ --- +id: inviting-team +title: πŸ‘« Team & Membership +sidebar_label: πŸ‘« Team & Membership sidebar_position: 6 --- -# πŸ‘« Team & Membership +Tramline currently supports inviting new users as either developers or viewers. The primary owner of the organization has roughly the same permissions as a developer in addition to managing billing. -Tramline currently supports inviting new users as either developers or viewers. The primary owner of the organization has the same permissions as a developer in addition to managing billing. +| | Owner | Developer | Viewer | +|-|-------|-----------|--------| +| View all releases | βœ… | βœ… | βœ… | +| View active release | βœ… | βœ… | βœ… | +| View historical releases | βœ… | βœ… | βœ… | +| View DevOps reports | βœ… | βœ… | βœ… | +| Add new apps | βœ… | βœ… | ❌ | +| Manage releases | βœ… | βœ… | ❌ | +| Start a release | βœ… | βœ… | ❌ | +| Trigger workflows | βœ… | βœ… | ❌ | +| Trigger submissions | βœ… | βœ… | ❌ | +| Assign approvals | βœ… | βœ… | ❌ | +| Update approval items | βœ… | βœ… | βœ… | +| Manage release notes | βœ… | βœ… | ❌ | +| Update store rollouts | βœ… | βœ… | ❌ | +| Publish to stores | βœ… | βœ… | ❌ | +| Invite new users | βœ… | βœ… | ❌ | +| Add owner users | βœ… | ❌ | ❌ | +| Manage billing | βœ… | ❌ | ❌ | -| | see all releases | add an app | start release | publish to stores | invite new users | manage billing | -|-----------|------------------|------------|---------------|-------------------|------------------|----------------| -| Owner | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | -| Developer | βœ… | βœ… | βœ… | βœ… | βœ… | ❌ | -| Viewer | βœ… | ❌ | ❌ | ❌ | ❌ | ❌ | -## Invite a new user +## Invite a new team member To invite a new user, click on the dropdown in the top-right and select Team. -![](/img/dropdown.png) +![](/img/organization-settings-dropdown.png) -This page lists all your active and invited users. You can add a team member from here. +Under the Team tab, the page lists all your active and invited users. You can add a team member from here. -![](/img/team.png) +![](/img/team-members.png) Enter the email address, select the role, and you're done! ![](/img/add-member.png) -## View memberships +## Removing members -Additionally, you can be a part of multiple organizations and switch between them: +Owners and developers can remove other users from the team. Developers can only remove other developers and viewers. When users are removed, they are soft-deleted or archived and not actually deleted from the system. This is why we avoid the terminology of delete. Pending invites, however, are permanently deleted. -![](/img/memberships.png) +![](/img/team-members-actions.png) + +For SSO users, removing a user does not revoke their SSO access from the IdP (identity provider), which means they can always log back in as a viewer. On the flip side, if they are removed from the IdP, they aren't automatically kicked out from Tramline, however, they naturally won't be able to login (and can be cleaned up from Tramline if necessary). + +## Internal team management + +Tramline can also group members of your org into configurable teams. The teams can ideally represent the actual team names in your organization. When a new users enters Tramline, they can assign themselves to a team and then Tramline auto-buckets them into various DevOps reports and dashboards against the team they belong to. To add a new one, you just need a name and color. + +![](/img/team-management.png) + +## SSO (Single Sign-On) + +If your organization is single-sign-on enabled, under the organization settings, you can find the configured domains and other (view-only) SSO-related configurations: +

+ +Anyone with the linked SSO domain can sign-in as a _viewer_ using [this link](https://tramline.dev/sso/sign_in). The role of the newly signed up user can be edited later by any _owner_ or _developer_ of the organization. + +

+ +If you would like to update your organization to have SSO support, [please contact us](/getting-support). SSO is available to all users as an add-on, and does not require the pricing plan to be upgraded. diff --git a/docs/using-tramline/_category_.json b/docs/using-tramline/_category_.json deleted file mode 100644 index f9bb8e3..0000000 --- a/docs/using-tramline/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "position": 2, - "collapsed": false -} diff --git a/docs/using-tramline/app-configuration.md b/docs/using-tramline/app-configuration.md deleted file mode 100644 index b256fe6..0000000 --- a/docs/using-tramline/app-configuration.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -sidebar_position: 0.5 ---- - -# Configuring Apps - -Set up all the necessary integrations for your app. See the [integrations section](/integrations) for details. - -After the integrations are setup, you can configure the following settings for your app. Click on the __Configure__ button in the top-right of your app page to get to the app configuration. - -### Repository - -Choose from the list of repositories you have connected via your [VCS integration](/integrations/version-control). - -### Notifications - -Choose from the list of channels you have available via your [Notifications integration](/integrations/notifications): - -![](/img/app-config.png) - -Once the app is configured, the next step is to set up your release! πŸšƒ diff --git a/docs/using-tramline/app.md b/docs/using-tramline/app.md deleted file mode 100644 index d4e62e8..0000000 --- a/docs/using-tramline/app.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -sidebar_position: 0 ---- - -# Adding Apps - -To kick things off, add a new app from the homepage. - -![](/img/add-new-app.png) - -You will need the following details to create your app. - -![](/img/create-new-app.png) - -The bundle identifier is the [Application ID](https://developer.android.com/studio/build/configure-app-module#set-application-id) in Android, and the [Bundle ID](https://developer.apple.com/documentation/appstoreconnectapi/bundle_ids) on iOS. - -You can add multiple apps to Tramline as long the bundle identifiers are unique. It is possible to add apps for the Android and iOS platform with the same bundle identifier. - -The **build number** is just the initial version code you'd like to use to start off releases. After this, all increments are managed by Tramline. - -On **iOS**, this is `cfBundleVersion`.
On **Android**, this is `versionCode`. - -You should pick the starting number to be your last released build number value. Feel free to increment it by a few to ensure that there are no clashes. - -Once the app is saved and validated, the next step is to add integrations and configure your app. diff --git a/docs/using-tramline/build-processing/.build-insights.md b/docs/using-tramline/build-processing/.build-insights.md new file mode 100644 index 0000000..5a794c9 --- /dev/null +++ b/docs/using-tramline/build-processing/.build-insights.md @@ -0,0 +1,16 @@ +--- +id: build-insights +title: Build Insights +sidebar_label: Build Insights +sidebar_position: 5 +--- + +## Custom Build Metadata + +There are some metadata around an app build that are, as of now, out of the purview of Tramline. These could be things like Unit Test Coverage, App Launch Time or something else completely custom to your team. Tramline now allows you to associate these metadata with the builds in Tramline and see the trends during the release. + +You can use the API documented [here](/api#send-custom-metadata-for-a-build) to send these custom build metadata. + +In addition to the custom build metadata, Tramline automatically tracks your app size across the RC builds generated in the release. + +These trends are not just useful to monitor your build health over time, but they can also help you make go/no-go decisions about your release right here from your release dashboard. diff --git a/docs/using-tramline/build-processing/.build-matching.md b/docs/using-tramline/build-processing/.build-matching.md new file mode 100644 index 0000000..4e43c6a --- /dev/null +++ b/docs/using-tramline/build-processing/.build-matching.md @@ -0,0 +1,24 @@ +--- +id: build-matching +title: Build Matching +sidebar_label: Build Matching +sidebar_position: 1 +--- + +NOTE: just a dump of old content from CI/CD page to here + +Tramline currently works on the following setup: + +``` +A single step --> configures a single CI workflow --> expects a single output build +``` + +By default, we pick up the largest build generated from your CI workflow. But you can override this behavior by specifying a file pattern in the Step configuration. + +![](/img/build-artifact-name.png) + +For an example on GitHub actions, if you have a bunch of generated artifacts. + +![](/img/github-artifacts.png) + +This setting will do a substring match for `tramline-release` and ignore the rest. diff --git a/docs/using-tramline/build-processing/.store-submissions.md b/docs/using-tramline/build-processing/.store-submissions.md new file mode 100644 index 0000000..6d1c2e4 --- /dev/null +++ b/docs/using-tramline/build-processing/.store-submissions.md @@ -0,0 +1,31 @@ +--- +id: store-submissions +title: Differences in Store Behavior +sidebar_label: Store Behavior +sidebar_position: 4 +--- + +Play Store and App Store are whacky. + + +## Review Failures + +App review failures are the bane of app releases. Tramline now handles app review failures from the stores and allows your to continue with the release process after resolving the issues. + +### iOS + +For iOS releases, a review failure can be tackled in a couple of ways – via communication with the review team or by submitting a new build for review. + +Tramline now monitors the state of review after a rejection. If the review is resolved by communication, Tramline will sync the status, once the review is approved, and you can continue with the rollout of the build from your Tramline release dashboard. + +If, however, you need to submit a new build, simply make a change in your release branch and Tramline will trigger a new build for submission. + +Tramline will prepare the new release version, set phased release if configured, upload all the necessary release metadata, and allow you to submit the build from your release dashboard. + +### Android + +When an app review fails on the Google Play Store, a new build cannot be sent for review via Tramline due to the limitations of Google Play Publishing API. Tramline will, however, instruct you on what to do right there on the release dashboard. + +Once you resolve the issue by submitting the new build for review manually from Console UI, you can sync the status back on Tramline. + +Tramline will verify the correct status, sync the changes made on the Console UI, and continue with the release as configured. diff --git a/docs/using-tramline/build-processing/build-processing.md b/docs/using-tramline/build-processing/build-processing.md new file mode 100644 index 0000000..3b27d5f --- /dev/null +++ b/docs/using-tramline/build-processing/build-processing.md @@ -0,0 +1,9 @@ +--- +id: build-processing +title: Build Processing +sidebar_label: Build Processing +sidebar_position: 4 +--- +import DocCardList from '@theme/DocCardList'; + + diff --git a/docs/using-tramline/build-processing/build-queue.md b/docs/using-tramline/build-processing/build-queue.md new file mode 100644 index 0000000..4dc8be9 --- /dev/null +++ b/docs/using-tramline/build-processing/build-queue.md @@ -0,0 +1,25 @@ +--- +id: build-queue +title: Change Queue +sidebar_label: Change Queue +sidebar_position: 3 +--- + +For large teams, the process of release stabilization often extends over several days. Throughout this period, testers and stakeholders may find themselves inundated with a continuous stream of new builds as bug fixes are incrementally added to the release branch. + +For better control over build generation, you can now configure triggers that will batch commits based on time and volume before triggering new builds from Tramline. + +You can do this under the **Release Settings** page in the **Advanced Settings** section. + +![](/img/build-queue.png) + +You can control the generation of new builds based on two factors: + +1. **Time** – You can configure Tramline to batch commits based on time. For example, you can set it to batch commits every hour or every day. +2. **Volume** – You can configure Tramline to batch commits based on the number of commits. For example, you can set it to batch commits every 5 commits or every 10 commits. + +With Change Queue configured, Tramline will show the changes waiting to be applied tp the release in the [Changeset Tracking](/using-tramline/working-pane/changeset-tracking) tab of the live release page. + +![](/img/apply-build-queue.png) + +The changes will be applied to the release as per the configured time and volume settings. Additionally, the Release Pilot can choose to manually apply the head of the change queue as and when required. diff --git a/docs/using-tramline/live-release.md b/docs/using-tramline/live-release.md deleted file mode 100644 index e535ab5..0000000 --- a/docs/using-tramline/live-release.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -sidebar_position: 3 ---- - -# Ongoing Release - -When you start a new release, this page is your control panel. Everything about the current release is controlled from right here. You will likely spend most of your time in Tramline here. - -This is what a typical successful release in Tramline looks like: - -![](/img/ongoing.png) - -## Run the first step of the train automatically - -There are a few things Tramline does as soon as the release starts: -- It creates a release branch off of your working branch. -- It starts the first step in your release train and triggers the CI workflow for that step. -- Once the CI workflow is finished, Tramline will distribute the build generated by the workflow to the configured distribution channels. - -Subsequent steps (review or release) of the train are run in order with a manual trigger after the first one finishes. - -A release step is also auto-triggered if your train has only one step. - -![](/img/step-movement.png) - -## New commits landing will re-trigger steps - -It's common to add bug fixes and sometimes even small new features to a release after the release branch has been created. - -When a new commit lands on the release branch of your app, Tramline will restart the release train from step one with the latest commit on the release branch. - -If you're on step number 2 of a 3-step train, landing a new commit to the release branch will re-trigger step 1 & 2 automatically. This is so that the stakeholders of those steps are informed of the updates made to the release. - -Since release steps _may_ have production deployments, Tramline plays it safe and does not auto-trigger this step for subsequent commits. - -Remember, Tramline always works on the latest commit or the `HEAD` of the release branch. - -## All commits - -The _All commits_ section of the page will show all the commits that land on the release branch. You can refer to the state of the release train at each of the commit. - -You can also see the corresponding CI workflow and build details for each commit in this section of the page. - -## Release metadata - -You can update release-related metadata prior to initiating your production store release. These details can be modified anytime between the beginning of the release and the commencement of a production deployment, as the metadata will be uploaded to the store during the production deployment process. - -- Release notes -- Promotional text (**iOS** only) - -Tramline will add some sensible defaults for these for your benefit. - -![](/img/release-metadata.png) - -## Controlling the production release - -The production release across both stores in handled by Tramline slightly differently due to the different processes of these stores. - -### iOS - -If your release step has a production channel, you are presented with: - -![](/img/submit-for-review.png) - -When you start the release step, Tramline automatically creates an inflight release on the App Store and assigns the correct build to the that release. Once the release is prepared, you have to submit the app for review. - -![](/img/submitted-for-review.png) - -Once you have submitted the app for review, you can track its progress on the right: - -![](/img/submitted-for-review-2.png) - -:::info -This widget above will always show the latest status of of the release on TestFlight or App Store. -::: - -Once the review is approved by Apple, you can start the release of the build from Tramline. - -![](/img/ios-start-release.png) - -If there is no phased release enabled, your release is **complete**! πŸŽ‰ - -#### Phased release - -If you have production release with a phased release, you will be presented with controls to start the phased release. - -![](/img/ios-phased-release-started.png) - -Once the rollout is started, you can **pause** (and **resume**) the rollout, **halt** it, or, release to **all the users** right away if you confident about your release. - -### Android - -If your release step has a production channel, you are presented with: - -![](/img/android-start-release.png) - -When you start, Tramline creates a release in Play Store. It also automatically promotes the release on the **production track**. - -If there is no staged rollout enabled, your release is **complete**! πŸŽ‰ - -#### Staged rollout - -If you have a production release with staged rollout, you will be presented with controls to navigate your staged rollout. - -![](/img/android-staged-rollout-not-started.png) - -Once the rollout is started, you can **increase** the rollout, **halt** it, or, release to **all the users** right away if you confident about your release. - -![](/img/android-staged-rollout-started.png) - -## Finishing up - -Once the build has been successfully distributed to all channels in the release step, you can finalize your release. - -![](/img/finish-release.png) - -This would typically tag the correct release commit, and depending on the branching strategy, it will also automatically create and merge necessary pull requests. - -Once a release is finalized, it becomes locked and is unable to accept any further patches or commits. - -![](/img/finalize.png) diff --git a/docs/using-tramline/event-timeline.md b/docs/using-tramline/quality-and-monitoring/event-timeline.md similarity index 85% rename from docs/using-tramline/event-timeline.md rename to docs/using-tramline/quality-and-monitoring/event-timeline.md index 421c779..36bf955 100644 --- a/docs/using-tramline/event-timeline.md +++ b/docs/using-tramline/quality-and-monitoring/event-timeline.md @@ -1,9 +1,10 @@ --- -sidebar_position: 4 +id: event-timeline +title: Release Activity +sidebar_label: Release Activity +sidebar_position: 1 --- -# Event Timeline - From the Live Release page, you can head over to the Event Timeline page. ![](/img/button-event-timeline.png) diff --git a/docs/using-tramline/quality-and-monitoring/notifications.md b/docs/using-tramline/quality-and-monitoring/notifications.md new file mode 100644 index 0000000..70d5fc7 --- /dev/null +++ b/docs/using-tramline/quality-and-monitoring/notifications.md @@ -0,0 +1,48 @@ +--- +id: notifications +title: Notifications +sidebar_label: Notifications +sidebar_position: 2 +--- + +Tramline sends notifications for every significant event in your release process to keep you and your team informed about an ongoing release. You can enable notifications in the **Release Settings** tab. + +Enable notifications + +## Advanced configuration + +Not everyone in your team is the correct audience for all release-related notifications. Tramline allows you to configure which notifications you want, and what all channels do they need to go in the **Notification Settings** tab for each of your **Release Settings**. + +![](/img/notifications-list.png) + +This is the the exhaustive list of notifications you can configure: + +- **Release Scheduled**: When a release is scheduled. +- **Release Started**: When a new release is started. +- **Workflow Run Failed**: When a workflow run fails. +- **Workflow Run Halted**: When a workflow run is halted. +- **Workflow Run Unavailable**: When a workflow run is unavailable. +- **Build Available**: When a new build is generated. +- **Backmerge Failed**: When the auto backmerge PR creation fails. +- **Internal Submission Finished**: When an internal submission finishes. +- **Internal Release Finished**: When an internal build step finishes. +- **Internal Release Failed**: When an internal build step fails. +- **Beta Submission Finished**: When a beta submission finishes. +- **Beta Release Failed**: When a release candidate step fails. +- **Production Submission Started**: When a production submission starts. +- **Production Submission In Review**: When a production submission is in review. +- **Production Submission Approved**: When a production submission is approved. +- **Production Submission Rejected**: When a production submission is rejected. +- **Production Submission Cancelled**: When a production submission is cancelled. +- **Production Rollout Started**: When a production rollout starts. +- **Production Rollout Paused**: When a production rollout is paused. +- **Production Rollout Resumed**: When a production rollout is resumed. +- **Production Rollout Halted**: When a production rollout is halted. +- **Production Rollout Updated**: When a production rollout is updated. +- **Production Release Finished**: When a production release finishes. +- **Release Health Events**: When a release health event happens. +- **Release Ended**: When the release finishes. +- **Release Finalize Failed**: When the release finalization fails. +- **Release Stopped**: When the release is stopped before finishing. + +If you feel that your team doesn't require any notifications, as everyone is already informed through Tramline, you can deactivate all notifications in the **Release Settings** tab. diff --git a/docs/using-tramline/quality-and-monitoring/quality-and-monitoring.md b/docs/using-tramline/quality-and-monitoring/quality-and-monitoring.md new file mode 100644 index 0000000..cc6e7b8 --- /dev/null +++ b/docs/using-tramline/quality-and-monitoring/quality-and-monitoring.md @@ -0,0 +1,10 @@ +--- +id: quality-and-monitoring +title: Quality and Monitoring +sidebar_label: Quality and Monitoring +sidebar_position: 5 +--- + +import DocCardList from '@theme/DocCardList'; + + diff --git a/docs/reldex.md b/docs/using-tramline/quality-and-monitoring/reldex.md similarity index 97% rename from docs/reldex.md rename to docs/using-tramline/quality-and-monitoring/reldex.md index 494a19a..d708c45 100644 --- a/docs/reldex.md +++ b/docs/using-tramline/quality-and-monitoring/reldex.md @@ -1,9 +1,10 @@ --- -sidebar_position: 9 +id: reldex +title: Reldex (Release Score) +sidebar_label: Reldex (Release Score) +sidebar_position: 4 --- -# 🌑️ Reldex (Release Score) - Release Score or Reldex – Release Process Index – is a quantitative metric that measures the efficacy of your mobile release process. Like [Apdex](https://en.wikipedia.org/wiki/Apdex), it breaks down various measurements and insights from your release into a single score between 0 and 1. diff --git a/docs/using-tramline/release-health-monitoring.md b/docs/using-tramline/quality-and-monitoring/release-health-monitoring.md similarity index 96% rename from docs/using-tramline/release-health-monitoring.md rename to docs/using-tramline/quality-and-monitoring/release-health-monitoring.md index b14775e..bbc3afd 100644 --- a/docs/using-tramline/release-health-monitoring.md +++ b/docs/using-tramline/quality-and-monitoring/release-health-monitoring.md @@ -1,9 +1,10 @@ --- -sidebar_position: 5 +id: release-health-monitoring +title: Release Health Monitoring +sidebar_label: Release Health Monitoring +sidebar_position: 3 --- -# Release Health Monitoring - During the distribution of a release, it's crucial to ensure its health is continuously monitored. This monitoring process involves observing various metrics tracked by a dedicated monitoring tool. With Tramline, you can configure health rules to check if these tracked metrics cross certain thresholds. @@ -56,4 +57,3 @@ If the filter conditions are not matched, the rule is not evaluated and does not 1. **Staged rollout**: Percentage of users your release has been rollout out to 2. **Adoption rate**: Percentage (proportion) of sessions that a given release has seen over the last 24-hour period - diff --git a/docs/using-tramline/release-management/.train-overview.md b/docs/using-tramline/release-management/.train-overview.md new file mode 100644 index 0000000..bef99f4 --- /dev/null +++ b/docs/using-tramline/release-management/.train-overview.md @@ -0,0 +1,22 @@ +--- +id: train-overview +title: Releases Overview +sidebar_label: Releases Overview +sidebar_position: 4 +--- + +## DevOps Charts + +## Operational Efficiency + +### Team Contributions + +Tramline, now supports adding your organization's team structure to the platform. This opens up a lot of possibility around correlating team performance metrics with release dynamics. + +We're kicking things off with release stability & contribution analysis across teams. + +What, or rather, who is holding up your releases? We break down which team has contributed the most to the stability of releases. + +The flip side of this analysis is equally interesting. Instead of who is holding things up, you get rough indicators on who is contributing the most to a release. + +Since this data is also available in real-time for ongoing releases, it complements the insights provided in the Ongoing Work section. Release captains now get a pretty good sense of what (and who) is holding up the release from moving ahead. diff --git a/docs/using-tramline/release-management/branching-strategies.mdx b/docs/using-tramline/release-management/branching-strategies.mdx new file mode 100644 index 0000000..09dbe9d --- /dev/null +++ b/docs/using-tramline/release-management/branching-strategies.mdx @@ -0,0 +1,107 @@ +--- +id: branching-strategies +title: Branching Strategies +sidebar_label: Branching Strategies +sidebar_position: 2 +--- + +:::tip +**Three** types of branching strategies are currently supported when [setting up a release](/using-tramline/release-management/release-settings). +::: + +:::info +There are various automations around these branching strategies that help manage merges, create pull requests, cut tags etc. See [Automations](/automations.mdx) for more information. +::: + +## Almost Trunk +Almost Trunk is the simplest strategy and the one that we generally recommend. + +For every release, we create a new release branch from the `HEAD` of the working branch. Release-specific fixes should not be committed to the release branch directly. Instead, you should land the fixes on your working branch, and then cherry-pick them on to the release branch. + +```mermaid +gitGraph + commit id: "commit 1" + commit id: "commit 2" + branch rel/production/2025-01-01 + checkout rel/production/2025-01-01 + commit id: "fix 1" + commit id: "fix 2" + checkout main + commit id: "commit 3" + commit id: "commit 4" + commit id: "commit 5" + merge rel/production/2025-01-01 tag: "End of release 2025-01-01" + commit id: "commit 6" + commit id: "commit 7" +``` + +#### Under release settings + +![](/img/branching-atrunk.png) + +## Release with Backmerge + +Release with Backmerge creates a new release branch from the `HEAD` of the working branch, for every release. Once the release is finalized, two things happen: + +1. The release branch is merged into the backmerge (production) branch +2. The backmerge branch is "backmerged" into the working branch + +```mermaid +gitGraph + branch production order: 3 + commit id: "previously" + checkout main + commit id: "commit 1" + commit id: "commit 2" + branch rel/production/2025-01-01 order: 2 + checkout rel/production/2025-01-01 + commit id: "fix 1" + commit id: "fix 2" + checkout main + merge rel/production/2025-01-01 tag: "Backmerge from release 2025-01-01" + checkout production + merge rel/production/2025-01-01 tag: "Backmerge from release 2025-01-01" + checkout main + commit id: "commit 3" + commit id: "commit 4" + commit id: "commit 5" +``` + +#### Under release settings + +![](/img/branching-rbm.png) + +## Parallel Working and Release Branch + +Parallel Working and Release does not create a new release branch for every release. Instead, at the start of a release, the working branch is merged into the release branch. Release-specific fixes land on the release branch directly. At the end of the release, the release branch is merged back into the working branch. + +```mermaid +gitGraph + branch release + commit id: "previously" + checkout main + commit id: "commit 1" + commit id: "commit 2" + checkout release + merge main tag: "Start of release 1.0.0" + commit id: "fix 1" + commit id: "fix 2" + checkout main + commit id: "commit 3" + commit id: "commit 4" + merge release tag: "End of release 1.0.0" + commit id: "commit 5" + commit id: "commit 6" +``` + +#### Under release settings + +![](/img/branching-pwr.png) + +## Trunk-based + +:::info +This branching strategy is currently in beta and will be publicly available in mid-2025. +::: + +Trunk-based branching strategy releases from a single, long-lived branch that's used for both development and releases. No new branches are created. The `HEAD` of trunk is simply tagged and a release is started from that point onwards. Additional fixes to the release can be optionally picked into the release. diff --git a/docs/using-tramline/release-management/new-release.md b/docs/using-tramline/release-management/new-release.md new file mode 100644 index 0000000..e064be7 --- /dev/null +++ b/docs/using-tramline/release-management/new-release.md @@ -0,0 +1,43 @@ +--- +id: new-release +title: Prepare new release +sidebar_label: Prepare new release +sidebar_position: 3 +--- + +

+ +

+ +When you prepare a new release from the top-right button in your releases page. You will get this selection modal where you can pick the release type. + +![](/img/prepare-new-release.png) + +The very first release you create, uses the seed version that you configured in the [release settings](/using-tramline/release-management/release-settings) and use that as a base to create the next version. Subsequent versions, depending on the option you select will correctly increment the version based on the [versioning strategy](/using-tramline/version-management) used – minor, major or custom. + +:::info + +If you're using the [Almost Trunk](/using-tramline/release-management/branching-strategies#almost-trunk) branching strategy, you will also see a note at the top that informs you of the release branch that will automatically be created when you start a new release. +::: + +:::info +If you pick the custom version option, Tramline will auto-correct the next minor or major version for the next release based on this custom version. +::: + +#### Minor +The minor version bump is the most commonly used type for most incremental new releases. These upgrades enhance the app's functionality with no disruption to the user experience. + + +#### Major +The major version bump is typically reserved for significant updates (often not backwards compatible, eg. users need to re-login) that necessitate users to upgrade. + +#### Patch + +Patch versions are managed automatically by Tramline. They get bumped either when you make a [patchfix](/using-tramline/special-cases/patchfix) or a new [hotfix](/using-tramline/special-cases/hotfix) release. You can't manually change this unless you specify an explicit custom version with a modified patch version. + +:::tip +For [CalVer](/using-tramline/version-management/version-strategies), you only get two options + +1. cut a standard calendar-based release +2. a new custom version +::: diff --git a/docs/using-tramline/release-management/release-management.md b/docs/using-tramline/release-management/release-management.md new file mode 100644 index 0000000..1a64dfa --- /dev/null +++ b/docs/using-tramline/release-management/release-management.md @@ -0,0 +1,10 @@ +--- +id: release-management +title: Release Management +sidebar_label: Release Management +sidebar_position: 1 +--- + +import DocCardList from '@theme/DocCardList'; + + diff --git a/docs/using-tramline/release-management/release-settings.md b/docs/using-tramline/release-management/release-settings.md new file mode 100644 index 0000000..cece5e2 --- /dev/null +++ b/docs/using-tramline/release-management/release-settings.md @@ -0,0 +1,134 @@ +--- +id: release-settings +title: Release Settings +sidebar_label: Release Settings +sidebar_position: 1 +--- + +Tramline's main building block is the release train (or release cycle). It is designed to emulate the release process followed by your team when shipping apps. + +Once you have added an app and configured all the integrations, you can add a new release train by providing the following configuration. + +![](/img/create-new-train.png) + +The way to think about a release train is this encapsulation. + +``` +Release Train = Branching Strategy + Release Cadence +``` + +Most teams would typically have a maximum of two release cycles (although Tramline imposes no such limit) depending on the frequency of the release, the testing cycles and the audience for that release. + +## Basic settings + +1. **Name** - The name of the release train. This name will be used for creating the release branches (if needed) and for identifying the release cycle in Tramline dashboard. +2. **Description** - A brief description of the release cycle. This is just for reference for you and your team. +3. **Version Strategy** – The versioning strategy used for your app's releases. Tramline supports both `Semantic Versioning` and `Calendar Versioning`. In addition to choosing the relevant version strategy, you should provide the last version of the app that you have released. Tramline will use this seed version to calculate the next version for the release. +4. **Branching Strategy** – The branching strategy that is used by your team to manage work for the release. The most common branching strategy is [Almost Trunk](branching-strategies#almost-trunk). Tramline supports a few other branching strategies, you can read more about them [here](branching-strategies). +5. **Enable Notifications** – If you want to enable notifications for your release, you can do so here. A much more granular way to control notifications for different steps of the release is available in the [Notifications](/using-tramline/quality-and-monitoring/notifications) section. Please note that this option is only available if you have added a [notification integration](/integrations/notifications) for your app. + +## Advanced settings + +Tramline provides a lot of advanced settings to customize your release process. You can find them in the **Advanced Settings** section of the **Release Settings**. + +These settings have a sane default value, but you can always tweak them as per your team's needs. + +1. **Release Schedule** – If you run your release cycles on a strict schedule, you can set it here. Tramline will ensure that a release starts on the scheduled date and time on a periodic basis. More details on this can be found in the [Scheduled Releases](/using-tramline/release-management/scheduled-release) section. +2. **Enable Approvals** – Some teams prefer to have a human in the loop before starting a release. Tramline allows you to enable approvals for your releases. This will notify the stakeholders who need to approve the release before it can be sent to production. More details on this can be found in the [Approvals](/using-tramline/working-pane/approvals) section. +3. **Change queue** – Tramline allows you to control when changes landing on the release branch are applied to trigger new builds in your release. By default, commits on the release branch are auto-applied. Read more about this in the [Change Queue](/using-tramline/build-processing/build-queue) section. +4. **Continuous Backmerge** – By default, Tramline merges changes made in the release branch back into your working branch towards the end of a release. You can override that by enabling the continuous backmerge option for Tramline to merge each change back into the working branch as soon as it lands. Read more about how backmerges are managed across different branching strategies and integrations in the [Backmerges](/automations#merging-fixes-back) section. +5. **Patch Change Application** – By default, Tramline will apply new changes landing on the release branch by triggering the first step of the release (creation of internal or RC build). If you do not want to auto-apply the changes once a production rollout has begun, you can disable the patch change application flag. Once disabled, Tramline will wait for you to manually trigger the first step of the release for any patch changes. +6. **Build Notes** – Tramline generates tester notes for all internal builds that are sent to the internal testing channels like Firebase App Distribution or TestFlight as well to the notification channels configured. These notes are a summary of all the changes that were made on the release branch since the last build generated. You can choose to compact these notes or leave them as detailed as the changes are. +7. **Tags** – Tramline generates tags at the end of each release cycle to identify the final commit that was used for the release. The tag name is the last version generated for the release. You can choose to add **prefix** and/or **suffix** for the tag name to customize it. Eg: The default tag name is `v1.0.0`, but it can be customized to `v1.0.0-rc` or `in-v1.0.0-nightly`. +8. **Version Change** – Tramline manages the versioning of your releases to ensure that there is no conflict or confusion between the versions of the app being tested and sent to the stores. It also ensures that the versions are incremented semantically correctly. You can, however, choose to freeze the version of the releases or ask Tramline to increment only the patch version. + +:::caution +If you are freezing the version of your releases, Tramline will no longer be able to ensure that the version is incremented correctly. You should only freeze the version for the release cycles where no builds are sent to the production tracks of the stores. +::: + +## Submission settings + +Once you create a new release train, Tramline creates a default set of submission settings for you. You should review these settings and make any necessary changes before you start any releases for the train. + +The submission settings comprise of the following: + +### Release Candidate (RC) Workflow + +Choose a CI workflow that generates the build that will be sent to the production channel of the stores (if enabled) as well the beta testing channels configured by you. + +The workflow will be your existing CI workflow that generates the build for you. If you don't have a working CI workflow, we can [help](/getting-support) you set one up. Or, you can use our [CI workflow generator](https://macige.tramline.app). + +For more details on configuring your CI workflow, please refer to [this section](/integrations/ci-cd). + +For **iOS**, make sure your CI workflow can push your builds to TestFlight.
For **Android**, make sure your CI workflow produces a valid `aab/apk` build file. + +### Production Release Settings + +You can choose to disable the production release for your releases if your app is still in beta. + +You can also choose to enable/disable staged rollout for your production release. + +![](/img/ios-staged-rollout.png) + +On **iOS**, phased releases are fixed and managed entirely by App Store. + +| day | percentage of users | +|-----|---------------------| +| 1 | 1 | +| 2 | 2 | +| 3 | 5 | +| 4 | 10 | +| 5 | 20 | +| 6 | 50 | +| 7 | 100 | + +Tramline gives you a way to **pause**, **resume**, or **halt** the rollout at any given point during the phased release. + +![](/img/android-staged-rollout.png) + +On **Android**, staged rollouts are more flexible and can be configured in whatever increments you want. You can specify the stages of the rollout by comma separating the incremental values, like `1, 5, 10, 50, 100` - these will give you 5 stages of 1%, 5%, 10%, 50% and 100% + +:::info +It is necessary to have at least one submission channel configured in beta testing if you have turned production release off. +::: + +### Beta Testing Configuration + +If you send your RC to other tracks or testing groups before sending it to production, you can configure the beta testing channels. + +Each channel can be configured in the order you want. You can also choose whether you want to send the RC to the channel as soon as it is ready or wait for a manual trigger. + +The channels available to you for your release train will depend on the [Build Distribution Integrations](/integrations/distribution) you have added for your app. + +### Internal Testing Configuration + +This step can be enabled if you have an internal testing process that generates non-production builds and sends them to internal testing channels like Firebase App Distribution or even Slack. + +You must choose a separate workflow to build the internal builds. If you have notification integration configured, Tramline will send all builds to the configured channel when it is ready. + +In addtion to that, you can add another set of submission channels for internal builds. Along with the build, Tramline will send the changes in the build as tester notes to the configured channels. + +## Mental model + +In summary, Tramline aims to flexibly adapt to your release processes. For example, you could have two different trains operating on two different release cadences. + +``` +Debug Build Train (every night) + β†’ RC Workflow: Production Build + β†’ Production release: disabled + β†’ Google Play Store: Internal Testing + +Staging + Production Build Train (every 14 days) + β†’ Internal Build: Staging Build + β†’ Firebase App Distribution: QA + β†’ Beta Testing: Production Build + β†’ Google Play Store: Closed Testing + β†’ Google Play Store: Open Testing + β†’ Production Release: Google Play Store: Production Track +``` + +And so on. + +Releases can also be run on a schedule as mentioned in the example above. You can read more on that [here](scheduled-release). + +Configuring this is a one-time setup. After this we can actually start making releases. diff --git a/docs/using-tramline/release-management/scheduled-release.md b/docs/using-tramline/release-management/scheduled-release.md new file mode 100644 index 0000000..3b3fad5 --- /dev/null +++ b/docs/using-tramline/release-management/scheduled-release.md @@ -0,0 +1,24 @@ +--- +id: scheduled-release +title: Scheduled Release +sidebar_label: Scheduled Release +sidebar_position: 6 +--- + +Releases can be configured to run on a pre-defined schedule. You can configure this on the **Advanced Settings** tab of the **Release Settings**. + +![Scheduled Release](/img/scheduled-release-config.png) + +One use-case for this is to set-up nightly trains that automatically trigger latest dev builds and send them to internal teams on a consistent cadence. + +Another common use-case is when teams have a scheduled release window, and want to ensure that the release goes out on time every cycle. + +### Automatic Stop on Failure + +Tramline, by default, halts the scheduling of an automatic train if the last release failed, but was not explicitly stopped. This is a safety mechanism to prevent a series of failures. + +With the option of **Automatic stop on failure** under scheduled releases, Tramline will automatically stop a failed release so that a new one can be scheduled and kicked off. This is useful when you're confident that the failures are one-off and/or you don't want to handhold scheduled releases. + +![](/img/scheduled-release-auto-stop.png) + +Please note that only releases that in failure state will be stopped. If you have a running successful release, Tramline will start an [upcoming release](/using-tramline/release-management/upcoming-release) instead of stopping the ongoing one. diff --git a/docs/using-tramline/release-management/synchronized-release.md b/docs/using-tramline/release-management/synchronized-release.md new file mode 100644 index 0000000..4fd2d0e --- /dev/null +++ b/docs/using-tramline/release-management/synchronized-release.md @@ -0,0 +1,18 @@ +--- +id: synchronized-release +title: Synchronized Release +sidebar_label: Synchronized Release +sidebar_position: 7 +--- + +![](/img/cross-platform-release-example.png) + +For teams with apps built in cross-platform stacks like React Native and Flutter, we now support synchronized release trains across both platforms. + +- This allows teams to run their releases from a single branch. +- You get centralized control over both the stores. +- This also ensures all changes get applied to both platforms, but also gives you the nuance to apply selective changes to either platform when needed. + +Since there can be cases where there is a drift between what is shipped to one store over another, we also cut platform-specific tags to disambiguate the commits. + +If you decide against releasing to both platforms, you can now belatedly mark one platform as finished. This allows the release to proceed without the need to restart the entire release or pause the other platform. diff --git a/docs/using-tramline/release-management/upcoming-release.md b/docs/using-tramline/release-management/upcoming-release.md new file mode 100644 index 0000000..f8a5ec8 --- /dev/null +++ b/docs/using-tramline/release-management/upcoming-release.md @@ -0,0 +1,12 @@ +--- +id: upcoming-release +title: Upcoming Release +sidebar_label: Upcoming Release +sidebar_position: 5 +--- + +You can start ramping up a new release before your current release finishes. This allows you to cut back on the additional time spent waiting for a full phased rollout to complete in the current release and start stabilizing new features on the working branch. + +This feature is only available when you have production release enabled in your release settings. + +![](/img/upcoming-release-section.png) diff --git a/docs/using-tramline/release-trains/release-trains.md b/docs/using-tramline/release-trains/release-trains.md deleted file mode 100644 index 93762bb..0000000 --- a/docs/using-tramline/release-trains/release-trains.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -sidebar_position: 2 ---- - -# Release Trains - -Tramline's main building block is the release train. It is designed to emulate the release process followed by your team when shipping apps. - -Once you have added an app and configured all the integrations, you can add a new release train by providing the following configuration. - -![](/img/new-train.png) - -The way to think about a release train is this encapsulation. - -``` -Release Train = Branching Strategy + Release Cadence -``` - -Most teams would typically have a maximum of two release trains (although Tramline imposes no such limit) depending on the frequency of the release, the testing cycles and the audience for that release. - -## Steps - -Steps, as the name suggests, are tasks that a train does. Steps run a build workflow and move the build to distribution channels. - -The build workflow will be your existing CI workflow that generates the build for you. If you don't have a working CI workflow, we can [help](/getting-support) you set one up. Or, you can use our [CI workflow generator](https://macige.tramline.app). - -For more details on configuring your CI workflow, please refer to [this section](/integrations/ci-cd). - -For **iOS**, make sure your CI workflow can push your builds to TestFlight.
For **Android**, make sure your CI workflow produces a valid `aab` build file. - - -``` -Step = CI Build workflow + Distribution Channel(s) -``` - -There is no limit to the number of steps a train can have, but a typical process could look like: - -![](/img/standard-steps.png) - -### Review - -A review step is typically something that is used to stabilize the build before releasing to production or a large number of people. You can have as many review steps as you want. - -Any given review step could represent stages in your release process, for example, generating a debug build and deploying it on Slack and then generating a staging build for internal testers on TestFlight. - -One step can distribute the same build to multiple distribution channels. - -Here's an example of a couple of review steps: - -![](/img/review-steps.png) - -### Release - -A release step can only be one, and would typically be used to release to the production track on Play Store or to App Store. This is not mandatory though, the release step can also distribute to a non-production channel. - -:::info -It is mandatory to add a Release Step before you can start a release for the train. If you only require one step, just simply add a release step. -::: - -Since a release step allows adding production channels, this is where you would configure phased releases. - -![](/img/ios-staged-rollout.png) - -On **iOS**, phased releases are fixed and managed entirely by App Store. - -| day | percentage of users | -|-----|---------------------| -| 1 | 1 | -| 2 | 2 | -| 3 | 5 | -| 4 | 10 | -| 5 | 20 | -| 6 | 50 | -| 7 | 100 | - -Tramline gives you a way to pause, resume, and halt the rollout at any given point during the phased release. - -![](/img/staged-rollout.png) - -On **Android**, staged rollouts are more flexible and can be configured in whatever increments you want. You can specify the stages of the rollout by comma separating the incremental values, like `1, 5, 10, 50, 100` - these will give you 5 stages of 1%, 5%, 10%, 50% and 100% - -## Distributions - -There is no limit to the number of distributions you can add per step. But most steps will generally have fewer than 3-4. The distribution channels available to you for your release train will depend on the [Build Distribution Integrations](/integrations/distribution) you have added for your app. - -![](/img/distributions.png) - -You can only add a production distribution channel during the Release step, not during the Review step, as previously mentioned. - -:::info -The steps within a train and the distributions within a step are order dependent. The train always follows the order you pick. -::: - -## Mental model - -In summary, Tramline aims to flexibly adapt to your release processes. For example, you could have two different trains operating on two different release cadences. - -``` -Debug Build Train (every night) - β†’ Step: Debug Build - β†’ Firebase App Distribution - -Staging + Production Build Train (every 14 days) - β†’ Step: Staging Build - β†’ Slack: #builds - β†’ Google Play Store: Internal Testing - β†’ Step: Production Build - β†’ Google Play Store: Production Track -``` - -And so on. - -Release trains currently do not have [automations](/automations) that schedule releases, but this is something that will come in the near future and will easily fit into existing trains you have. - -Configuring this is a one-time setup. After this we can actually start making releases. diff --git a/docs/using-tramline/special-cases/.alternate-cycles.md b/docs/using-tramline/special-cases/.alternate-cycles.md new file mode 100644 index 0000000..476529c --- /dev/null +++ b/docs/using-tramline/special-cases/.alternate-cycles.md @@ -0,0 +1,6 @@ +--- +id: alternate-cycles +title: Alternate Release Cycles +sidebar_label: Alternate Release Cycles +sidebar_position: 3 +--- diff --git a/docs/using-tramline/special-cases/app-variants.md b/docs/using-tramline/special-cases/app-variants.md new file mode 100644 index 0000000..a298c0c --- /dev/null +++ b/docs/using-tramline/special-cases/app-variants.md @@ -0,0 +1,14 @@ +--- +id: app-variants +title: App Variants +sidebar_label: App Variants +sidebar_position: 6 +--- + +Tramline supports App Variants which are akin to product flavors or build variants, but with an explicit requirement of having a different bundle identifier. + +For example, you can have a staging variant `com.tramline.ueno.staging` which is different from your primary `com.tramline.ueno` app. + +App variants allow you to configure different build distribution endpoints for each of these variants. Eg. different Firebase App Distribution apps for different variants. + +When defining a release step, you can now choose the app variant (default being the primary app) and its configuration to be used for the build generation and distribution. diff --git a/docs/using-tramline/special-cases/cascading-rollout.md b/docs/using-tramline/special-cases/cascading-rollout.md new file mode 100644 index 0000000..be5872c --- /dev/null +++ b/docs/using-tramline/special-cases/cascading-rollout.md @@ -0,0 +1,26 @@ +--- +id: cascading-rollout +title: Cascading Rollout +sidebar_label: Cascading Rollout +sidebar_position: 5 +--- + +With Google Play Console, when you update your rollout to a 100%, it is not possible to halt it, even if in reality the actual rollout hasn't farmed out to all of the 100% of users yet. + +For example, if you have 100 users, and your rollout sequence is 10%, 50% and 100%, and once you actually move the rollout to 100%, it is possible that number of users/sessions that actually receive the update is still much less than 100. Since a halt isn't possible on the Play Console at 100%, teams usually have a workaround to release to 99.9%. This allows them to halt the rollout until as late as possible. + +Tramline natively supports this process; you can set your rollouts to be cascading, which will only rollout to 99.9% (or your final rollout value of choice) and prevent you from starting the rollout of the next release until the previous one is moved from 99.9% to a 100%. + +![Cascading Rollout](/img/cascading-rollout-config.png) + +You can configure this in the **Submission Settings** tab of the **Release Settings** under the **Production Release** section. + +This entire flow is managed and prompted through appropriate callouts and actions during the release process. + +![](/img/cascading-rollout-99.png) + +Before you start the rollout of your new release, Tramline will prompt you complete the rollout of the previous release before starting the current one. + +![Cascading Rollout Prompt](/img/cascading-rollout-prompt.png) + +Only when the previous release is complete, can you start the staged rollout of the ongoing release. diff --git a/docs/using-tramline/special-cases/draft-mode.md b/docs/using-tramline/special-cases/draft-mode.md new file mode 100644 index 0000000..d3ac3e2 --- /dev/null +++ b/docs/using-tramline/special-cases/draft-mode.md @@ -0,0 +1,10 @@ +--- +id: draft-mode +title: App Draft Mode +sidebar_label: App Draft Mode +sidebar_position: 7 +--- + +Users shipping brand new apps to Play Store for the very first time often face issues releasing to public channels. This is because the Play Store requires one to make an initial deploy manually before using the APIs. + +To avoid having the releases fail late after everything is set up, Tramline detect apps that are in Draft mode on the Play Store and disallow making new releases to public tracks until a manual public release is made from the Play Console. diff --git a/docs/using-tramline/special-cases/hotfix.md b/docs/using-tramline/special-cases/hotfix.md new file mode 100644 index 0000000..47e9401 --- /dev/null +++ b/docs/using-tramline/special-cases/hotfix.md @@ -0,0 +1,26 @@ +--- +id: hotfix +title: Hotfixes +sidebar_label: Hotfix +sidebar_position: 1 +--- + +Most people want to avoid hotfixes entirely, but when push comes to shove, you don't want your regular release processes to become shackles. + +This is where hotfix releases come in. By starting a hotfix release, Tramline will: + +- Predict the correct version to be hotfixed +- Initiate a hotfix from a previously completed release branch +- Optionally, initiate a hotfix from a tag, creating a new hotfix branch on top + +Importantly, you can quickly deploy a hotfix release because these releases are special. They allow you to bypass the defined step order, skipping the review steps and going straight to production. + +For [synchronized releases](/using-tramline/release-management/synchronized-release), as is often the case, hotfixes also support releasing only to a single platform to avoid spending time on manually skipping the other platform. + +### Caveat + +Stores can only have a single live build, which means penultimate releases can be hotfixed as long as the latest release hasn't started rolling out. + +In essence, hotfixes are a conceptual abstraction. You are creating a new release instead of directly fixing the previous one, which might still be live. + +It's an abstraction of a process that is manually carried out, and Tramline offers this as an atomic package where the details aren't important to know. diff --git a/docs/using-tramline/special-cases/patchfix.md b/docs/using-tramline/special-cases/patchfix.md new file mode 100644 index 0000000..dad0e12 --- /dev/null +++ b/docs/using-tramline/special-cases/patchfix.md @@ -0,0 +1,6 @@ +--- +id: patchfix +title: Patchfixes +sidebar_label: Patchfix +sidebar_position: 2 +--- diff --git a/docs/using-tramline/special-cases/special-cases.md b/docs/using-tramline/special-cases/special-cases.md new file mode 100644 index 0000000..cd9686f --- /dev/null +++ b/docs/using-tramline/special-cases/special-cases.md @@ -0,0 +1,10 @@ +--- +id: special-cases +title: Special Cases +sidebar_label: Special Cases +sidebar_position: 6 +--- + +import DocCardList from '@theme/DocCardList'; + + diff --git a/docs/using-tramline/using-tramline.md b/docs/using-tramline/using-tramline.md index f091398..066b60b 100644 --- a/docs/using-tramline/using-tramline.md +++ b/docs/using-tramline/using-tramline.md @@ -1,82 +1,10 @@ --- +id: using-tramline +title: πŸ‘©πŸΌβ€πŸ’» Using Tramline +sidebar_label: πŸ‘©πŸΌβ€πŸ’» Using Tramline +sidebar_position: 3 --- -# πŸš€ Using Tramline +import DocCardList from '@theme/DocCardList'; -:::tip -[Contact us](/getting-support) and we'll help you get setup with your release process. -::: - -Once you are signed up, here's how you make your first release. - -## Add your app(s) - -You can add one or more apps for Android or iOS. - -In this example, we add a Flutter app called [Ueno](https://github.com/tramlinehq/ueno) for Android: - -![](/img/create-new-app.png) - -[More on this here](app). - -## Setup integrations - -[Setup](/integrations) and [configure](app-configuration) all the required integrations. - -![](/img/add-integrations-new-app.png) - -## Configure releases - -Create a release train with the appropriate branching strategy. The most basic branching strategy is [Almost Trunk](/branching-strategies). Example train: - -![](/img/sample-train.png) - -To this train, add steps that represent your release process β€” configuring the CI workflows, beta group distributions, and phased rollouts for production releases. - -In this example, we add two steps. - -**Add a review step** - -One creates a staging build, deploys it to a Slack channel, and adds it to an internal group on Play Store. - -![](/img/review-step-short.png) -![](/img/staging-distributions.png) - -**Add the release step** - -The second step runs a CI workflow that generates a production build and pushes it to the production track on Play Store through a staged rollout pattern. - -![](/img/release-step-short.png) -![](/img/prod-distributions.png) - -[Read more about release trains in detail](release-trains). - -## Start a release - -For your created release train, start a release. - -![](/img/start-release.png) - -:::note -You need at least one release step to be able to start a new release. -::: - -The live release page displays the release branch created from the working branch. - -On this page, you can stabilize and oversee the release, manage phased rollouts, submit the app for review, distribute builds to beta users, and implement any extra bug fixes or modifications before eventually launching the production track in the store. - -![](/img/live-release.png) - -[Read more on how to navigate a live release](live-release). - -## Finish up - -Once you've reached the last step of the train, you'd be able to finalize the release. This would typically tag the responsible commit and depending on the branching strategy, it will also automatically create and merge necessary pull requests. - -You'd be able to see all your releases in a single place on the release train page: - -![](/img/previous-release.png) - -:::info -Feel free to continue over to the next few sections to understand the release process in detail. [Contact us](/getting-support) if you need any help. -::: + diff --git a/docs/using-tramline/version-management/build-number-management.md b/docs/using-tramline/version-management/build-number-management.md new file mode 100644 index 0000000..7978848 --- /dev/null +++ b/docs/using-tramline/version-management/build-number-management.md @@ -0,0 +1,6 @@ +--- +id: build-numbers +title: Build Numbers +sidebar_label: Build Numbers +sidebar_position: 2 +--- diff --git a/docs/using-tramline/version-management/version-management.md b/docs/using-tramline/version-management/version-management.md new file mode 100644 index 0000000..ec26bf2 --- /dev/null +++ b/docs/using-tramline/version-management/version-management.md @@ -0,0 +1,10 @@ +--- +id: version-management +title: Version Management +sidebar_label: Version Management +sidebar_position: 3 +--- + +import DocCardList from '@theme/DocCardList'; + + diff --git a/docs/using-tramline/version-management/version-strategies.md b/docs/using-tramline/version-management/version-strategies.md new file mode 100644 index 0000000..dfdc492 --- /dev/null +++ b/docs/using-tramline/version-management/version-strategies.md @@ -0,0 +1,120 @@ +--- +id: version-strategies +title: Version Strategies +sidebar_label: Strategies +sidebar_position: 1 +--- + +Since Tramline [automatically manages versions](automations#bumping-versions-and-build-numbers) for you, we categorize them into specific strategies so that the increments are predictable. There are 3 versioning strategies to choose from. + +:::info +On iOS, the [property](https://developer.apple.com/documentation/bundleresources/information-property-list/cfbundleshortversionstring) `cfbundleshortversionstring` is what Tramline assumes when we're talking about version names. The same property is used to set the PreReleaseVersion or the AppStoreVersion when we'resubmitting to the App Store or TestFlight. +::: + +:::info +On Android, this is the `versionName` [property](https://developer.android.com/studio/publish/versioning#versioningsettings). We use the same value when the release is promoted to a track on the Play Store and the release name is set to the `versionName`. +::: + +### SemVer + +Tramline supports a [SemVer](https://semver.org)-like versioning scheme that's designed to play well with both App Store and Google Play Store. It works like this: + +``` +MAJOR.MINOR.PATCH + +MAJOR = Non-zero-padded sequence number +MINOR = Non-zero-padded sequence number +PATCH = Non-Zero-padded sequence number +``` + +βœ… Valid +``` +1.2.0 +4.2.1 +16.9.2 +``` + +❌ Invalid +``` +1 +1.2.3.4 +1.02.01 +``` + +:::note +To be more precise, the SemVer support is a subset of what the specification allows. This is to ensure that these versions work well with all major platforms. +::: + +### CalVer + +Like SemVer, Tramline supports an opinionated [Calendar-based versioning scheme](https://calver.org) that's designed to play well with both App Store and Google Play Store. It works like this: + +``` +YYYY.0M.0D0N + +YYYY = Full-year +0D = Zero-padded day +0M = Zero-padded month +0N = Zero-padded sequence number +``` + +βœ… Valid +``` +2025.01.20 +2022.02.01 +``` + +❌ Invalid +``` +25.1.20 +25.1.32 +2025.1.1 +``` + +### Partial SemVer + +This is like SemVer, but it allows you to omit the patch number, and only have one numerical identifier after the major number. It works like this: + +``` +MAJOR. + +MAJOR = Non-zero-padded sequence number + = Non-zero-padded sequence number +``` + +βœ… Valid +``` +1.2 +4.2 +16.2 +``` + +❌ Invalid +``` +1 +1.2.3.4 +1.02 +1.2.3 +``` + +Partial SemVer always updates `` part of the version for both a minor bump and patch bump (in case of a [patchfix](/using-tramline/special-cases/patchfix) or a [hotfix](/using-tramline/special-cases/hotfix)). This isn't a full-fledged strategy per se, but rather an omission of the patch number. When you're [setting up your release](/using-tramline/release-management/release-settings), and you omit the patch value, we assume that you want versioning based on partial SemVer. This can technically be overridden if you make a [custom release](/using-tramline/release-management/new-release) with a proper SemVer version. The next release from there on out, will be **not** assume a partial SemVer strategy. + +#### Correcting Versions + +:::tip +Due to the complicated nature of handling versions when Partial SemVer is used, we do not recommend this strategy for most people. +::: + +Partial SemVer introduces some complexities when multiple releases are running in parallel and there are [patchfixes](/using-tramline/special-cases/patchfix) involved. But Tramline takes care of this versioning for you. Take the following example: + + +1. Currently active release: Release 1 (1.2) +2. Patchfix lands on Release 1 β†’ 1.3 +3. New upcoming release starts: Release 2 (1.4) +4. Another patchfix lands on Release 1 β†’ 1.5 + +...and so on and so forth. In other words, Tramline always tries to do the _right thing_ in terms of increments. Even if that means jumping across one version (or multiple) because there's another upcoming release that's actively being worked on. + +:::info +Stores (both Apple and Google) don't particularly support one scheme or another, and neither are they very particular about the adherence to a spec. App Store, for example, suggests a roughly SemVer-like format for build versions and Google Play Store is pretty free-form. +::: diff --git a/docs/using-tramline/working-pane/approvals.md b/docs/using-tramline/working-pane/approvals.md new file mode 100644 index 0000000..2d4d564 --- /dev/null +++ b/docs/using-tramline/working-pane/approvals.md @@ -0,0 +1,28 @@ +--- +id: approvals +title: Approvals +sidebar_label: Approvals +sidebar_position: 6 +--- + +Tramline supports an approvals system that allows you to add high-level approvals from various stakeholders for the release. + +During a release, the release captain can add tasks to be approved by any set of members in the team. When a task is assigned to a team member, they receive an email notification. + +The assignees of the task can mark the task as approved, blocked, or in-progress. The release cannot be sent to the production track on the stores until all the approvals are complete. + +![](/img/approvals-release.png) + +The release captain can choose to override the approvals for a release. This is useful for rare scenarios where there is an urgency in getting the release to production and the team members are unavailable for the required approvals. + +If the override is used, it will be reflected on the release activity page for auditing purposes. + +The configuration to enable approvals for the release can be found in the Advanced Settings of the release. + +![](/img/approvals.png) + +Furthermore, you can add a flag to automatically copy over approval items from the previous release to the next one. This cuts down work for teams who want a similar set of approval items in each release assigned to a bunch of different people. + +Even if you don't have the automatic setting on, you can still copy them over from a single click after the release starts. + +

diff --git a/docs/using-tramline/working-pane/changeset-tracking.md b/docs/using-tramline/working-pane/changeset-tracking.md new file mode 100644 index 0000000..9850ef5 --- /dev/null +++ b/docs/using-tramline/working-pane/changeset-tracking.md @@ -0,0 +1,17 @@ +--- +id: changeset-tracking +title: Changeset Tracking +sidebar_label: Changeset Tracking +sidebar_position: 2 +--- + +There is one dedicated page to track all the commits, PRs and changes going into the release. +There are five sections to this page: + +1. **Changes since last release** - all the commits since the last completed release (ongoing in case of upcoming release). +2. **Ongoing work** - The all PRs open against your release branch. +3. **Change queue** - All the changes that have not yet been applied to the release. +4. **Latest applied commits** - The changes that have been applied to the release and a build has been generated that includes all of them. +5. **Pending backmerges** - Continuous backmerge PRs for each of the release branch changes that are not yet merged to the working branch. + +There is a flow of change from Ongoing work ➑ Change queue ➑ Latest applied commits. diff --git a/docs/using-tramline/working-pane/finalization.md b/docs/using-tramline/working-pane/finalization.md new file mode 100644 index 0000000..7b9f41f --- /dev/null +++ b/docs/using-tramline/working-pane/finalization.md @@ -0,0 +1,16 @@ +--- +id: finalization +title: Finalizing the Release +sidebar_label: Finalizing the Release +sidebar_position: 8 +--- + +Once the build has been successfully distributed to all channels in the release step, you can finalize your release. + + + +This would typically tag the correct release commit, and depending on the branching strategy, it will also automatically create and merge necessary pull requests. + +Once a release is finalized, it becomes locked and is unable to accept any further patches or commits. + + diff --git a/docs/using-tramline/working-pane/metadata.md b/docs/using-tramline/working-pane/metadata.md new file mode 100644 index 0000000..d3de208 --- /dev/null +++ b/docs/using-tramline/working-pane/metadata.md @@ -0,0 +1,15 @@ +--- +id: metadata +title: Notes and Metadata +sidebar_label: Notes and Metadata +sidebar_position: 4 +--- + +You can update release-related metadata prior to initiating your production store release. These details can be modified anytime between the beginning of the release and the commencement of a production deployment, as the metadata will be uploaded to the store during the production deployment process. + +- Release notes +- Promotional text (**iOS** only) + +Tramline will add some sensible defaults for these for your benefit. + + diff --git a/docs/using-tramline/working-pane/overview.md b/docs/using-tramline/working-pane/overview.md new file mode 100644 index 0000000..80ed5c1 --- /dev/null +++ b/docs/using-tramline/working-pane/overview.md @@ -0,0 +1,20 @@ +--- +id: overview +title: Overview +sidebar_label: Overview +sidebar_position: 1 +--- + +This tab of the work pane is the default starting tab when the release starts or once it is finished. It summarizes all the information about the release. This summary is dynamic while the release is in progress, but remains frozen once the release is completed. + +## Release Captain + +The person who starts the release is assigned the β€œRelease Captain” and has some special abilities throughout the release like recording anything of note for the release in Captain’s log and overriding approvals to unblock production release. + +Release Captain can also log any special notes around the release in the Captain’s log. This can be used to record any special events or notes for the release for posterity. These notes are completely internal and never shared or posted to any other integration outside of Tramline. + +## Branch cut + +As soon the release is started, a new branch is created from the main branch. This branch is named after the release and is used for all the work related to the release. + +Depending on your [branching strategy](/using-tramline/release-management/branching-strategies) used, the release branch might be a long-running branch or a special branch created just for that particular release. diff --git a/docs/using-tramline/working-pane/screenshots.md b/docs/using-tramline/working-pane/screenshots.md new file mode 100644 index 0000000..f50381b --- /dev/null +++ b/docs/using-tramline/working-pane/screenshots.md @@ -0,0 +1,12 @@ +--- +id: screenshots +title: Screenshots +sidebar_label: Screenshots +sidebar_position: 5 +--- + +:::info + +Screenshots are not yet supported. They are coming soon! + +::: diff --git a/docs/using-tramline/working-pane/stability.md b/docs/using-tramline/working-pane/stability.md new file mode 100644 index 0000000..b84b68b --- /dev/null +++ b/docs/using-tramline/working-pane/stability.md @@ -0,0 +1,55 @@ +--- +id: stability +title: Stability +sidebar_label: Stability +sidebar_position: 3 +--- + +There are a few things Tramline does as soon as the release starts: +- It creates a release branch off of your working branch (or starts tracking the long running release branch based on the branching strategy). +- It starts the first step in your release process and triggers the CI workflow for that step whether that is creating an internal build or an RC build. + +## Internal builds + +Internal Builds are always automatically created and distributed to relevant internal testing channels. + +![](/img/internal-builds.png) + +It's common to add bug fixes and sometimes even small new features to a release after the release branch has been created. When a new commit lands on the release branch of your app, Tramline will re-create the internal build for the latest commit on the release branch. + +A single release may generate multiple internal builds during the process of stabilizing the release. + +![](/img/previous-internal-builds.png) + +Each build shows the commit it was generated from, as well as, the **changes since the last build**. + +![](/img/changes-since-last-build.png) + + +Once the internal build is approved, you can create a Release Candidate for the last commit that internal build was created for. Tramline will show a banner to **Create release candidate** in the Release Candidate tab. + +## Release candidates + +Release Candidates are the penultimate step of the release process before production release can begin. Creation of an RC is mandatory for the store release to start. + +The RC creation works differently based on whether an internal build step is defined or not. + +If there an internal build step, an option to create the RC becomes available once a valid internal build is created and sent to the internal testing channels. + +![](/img/manual-rc-creation.png) + +If there is no internal build step, the RC creation will be triggered automatically when the release starts. + +Once an RC is created, that RC is then sent to any beta submission channels that are configured. This submission can happen automatically or manually based on the [submission settings](/using-tramline/release-management/release-settings#beta-testing-configuration). + +![](/img/submission-auto-promote.png) + +Once the RC is sent to all the beta submission channels, the release is considered to be in beta and the store release process can start. + +If new changes are made to the release branch after the release is in beta, you will see a banner showing the new change and the option to **create a new RC**. + +![](/img/new-change-rc.png) + +You can choose to ignore the change and continue the production release with the existing RC, if needed. + +Once the beta testing is progress, you can start preparing the store release. diff --git a/docs/using-tramline/working-pane/store-releases.md b/docs/using-tramline/working-pane/store-releases.md new file mode 100644 index 0000000..3fe7adf --- /dev/null +++ b/docs/using-tramline/working-pane/store-releases.md @@ -0,0 +1,60 @@ +--- +id: store-releases +title: Store Releases +sidebar_label: Store Releases +sidebar_position: 7 +--- + +The production release across both stores in handled by Tramline slightly differently due to the different processes of these stores. + +### iOS + +If your release step has a production channel, you are presented with: + + + +When you start the release step, Tramline automatically creates an inflight release on the App Store and assigns the correct build to the that release. Once the release is prepared, you have to submit the app for review. + + + +Once you have submitted the app for review, you can track its progress on the right: + + + +:::info +This widget above will always show the latest status of of the release on TestFlight or App Store. +::: + +Once the review is approved by Apple, you can start the release of the build from Tramline. + + + +If there is no phased release enabled, your release is **complete**! πŸŽ‰ + +#### Phased release + +If you have production release with a phased release, you will be presented with controls to start the phased release. + + + +Once the rollout is started, you can **pause** (and **resume**) the rollout, **halt** it, or, release to **all the users** right away if you confident about your release. + +### Android + +If your release step has a production channel, you are presented with: + + + +When you start, Tramline creates a release in Play Store. It also automatically promotes the release on the **production track**. + +If there is no staged rollout enabled, your release is **complete**! πŸŽ‰ + +#### Staged rollout + +If you have a production release with staged rollout, you will be presented with controls to navigate your staged rollout. + + + +Once the rollout is started, you can **increase** the rollout, **halt** it, or, release to **all the users** right away if you confident about your release. + + diff --git a/docs/using-tramline/working-pane/working-pane.md b/docs/using-tramline/working-pane/working-pane.md new file mode 100644 index 0000000..65b8452 --- /dev/null +++ b/docs/using-tramline/working-pane/working-pane.md @@ -0,0 +1,27 @@ +--- +id: working-pane +title: Working Pane +sidebar_label: Working Pane +sidebar_position: 2 +--- + +import DocCardList from '@theme/DocCardList'; + +When you start a new release, this page is your work pane. Everything about the current release is controlled from right here. You will likely spend most of your time in Tramline here. + +This is what a typical successful release in Tramline looks like: + +![](/img/live-release.png) + +The work pane is auto-structured into four main sections: + +1. *Kickoff*: Overview, changeset tracking and the homepage for the Release Captain. +2. *Stability*: Internal builds, Release Candidates, testing (coming soon). +3. *Metadata*: Dedicated space for updating notes, store metadata. +4. *Store Release*: Managing reviews and rolling out to production. + +The tabs are alive β€” they always track the current state of that section β€” whether it's in progress, completed or pending. They also automatically get switched over to the most important tab in the current release. + +## Jump to + + diff --git a/docusaurus.config.js b/docusaurus.config.js index f5813e3..5459984 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -1,203 +1,212 @@ // @ts-check // Note: type annotations allow type checking and IDEs autocompletion -const lightCodeTheme = require('prism-react-renderer/themes/github'); -const darkCodeTheme = require('prism-react-renderer/themes/dracula'); +const lightCodeTheme = require("prism-react-renderer/themes/github"); +const darkCodeTheme = require("prism-react-renderer/themes/dracula"); /** @type {import('@docusaurus/types').Config} */ const config = { - title: 'Tramline Documentation', - tagline: 'Release engineering for mobile apps.', - url: 'https://docs.tramline.app', - baseUrl: '/', - onBrokenLinks: 'throw', - onBrokenMarkdownLinks: 'warn', - favicon: 'img/favicon.ico', + title: "Tramline Documentation", + tagline: "Release engineering for mobile apps.", + url: "https://docs.tramline.app", + baseUrl: "/", + onBrokenLinks: "throw", + onBrokenMarkdownLinks: "warn", + favicon: "img/favicon.ico", - // Even if you don't use internalization, you can use this field to set useful - // metadata like html lang. For example, if your site is Chinese, you may want - // to replace "en" with "zh-Hans". - i18n: { - defaultLocale: 'en', - locales: ['en'], + // Even if you don't use internalization, you can use this field to set useful + // metadata like html lang. For example, if your site is Chinese, you may want + // to replace "en" with "zh-Hans". + i18n: { + defaultLocale: "en", + locales: ["en"], + }, + + scripts: [ + { + src: "https://plausible.io/js/script.js", + defer: true, + "data-domain": "docs.tramline.app", }, + ], - scripts: [ - {src: 'https://plausible.io/js/script.js', defer: true, 'data-domain': 'docs.tramline.app'} - ], + markdown: { + mermaid: true, + }, + themes: ["@docusaurus/theme-mermaid"], - presets: [ - [ - 'classic', - /** @type {import('@docusaurus/preset-classic').Options} */ - ({ - docs: { - routeBasePath: '/', - sidebarPath: require.resolve('./sidebars.js'), - editUrl: - 'https://github.com/tramlinehq/docs/tree/main', - }, - blog: false, - theme: { - customCss: require.resolve('./src/css/custom.css'), - }, - }), - ], + presets: [ + [ + "classic", + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + routeBasePath: "/", + sidebarPath: require.resolve("./sidebars.js"), + editUrl: "https://github.com/tramlinehq/docs/tree/main", + }, + blog: false, + theme: { + customCss: require.resolve("./src/css/custom.css"), + }, + }), ], + ], - stylesheets: [ - 'https://use.typekit.net/jke0quu.css', - ], + stylesheets: ["https://use.typekit.net/jke0quu.css"], - plugins: [ - require.resolve('docusaurus-plugin-image-zoom'), - [ - require.resolve('./src/plugins/changelog/index.js'), - { - blogTitle: 'Changelog', - blogDescription: - 'Keep yourself up-to-date about new features in every release', - blogSidebarCount: 'ALL', - blogSidebarTitle: ' ', - routeBasePath: '/changelog', - showReadingTime: false, - postsPerPage: 20, - archiveBasePath: null, - authorsMapPath: 'authors.json', - feedOptions: { - type: 'all', - title: 'Tramline Changelog', - description: - 'Keep yourself up-to-date about new features in every release', - copyright: `Copyright Β© ${new Date().getFullYear()} Tramline, Inc.`, - language: "en-US", - }, + plugins: [ + require.resolve("docusaurus-plugin-image-zoom"), + [ + require.resolve("./src/plugins/changelog/index.js"), + { + blogTitle: "Changelog", + blogDescription: + "Keep yourself up-to-date about new features in every release", + blogSidebarCount: "ALL", + blogSidebarTitle: " ", + routeBasePath: "/changelog", + showReadingTime: false, + postsPerPage: 20, + archiveBasePath: null, + authorsMapPath: "authors.json", + feedOptions: { + type: "all", + title: "Tramline Changelog", + description: + "Keep yourself up-to-date about new features in every release", + copyright: `Copyright Β© ${new Date().getFullYear()} Tramline, Inc.`, + language: "en-US", }, - ], -], + }, + ], + ], - themeConfig: + themeConfig: /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ - ({ - docs: { - sidebar: { - hideable: false - }, - }, - navbar: { - title: 'Tramline Documentation', - logo: { - alt: 'Logo', - src: 'img/tramline-logo-light-mode.png', - srcDark: 'img/tramline-logo-dark-mode.png' - }, - items: [ - { - to: 'changelog', - label: 'Changelog', - position: 'right' - }, - { - href: 'https://tramline.app', - label: 'Website', - position: 'right', - }, - { - href: 'https://tramline.dev', - label: 'Dashboard', - position: 'right', - }, - ], - }, - footer: { - style: 'dark', - logo: { - alt: 'Tramline Logo', - src: 'img/tramline-logo-dark-mode.png', - href: 'https://tramline.app', - }, - links: [ - { - title: 'Community', - items: [ - { - label: 'GitHub', - href: 'https://github.com/tramlinehq', - }, - { - label: 'Discord', - href: 'https://go.tramline.app/discord', - }, - { - label: 'Newsletter', - href: 'https://tramline.substack.com', - }, - - ], - }, - { - title: 'Company', - items: [ - { - label: 'About', - href: 'https://www.tramline.app/about', - }, - { - label: 'Security', - href: 'https://github.com/tramlinehq/tramline/security/policy', - }, - { - label: 'Privacy Policy', - href: 'https://www.tramline.app/privacy', - } - ], - }, - { - title: 'Contact', - items: [ - { - label: 'Twitter', - href: 'https://twitter.com/tramlinehq', - }, - { - label: 'LinkedIn', - href: 'https://www.linkedin.com/company/tramline', - }, - { - label: 'Mastodon', - href: 'https://fosstodon.org/@tramline', - } - ], - } - ], - copyright: `Copyright Β© ${new Date().getFullYear()} Tramline Inc. Built with Docusaurus.`, - }, - prism: { - theme: lightCodeTheme, - darkTheme: darkCodeTheme, - }, - zoom: { - selector: '.markdown :not(em) > img', - background: { - light: 'rgb(255, 255, 255)', - dark: 'rgb(50, 50, 50)' + ({ + mermaid: { + theme: { light: "neutral", dark: "dark" }, + }, + docs: { + sidebar: { + hideable: false, + autoCollapseCategories: true, + }, + }, + navbar: { + title: "Tramline Documentation", + logo: { + alt: "Logo", + src: "img/tramline-logo-light-mode.png", + srcDark: "img/tramline-logo-dark-mode.png", + }, + items: [ + { + to: "changelog", + label: "Changelog", + position: "right", + }, + { + href: "https://tramline.app", + label: "Website", + position: "right", + }, + { + href: "https://tramline.dev", + label: "Dashboard", + position: "right", + }, + ], + }, + footer: { + style: "dark", + logo: { + alt: "Tramline Logo", + src: "img/tramline-logo-dark-mode.png", + href: "https://tramline.app", + }, + links: [ + { + title: "Community", + items: [ + { + label: "GitHub", + href: "https://github.com/tramlinehq", }, - config: { - // options you can specify via https://github.com/francoischalifour/medium-zoom#usage - } - }, - algolia: { - // The application ID provided by Algolia - appId: '888WUN47GN', + { + label: "Discord", + href: "https://go.tramline.app/discord", + }, + { + label: "Newsletter", + href: "https://tramline.substack.com", + }, + ], + }, + { + title: "Company", + items: [ + { + label: "About", + href: "https://www.tramline.app/about", + }, + { + label: "Security", + href: "https://github.com/tramlinehq/tramline/security/policy", + }, + { + label: "Privacy Policy", + href: "https://www.tramline.app/privacy", + }, + ], + }, + { + title: "Contact", + items: [ + { + label: "Twitter", + href: "https://twitter.com/tramlinehq", + }, + { + label: "LinkedIn", + href: "https://www.linkedin.com/company/tramline", + }, + { + label: "Mastodon", + href: "https://fosstodon.org/@tramline", + }, + ], + }, + ], + copyright: `Copyright Β© ${new Date().getFullYear()} Tramline Inc. Built with Docusaurus.`, + }, + prism: { + theme: lightCodeTheme, + darkTheme: darkCodeTheme, + }, + zoom: { + selector: ".markdown :not(em) > img", + background: { + light: "rgb(255, 255, 255)", + dark: "rgb(50, 50, 50)", + }, + config: { + // options you can specify via https://github.com/francoischalifour/medium-zoom#usage + }, + }, + algolia: { + // The application ID provided by Algolia + appId: "888WUN47GN", - // Public API key: it is safe to commit it - apiKey: '5bc99c8530cbba38f870e2488575a154', + // Public API key: it is safe to commit it + apiKey: "5bc99c8530cbba38f870e2488575a154", - indexName: 'tramline', + indexName: "tramline", - contextualSearch: true, - }, - }), + contextualSearch: true, + }, + }), }; module.exports = config; diff --git a/package.json b/package.json index f80fcf4..9b7fd48 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "@docusaurus/core": "^2.4.1", "@docusaurus/plugin-content-blog": "^2.4.1", "@docusaurus/preset-classic": "^2.4.1", + "@docusaurus/theme-mermaid": "^2.4.1", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "docusaurus-plugin-image-zoom": "^1.0.1", diff --git a/src/css/custom.css b/src/css/custom.css index 5216826..4bab77a 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -15,13 +15,31 @@ --ifm-color-primary-lightest: #f6ffdb; --ifm-breadcrumb-item-background-active: #f4f4f4; --ifm-code-font-size: 90%; - --ifm-font-size-base: 16px; - --ifm-font-family-base: objektiv-mk1, sans-serif; + --ifm-font-size-base: 1rem; + --ifm-font-weight-base: 400; + --ifm-font-weight-bold: 600; + --ifm-font-family-base: sarvatrik-latin-variable, sans-serif; --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); + --changelog-item-bg: url("data:image/svg+xml,%3Csvg width='12' height='2' viewBox='0 0 14 1' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cline y1='0.5' x2='14' y2='0.5' stroke='%235E6AD2'/%3E%3C/svg%3E%0A"); +} + +p code, +li code, +td code { + padding: 0px 4px; + display: inline-flex; + justify-content: center; + align-items: center; + border: 0.05rem solid rgba(0, 0, 0, 0.1); + border-color: rgba(0, 0, 0, 0.1); + background-color: var(--ifm-code-background); + border-radius: 0.2rem; + font-size: 0.875em; + line-height: calc(max(1.2em, 1.25rem)); } /* For readability concerns, you should choose a lighter palette in dark mode. */ -[data-theme='dark'] { +[data-theme="dark"] { --ifm-color-primary: #25c2a0; --ifm-color-primary-dark: #21af90; --ifm-color-primary-darker: #1fa588; @@ -94,7 +112,6 @@ /* smaller screens */ @media only screen and (max-width: 996px) { - /* fix the navbar */ .navbar .navbar__title { font-size: 12px; @@ -123,7 +140,6 @@ /* adjust overall spacing between things */ @media screen and (min-width: 780px) { - /* fix the navbar */ .navbar .navbar__title { font-size: 15px; @@ -136,8 +152,11 @@ h1 { font-size: 2.6rem; } -} + .theme-doc-sidebar-container { + margin-bottom: 2rem; + } +} /* adjust overall spacing between things */ @media screen and (min-width: 996px) { @@ -152,7 +171,6 @@ /* for large screens */ @media (min-width: 1416px) { - /* reduce container width */ .main-wrapper { max-width: 1400px; @@ -166,6 +184,7 @@ } } +/* changelog */ .changelog-item-override { border-bottom: 1px dashed lightgrey; margin-top: 3rem; @@ -183,7 +202,7 @@ .changelog-item-override .markdown li { margin: 0px 0px 8px; list-style: none; - background-image: url("data:image/svg+xml,%3Csvg width='12' height='2' viewBox='0 0 14 1' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cline y1='0.5' x2='14' y2='0.5' stroke='%235E6AD2'/%3E%3C/svg%3E%0A"); + background-image: var(--changelog-item-bg); background-repeat: no-repeat; background-position: 0px 0.8em; padding-left: 22px; @@ -191,4 +210,22 @@ [class^="sidebarItemList"] { text-align: right; -} \ No newline at end of file +} + +/* add borders to images, ignore the changelog images */ +.markdown img { + padding: 8px; + border: 1px solid #e0e0e0; + border-radius: 4px; +} + +.docusaurus-content img { + padding: 8px; + border: 1px solid #e0e0e0; + border-radius: 4px; +} + +.changelog-item-override img { + padding: 0px; + border: none; +} diff --git a/static/img/add-first-app.png b/static/img/add-first-app.png new file mode 100644 index 0000000..b736545 Binary files /dev/null and b/static/img/add-first-app.png differ diff --git a/static/img/add-member.png b/static/img/add-member.png index b60d75a..1389e64 100644 Binary files a/static/img/add-member.png and b/static/img/add-member.png differ diff --git a/static/img/add-new-app.png b/static/img/add-new-app.png deleted file mode 100644 index ea91547..0000000 Binary files a/static/img/add-new-app.png and /dev/null differ diff --git a/static/img/android-staged-rollout-not-started.png b/static/img/android-staged-rollout-not-started.png deleted file mode 100644 index 9018abe..0000000 Binary files a/static/img/android-staged-rollout-not-started.png and /dev/null differ diff --git a/static/img/android-staged-rollout-started.png b/static/img/android-staged-rollout-started.png deleted file mode 100644 index 488bbe6..0000000 Binary files a/static/img/android-staged-rollout-started.png and /dev/null differ diff --git a/static/img/android-staged-rollout.png b/static/img/android-staged-rollout.png new file mode 100644 index 0000000..f75b26f Binary files /dev/null and b/static/img/android-staged-rollout.png differ diff --git a/static/img/android-start-release.png b/static/img/android-start-release.png deleted file mode 100644 index 33a9f67..0000000 Binary files a/static/img/android-start-release.png and /dev/null differ diff --git a/static/img/api-settings.png b/static/img/api-settings.png index dbfd391..facec65 100644 Binary files a/static/img/api-settings.png and b/static/img/api-settings.png differ diff --git a/static/img/apply-build-queue.png b/static/img/apply-build-queue.png new file mode 100644 index 0000000..6c2cc6b Binary files /dev/null and b/static/img/apply-build-queue.png differ diff --git a/static/img/approvals-actions.png b/static/img/approvals-actions.png new file mode 100644 index 0000000..1cf0268 Binary files /dev/null and b/static/img/approvals-actions.png differ diff --git a/static/img/approvals-release.png b/static/img/approvals-release.png new file mode 100644 index 0000000..9fd9b6c Binary files /dev/null and b/static/img/approvals-release.png differ diff --git a/static/img/approvals.png b/static/img/approvals.png new file mode 100644 index 0000000..0acb028 Binary files /dev/null and b/static/img/approvals.png differ diff --git a/static/img/branching-atrunk.png b/static/img/branching-atrunk.png index e991b6a..672b8e4 100644 Binary files a/static/img/branching-atrunk.png and b/static/img/branching-atrunk.png differ diff --git a/static/img/branching-pwr.png b/static/img/branching-pwr.png index adc8787..fb6a9fe 100644 Binary files a/static/img/branching-pwr.png and b/static/img/branching-pwr.png differ diff --git a/static/img/branching-rbm.png b/static/img/branching-rbm.png index fa7b3c1..bff0596 100644 Binary files a/static/img/branching-rbm.png and b/static/img/branching-rbm.png differ diff --git a/static/img/build-queue.png b/static/img/build-queue.png new file mode 100644 index 0000000..179d99e Binary files /dev/null and b/static/img/build-queue.png differ diff --git a/static/img/cascading-rollout-99.png b/static/img/cascading-rollout-99.png new file mode 100644 index 0000000..d6091cf Binary files /dev/null and b/static/img/cascading-rollout-99.png differ diff --git a/static/img/cascading-rollout-config.png b/static/img/cascading-rollout-config.png new file mode 100644 index 0000000..4628411 Binary files /dev/null and b/static/img/cascading-rollout-config.png differ diff --git a/static/img/cascading-rollout-prompt.png b/static/img/cascading-rollout-prompt.png new file mode 100644 index 0000000..09db610 Binary files /dev/null and b/static/img/cascading-rollout-prompt.png differ diff --git a/static/img/changes-since-last-build.png b/static/img/changes-since-last-build.png new file mode 100644 index 0000000..f5dae3c Binary files /dev/null and b/static/img/changes-since-last-build.png differ diff --git a/static/img/create-new-app.png b/static/img/create-new-app.png index d4b594c..98e8752 100644 Binary files a/static/img/create-new-app.png and b/static/img/create-new-app.png differ diff --git a/static/img/create-new-train.png b/static/img/create-new-train.png new file mode 100644 index 0000000..19efecd Binary files /dev/null and b/static/img/create-new-train.png differ diff --git a/static/img/cross-platform-release-example.png b/static/img/cross-platform-release-example.png new file mode 100644 index 0000000..4a23588 Binary files /dev/null and b/static/img/cross-platform-release-example.png differ diff --git a/static/img/distributions.png b/static/img/distributions.png deleted file mode 100644 index 61e065e..0000000 Binary files a/static/img/distributions.png and /dev/null differ diff --git a/static/img/dropdown.png b/static/img/dropdown.png deleted file mode 100644 index 4c142f5..0000000 Binary files a/static/img/dropdown.png and /dev/null differ diff --git a/static/img/enable-notifications.png b/static/img/enable-notifications.png new file mode 100644 index 0000000..9bf5f5e Binary files /dev/null and b/static/img/enable-notifications.png differ diff --git a/static/img/finalize.png b/static/img/finalize.png deleted file mode 100644 index a270e27..0000000 Binary files a/static/img/finalize.png and /dev/null differ diff --git a/static/img/finish-integration-configuration.png b/static/img/finish-integration-configuration.png new file mode 100644 index 0000000..aef5d1b Binary files /dev/null and b/static/img/finish-integration-configuration.png differ diff --git a/static/img/finish-release.png b/static/img/finish-release.png deleted file mode 100644 index cf329b2..0000000 Binary files a/static/img/finish-release.png and /dev/null differ diff --git a/static/img/intercom-support-location.png b/static/img/intercom-support-location.png deleted file mode 100644 index 93139de..0000000 Binary files a/static/img/intercom-support-location.png and /dev/null differ diff --git a/static/img/internal-builds.png b/static/img/internal-builds.png new file mode 100644 index 0000000..1f78eab Binary files /dev/null and b/static/img/internal-builds.png differ diff --git a/static/img/invite-team.png b/static/img/invite-team.png new file mode 100644 index 0000000..8f6afe7 Binary files /dev/null and b/static/img/invite-team.png differ diff --git a/static/img/ios-phased-release-started.png b/static/img/ios-phased-release-started.png deleted file mode 100644 index 381fb07..0000000 Binary files a/static/img/ios-phased-release-started.png and /dev/null differ diff --git a/static/img/ios-staged-rollout.png b/static/img/ios-staged-rollout.png index ca04048..b61e526 100644 Binary files a/static/img/ios-staged-rollout.png and b/static/img/ios-staged-rollout.png differ diff --git a/static/img/ios-start-release.png b/static/img/ios-start-release.png deleted file mode 100644 index eb2e94c..0000000 Binary files a/static/img/ios-start-release.png and /dev/null differ diff --git a/static/img/live-release.png b/static/img/live-release.png index 2c69c63..3f3a924 100644 Binary files a/static/img/live-release.png and b/static/img/live-release.png differ diff --git a/static/img/manual-rc-creation.png b/static/img/manual-rc-creation.png new file mode 100644 index 0000000..5e9cae8 Binary files /dev/null and b/static/img/manual-rc-creation.png differ diff --git a/static/img/new-change-rc.png b/static/img/new-change-rc.png new file mode 100644 index 0000000..7009cde Binary files /dev/null and b/static/img/new-change-rc.png differ diff --git a/static/img/new-train.png b/static/img/new-train.png deleted file mode 100644 index 5a27b84..0000000 Binary files a/static/img/new-train.png and /dev/null differ diff --git a/static/img/notifications-list.png b/static/img/notifications-list.png new file mode 100644 index 0000000..f296429 Binary files /dev/null and b/static/img/notifications-list.png differ diff --git a/static/img/ongoing-work.png b/static/img/ongoing-work.png new file mode 100644 index 0000000..92e3634 Binary files /dev/null and b/static/img/ongoing-work.png differ diff --git a/static/img/ongoing.png b/static/img/ongoing.png deleted file mode 100644 index 1c6c22b..0000000 Binary files a/static/img/ongoing.png and /dev/null differ diff --git a/static/img/org-settings.png b/static/img/org-settings.png deleted file mode 100644 index ff5b841..0000000 Binary files a/static/img/org-settings.png and /dev/null differ diff --git a/static/img/organization-settings-dropdown.png b/static/img/organization-settings-dropdown.png new file mode 100644 index 0000000..6b166a8 Binary files /dev/null and b/static/img/organization-settings-dropdown.png differ diff --git a/static/img/prepare-new-release-button.png b/static/img/prepare-new-release-button.png new file mode 100644 index 0000000..64c3023 Binary files /dev/null and b/static/img/prepare-new-release-button.png differ diff --git a/static/img/prepare-new-release.png b/static/img/prepare-new-release.png new file mode 100644 index 0000000..40102da Binary files /dev/null and b/static/img/prepare-new-release.png differ diff --git a/static/img/previous-internal-builds.png b/static/img/previous-internal-builds.png new file mode 100644 index 0000000..9bfcfb5 Binary files /dev/null and b/static/img/previous-internal-builds.png differ diff --git a/static/img/previous-release.png b/static/img/previous-release.png deleted file mode 100644 index b6f8731..0000000 Binary files a/static/img/previous-release.png and /dev/null differ diff --git a/static/img/prod-distributions.png b/static/img/prod-distributions.png deleted file mode 100644 index 28e56e7..0000000 Binary files a/static/img/prod-distributions.png and /dev/null differ diff --git a/static/img/release-metadata.png b/static/img/release-metadata.png deleted file mode 100644 index e6fa629..0000000 Binary files a/static/img/release-metadata.png and /dev/null differ diff --git a/static/img/release-step-short.png b/static/img/release-step-short.png deleted file mode 100644 index afe2f51..0000000 Binary files a/static/img/release-step-short.png and /dev/null differ diff --git a/static/img/release-step.png b/static/img/release-step.png deleted file mode 100644 index ec52fb6..0000000 Binary files a/static/img/release-step.png and /dev/null differ diff --git a/static/img/review-step-short.png b/static/img/review-step-short.png deleted file mode 100644 index 1622305..0000000 Binary files a/static/img/review-step-short.png and /dev/null differ diff --git a/static/img/review-step.png b/static/img/review-step.png deleted file mode 100644 index 0348037..0000000 Binary files a/static/img/review-step.png and /dev/null differ diff --git a/static/img/review-steps.png b/static/img/review-steps.png deleted file mode 100644 index d1926d0..0000000 Binary files a/static/img/review-steps.png and /dev/null differ diff --git a/static/img/sample-train.png b/static/img/sample-train.png deleted file mode 100644 index 548dc04..0000000 Binary files a/static/img/sample-train.png and /dev/null differ diff --git a/static/img/scheduled-release-auto-stop.png b/static/img/scheduled-release-auto-stop.png new file mode 100644 index 0000000..abfa454 Binary files /dev/null and b/static/img/scheduled-release-auto-stop.png differ diff --git a/static/img/scheduled-release-config.png b/static/img/scheduled-release-config.png new file mode 100644 index 0000000..50959c6 Binary files /dev/null and b/static/img/scheduled-release-config.png differ diff --git a/static/img/scheduled-release.png b/static/img/scheduled-release.png new file mode 100644 index 0000000..ee52d91 Binary files /dev/null and b/static/img/scheduled-release.png differ diff --git a/static/img/setup-first-release.png b/static/img/setup-first-release.png new file mode 100644 index 0000000..fb884d5 Binary files /dev/null and b/static/img/setup-first-release.png differ diff --git a/static/img/setup-integrations.png b/static/img/setup-integrations.png new file mode 100644 index 0000000..fa624e1 Binary files /dev/null and b/static/img/setup-integrations.png differ diff --git a/static/img/sso-login.png b/static/img/sso-login.png new file mode 100644 index 0000000..155921d Binary files /dev/null and b/static/img/sso-login.png differ diff --git a/static/img/sso-team.png b/static/img/sso-team.png new file mode 100644 index 0000000..2cfaade Binary files /dev/null and b/static/img/sso-team.png differ diff --git a/static/img/staged-rollout.png b/static/img/staged-rollout.png deleted file mode 100644 index a9cce3d..0000000 Binary files a/static/img/staged-rollout.png and /dev/null differ diff --git a/static/img/staging-distributions.png b/static/img/staging-distributions.png deleted file mode 100644 index 212f7f7..0000000 Binary files a/static/img/staging-distributions.png and /dev/null differ diff --git a/static/img/standard-steps.png b/static/img/standard-steps.png deleted file mode 100644 index 569dae8..0000000 Binary files a/static/img/standard-steps.png and /dev/null differ diff --git a/static/img/start-release.png b/static/img/start-release.png deleted file mode 100644 index b01eba3..0000000 Binary files a/static/img/start-release.png and /dev/null differ diff --git a/static/img/step-movement.png b/static/img/step-movement.png deleted file mode 100644 index fc5ea62..0000000 Binary files a/static/img/step-movement.png and /dev/null differ diff --git a/static/img/submission-auto-promote.png b/static/img/submission-auto-promote.png new file mode 100644 index 0000000..1be2a4a Binary files /dev/null and b/static/img/submission-auto-promote.png differ diff --git a/static/img/submission-settings.png b/static/img/submission-settings.png new file mode 100644 index 0000000..b5614f5 Binary files /dev/null and b/static/img/submission-settings.png differ diff --git a/static/img/submit-for-review.png b/static/img/submit-for-review.png deleted file mode 100644 index f032094..0000000 Binary files a/static/img/submit-for-review.png and /dev/null differ diff --git a/static/img/submitted-for-review-2.png b/static/img/submitted-for-review-2.png deleted file mode 100644 index 01ba393..0000000 Binary files a/static/img/submitted-for-review-2.png and /dev/null differ diff --git a/static/img/submitted-for-review.png b/static/img/submitted-for-review.png deleted file mode 100644 index bf2d9a9..0000000 Binary files a/static/img/submitted-for-review.png and /dev/null differ diff --git a/static/img/support-location.png b/static/img/support-location.png new file mode 100644 index 0000000..97c2b63 Binary files /dev/null and b/static/img/support-location.png differ diff --git a/static/img/team-management.png b/static/img/team-management.png new file mode 100644 index 0000000..881a87b Binary files /dev/null and b/static/img/team-management.png differ diff --git a/static/img/team-members-actions.png b/static/img/team-members-actions.png new file mode 100644 index 0000000..44cc4dd Binary files /dev/null and b/static/img/team-members-actions.png differ diff --git a/static/img/team-members.png b/static/img/team-members.png new file mode 100644 index 0000000..377921b Binary files /dev/null and b/static/img/team-members.png differ diff --git a/static/img/team.png b/static/img/team.png deleted file mode 100644 index 9fdf9b4..0000000 Binary files a/static/img/team.png and /dev/null differ diff --git a/static/img/train-details.png b/static/img/train-details.png deleted file mode 100644 index 6e7f0f2..0000000 Binary files a/static/img/train-details.png and /dev/null differ diff --git a/static/img/upcoming-release-section.png b/static/img/upcoming-release-section.png new file mode 100644 index 0000000..9537514 Binary files /dev/null and b/static/img/upcoming-release-section.png differ diff --git a/static/img/user-settings.png b/static/img/user-settings.png new file mode 100644 index 0000000..b444e3a Binary files /dev/null and b/static/img/user-settings.png differ diff --git a/yarn.lock b/yarn.lock index b507e77..4021905 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1220,6 +1220,11 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@braintree/sanitize-url@^6.0.0": + version "6.0.4" + resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783" + integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A== + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -1572,6 +1577,20 @@ use-sync-external-store "^1.2.0" utility-types "^3.10.0" +"@docusaurus/theme-mermaid@^2.4.1": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-mermaid/-/theme-mermaid-2.4.3.tgz#b40194fb4f46813a18d1350a188d43b68a8192dd" + integrity sha512-S1tZ3xpowtFiTrpTKmvVbRHUYGOlEG5CnPzWlO4huJT1sAwLR+pD6f9DYUlPv2+9NezF3EfUrUyW9xLH0UP58w== + dependencies: + "@docusaurus/core" "2.4.3" + "@docusaurus/module-type-aliases" "2.4.3" + "@docusaurus/theme-common" "2.4.3" + "@docusaurus/types" "2.4.3" + "@docusaurus/utils-validation" "2.4.3" + "@mdx-js/react" "^1.6.22" + mermaid "^9.2.2" + tslib "^2.4.0" + "@docusaurus/theme-search-algolia@2.4.3": version "2.4.3" resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.3.tgz#32d4cbefc3deba4112068fbdb0bde11ac51ece53" @@ -3022,6 +3041,11 @@ comma-separated-tokens@^1.0.0: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== +commander@7, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -3032,11 +3056,6 @@ commander@^5.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - commander@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" @@ -3170,6 +3189,20 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cose-base@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-1.0.3.tgz#650334b41b869578a543358b80cda7e0abe0a60a" + integrity sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg== + dependencies: + layout-base "^1.0.0" + +cose-base@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-2.2.0.tgz#1c395c35b6e10bb83f9769ca8b817d614add5c01" + integrity sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g== + dependencies: + layout-base "^2.0.0" + cosmiconfig@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" @@ -3367,6 +3400,282 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== +cytoscape-cose-bilkent@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b" + integrity sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ== + dependencies: + cose-base "^1.0.0" + +cytoscape-fcose@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz#e4d6f6490df4fab58ae9cea9e5c3ab8d7472f471" + integrity sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ== + dependencies: + cose-base "^2.2.0" + +cytoscape@^3.23.0: + version "3.31.0" + resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.31.0.tgz#cffbbb8ca51db01cbf360e0cf59088db6d429837" + integrity sha512-zDGn1K/tfZwEnoGOcHc0H4XazqAAXAuDpcYw9mUnUjATjqljyCNGJv8uEvbvxGaGHaVshxMecyl6oc6uKzRfbw== + +"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== + dependencies: + internmap "1 - 2" + +d3-axis@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322" + integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== + +d3-brush@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c" + integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "3" + d3-transition "3" + +d3-chord@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966" + integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== + dependencies: + d3-path "1 - 3" + +"d3-color@1 - 3", d3-color@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== + +d3-contour@4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.2.tgz#bb92063bc8c5663acb2422f99c73cbb6c6ae3bcc" + integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA== + dependencies: + d3-array "^3.2.0" + +d3-delaunay@6: + version "6.0.4" + resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz#98169038733a0a5babbeda55054f795bb9e4a58b" + integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A== + dependencies: + delaunator "5" + +"d3-dispatch@1 - 3", d3-dispatch@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== + +"d3-drag@2 - 3", d3-drag@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" + integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== + dependencies: + d3-dispatch "1 - 3" + d3-selection "3" + +"d3-dsv@1 - 3", d3-dsv@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" + integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== + dependencies: + commander "7" + iconv-lite "0.6" + rw "1" + +"d3-ease@1 - 3", d3-ease@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + +d3-fetch@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" + integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== + dependencies: + d3-dsv "1 - 3" + +d3-force@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" + integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== + dependencies: + d3-dispatch "1 - 3" + d3-quadtree "1 - 3" + d3-timer "1 - 3" + +"d3-format@1 - 3", d3-format@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== + +d3-geo@3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.1.tgz#6027cf51246f9b2ebd64f99e01dc7c3364033a4d" + integrity sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q== + dependencies: + d3-array "2.5.0 - 3" + +d3-hierarchy@3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" + integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== + +"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + +d3-polygon@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398" + integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== + +"d3-quadtree@1 - 3", d3-quadtree@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" + integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== + +d3-random@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" + integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== + +d3-scale-chromatic@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#34c39da298b23c20e02f1a4b239bd0f22e7f1314" + integrity sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ== + dependencies: + d3-color "1 - 3" + d3-interpolate "1 - 3" + +d3-scale@4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== + dependencies: + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" + +"d3-selection@2 - 3", d3-selection@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" + integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== + +d3-shape@3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" + integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== + dependencies: + d3-path "^3.1.0" + +"d3-time-format@2 - 4", d3-time-format@4: + version "4.1.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== + dependencies: + d3-array "2 - 3" + +"d3-timer@1 - 3", d3-timer@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + +"d3-transition@2 - 3", d3-transition@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" + integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== + dependencies: + d3-color "1 - 3" + d3-dispatch "1 - 3" + d3-ease "1 - 3" + d3-interpolate "1 - 3" + d3-timer "1 - 3" + +d3-zoom@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" + integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "2 - 3" + d3-transition "2 - 3" + +d3@^7.4.0, d3@^7.8.2: + version "7.9.0" + resolved "https://registry.yarnpkg.com/d3/-/d3-7.9.0.tgz#579e7acb3d749caf8860bd1741ae8d371070cd5d" + integrity sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA== + dependencies: + d3-array "3" + d3-axis "3" + d3-brush "3" + d3-chord "3" + d3-color "3" + d3-contour "4" + d3-delaunay "6" + d3-dispatch "3" + d3-drag "3" + d3-dsv "3" + d3-ease "3" + d3-fetch "3" + d3-force "3" + d3-format "3" + d3-geo "3" + d3-hierarchy "3" + d3-interpolate "3" + d3-path "3" + d3-polygon "3" + d3-quadtree "3" + d3-random "3" + d3-scale "4" + d3-scale-chromatic "3" + d3-selection "3" + d3-shape "3" + d3-time "3" + d3-time-format "4" + d3-timer "3" + d3-transition "3" + d3-zoom "3" + +dagre-d3-es@7.0.9: + version "7.0.9" + resolved "https://registry.yarnpkg.com/dagre-d3-es/-/dagre-d3-es-7.0.9.tgz#aca12fccd9d09955a4430029ba72ee6934542a8d" + integrity sha512-rYR4QfVmy+sR44IBDvVtcAmOReGBvRCWDpO2QjYwqgh9yijw6eSHBqaPG/LIOEy7aBsniLvtMW6pg19qJhq60w== + dependencies: + d3 "^7.8.2" + lodash-es "^4.17.21" + +dayjs@^1.11.7: + version "1.11.13" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== + debug@2.6.9, debug@^2.6.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -3447,6 +3756,13 @@ del@^6.1.1: rimraf "^3.0.2" slash "^3.0.0" +delaunator@5: + version "5.0.1" + resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.1.tgz#39032b08053923e924d6094fe2cde1a99cc51278" + integrity sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw== + dependencies: + robust-predicates "^3.0.2" + depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -3561,6 +3877,11 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" +dompurify@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.3.tgz#f4133af0e6a50297fc8874e2eaedc13a3c308c03" + integrity sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ== + domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" @@ -3619,6 +3940,11 @@ electron-to-chromium@^1.4.535: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.576.tgz#0c6940fdc0d60f7e34bd742b29d8fa847c9294d1" integrity sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA== +elkjs@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/elkjs/-/elkjs-0.8.2.tgz#c37763c5a3e24e042e318455e0147c912a7c248e" + integrity sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -4508,6 +4834,13 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@0.6: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" @@ -4591,6 +4924,11 @@ inline-style-parser@0.1.1: resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + interpret@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" @@ -4934,6 +5272,11 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" +khroma@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.1.0.tgz#45f2ce94ce231a437cf5b63c2e886e6eb42bbbb1" + integrity sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw== + kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -4959,6 +5302,16 @@ launch-editor@^2.6.0: picocolors "^1.0.0" shell-quote "^1.8.1" +layout-base@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2" + integrity sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg== + +layout-base@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-2.0.1.tgz#d0337913586c90f9c2c075292069f5c2da5dd285" + integrity sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg== + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -5015,6 +5368,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + lodash.curry@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" @@ -5195,6 +5553,28 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +mermaid@^9.2.2: + version "9.4.3" + resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-9.4.3.tgz#62cf210c246b74972ea98c19837519b6f03427f2" + integrity sha512-TLkQEtqhRSuEHSE34lh5bCa94KATCyluAXmFnNI2PRZwOpXFeqiJWwZl+d2CcemE1RS6QbbueSSq9QIg8Uxcyw== + dependencies: + "@braintree/sanitize-url" "^6.0.0" + cytoscape "^3.23.0" + cytoscape-cose-bilkent "^4.1.0" + cytoscape-fcose "^2.1.0" + d3 "^7.4.0" + dagre-d3-es "7.0.9" + dayjs "^1.11.7" + dompurify "2.4.3" + elkjs "^0.8.2" + khroma "^2.0.0" + lodash-es "^4.17.21" + non-layered-tidy-tree-layout "^2.0.2" + stylis "^4.1.2" + ts-dedent "^2.2.0" + uuid "^9.0.0" + web-worker "^1.2.0" + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -5346,6 +5726,11 @@ node-releases@^2.0.13: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== +non-layered-tidy-tree-layout@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz#57d35d13c356643fc296a55fb11ac15e74da7804" + integrity sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw== + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -6533,6 +6918,11 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +robust-predicates@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771" + integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== + rtl-detect@^1.0.4: version "1.1.2" resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.1.2.tgz#ca7f0330af5c6bb626c15675c642ba85ad6273c6" @@ -6555,6 +6945,11 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rw@1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== + rxjs@^7.5.4: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" @@ -6572,7 +6967,7 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -7031,6 +7426,11 @@ stylehacks@^5.1.1: browserslist "^4.21.4" postcss-selector-parser "^6.0.4" +stylis@^4.1.2: + version "4.3.5" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.5.tgz#432cc99c81e28d7062c88d979d2163891e860489" + integrity sha512-K7npNOKGRYuhAFFzkzMGfxFDpN6gDwf8hcMiE+uveTVbBgm93HrNP3ZDUpKqzZ4pG7TP6fmb+EMAQPjq9FqqvA== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -7173,6 +7573,11 @@ trough@^1.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== +ts-dedent@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" + integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== + tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" @@ -7441,6 +7846,11 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + validate-peer-dependencies@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/validate-peer-dependencies/-/validate-peer-dependencies-2.2.0.tgz#47b8ff008f66a66fc5d8699123844522c1d874f4" @@ -7513,6 +7923,11 @@ web-namespaces@^1.0.0: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== +web-worker@^1.2.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.5.0.tgz#71b2b0fbcc4293e8f0aa4f6b8a3ffebff733dcc5" + integrity sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"