Add Seqera Platform Automation side quest#968
Conversation
Port the Platform Automation training module from the standalone
m42-platform-advanced-training repo into the training collection as a
single-page side quest, following the side_quests convention.
- docs/en/docs/side_quests/platform_automation/index.md: the guide,
with codespace badge, asset paths, and cd commands retargeted to
nextflow-io/training and side-quests/platform_automation/.
- side-quests/platform_automation/{terraform,seqerakit}: the Terraform
(compute-env, pipeline) and seqerakit assets, verbatim aside from
path/reference fixes and repaired code fences in the seqerakit README.
- .editorconfig: add 2-space rule for *.tf/*.tfvars (terraform fmt style).
Intentionally not added to the mkdocs nav or the side_quests index table.
Passes pre-commit (prettier, editorconfig, whitespace, eof), the heading
checker, terraform validate, and a non-strict mkdocs build.
Generated by Claude Code
The platform_automation side quest needs Terraform, the Seqera CLI (tw), and seqerakit. Add them to the dev image the same way the rest of the toolchain is managed (features baked into the codespaces-dev/local-dev image), not via setup.sh: - terraform: official devcontainers/features/terraform feature, pinned to 1.9.8 with tflint/terragrunt disabled. - tw: new local-features/seqera-cli feature, mirroring tower-agent but arch-aware (x86_64/arm64) so the multi-arch image build stays green. - seqerakit: added to the existing uv-tools feature (pure-Python uv tool). - hashicorp.terraform VS Code extension added to all three configs. The tools land in the prebuilt image once docker-devcontainer rebuilds on merge to master; the production devcontainer pulls that image. Generated by Claude Code
The assets moved from the repo root into side-quests/platform_automation/, so the root-relative `cd` commands broke mid-sequence: after cd-ing into terraform/compute-env, a later `cd side-quests/platform_automation/seqerakit` fails. Make every `cd` absolute (/workspaces/training/...) so each step works from wherever the previous one left the learner, matching the absolute-path convention used elsewhere in the side quests. Also drop the stale "ends with 'Toolchain ready'" line: that string came from the standalone repo's setup.sh and is not printed by the training devcontainer. Generated by Claude Code
…st next step Add Terraform ignore rules so learner-generated terraform.tfvars and *.tfstate (both contain Azure credentials) are not committed; the committed *.tfvars.example files stay tracked. Point the "What's next?" cross-reference at the in-site Building with Seqera AI (CoScientist) side quest instead of a generic GitHub link. Generated by Claude Code
✅ Deploy Preview for nextflow-training ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
Nextflow linting complete!
💡 Tip: Click filename locations to go directly to that code. View all 70 issuesView formatting changes
|
tower-cli publishes no tw-linux-arm64 asset, so the multi-arch image build 404'd on the arm64 leg. Keep the native binary on x86_64 and fall back to the arch-independent tw-jar.jar (run via Java) on arm64. Generated by Claude Code
Section 0 jumped from opening the Codespace straight to creating a token, never walking participants into the working directory or showing its contents. Add "Move into the project directory" (cd + code .) and "Review the materials" (directory tree) subsections, matching the debugging side quest pattern. Generated by Claude Code
… workshop handle Review pass on the Platform Automation side quest: - Reset terraform/pipeline revision to master so the §2.4 pin-a-tag exercise starts from the right state - Sync §1.3 walkthrough with compute-env/main.tf (head VM size, worker ignore_changes, random_string, a note on the azcopy/Fusion start task) - Replace the $USER/$USERNAME interpolation mess with a single, dot-free WORKSHOP_USER handle set once and reused across the UI, tw, seqerakit and Terraform; tighten the Terraform username validation to reject dots - Register the page in mkdocs nav; refresh the §0 directory tree - Add seqerakit/launch-rnaseq-multiple.yml; drop per-directory READMEs - gitignore agent/terraform local state (.omc, .claude/.local, lock files) Generated by Claude Code
- !!! Tip -> !!! tip (lowercase type) - !!! Note Using a params.yml -> !!! note "Using a params file" (the unquoted title was parsed as CSS classes and dropped) Generated by Claude Code
Co-authored-by: Luisa Santus <luisa.santus@seqera.io> Co-authored-by: Adam Talbot <12817534+adamrtalbot@users.noreply.github.com>
pinin4fjords
left a comment
There was a problem hiding this comment.
Just submitting intermediate review while I continue
| └── launch-rnaseq-multiple.yml | ||
| ``` | ||
|
|
||
| ### Create an access token |
There was a problem hiding this comment.
| ### Create an access token | |
| ### Log in to Platform and go to the organisation and workspaces your trainer directs you to | |
| .... or something | |
| ### Create an access token |
|
|
||
| ```bash | ||
| export TOWER_ACCESS_TOKEN=<paste-token> | ||
| export SEQERA_ACCESS_TOKEN=$TOWER_ACCESS_TOKEN |
There was a problem hiding this comment.
One was needed for Seqera CLI but we aren't using it here. let's remove.
|
|
||
| This only exists in a single terminal session, if you open a new terminal you will need to export them again. | ||
|
|
||
| For Seqera Enterprise, also set `SEQERA_API_URL` (and the `server_url` Terraform variable) to your install's API URL. Everything else is identical. |
There was a problem hiding this comment.
Example? How do folks find that?
|
|
||
| ## 1. Admin: compute environments and cloud | ||
|
|
||
| **Requires:** Owner or Admin role, and permissions in the cloud environment. If you are using a Cloud provider, authenticate with them first via their CLI. |
There was a problem hiding this comment.
We're skipping over credentials here. Don't we want to 1) ensure that trainers do that in advance, so that keys are in place and 2) have the users go look at the creds, understand what they are?
There was a problem hiding this comment.
I wasn't sure about this.
Credentials are complex and cause many problems. I'd rather leave them to docs if possible and, for the purposes of a tutorial, assume they exist. I'll add a quick sentence saying they have to exist
| - Provisioning model should be Spot, using Spot instances for nodes which run Nextflow tasks. | ||
|
|
||
| **Azure** | ||
|
|
There was a problem hiding this comment.
Lots of ways this can go wrong- should we encourage some sensible values?
There was a problem hiding this comment.
These were about as tight as I could get the values before the setting depends on a bunch of stuff in your own cloud account 😢
|
|
||
| The manual marker: `head_pool` is set to the pool Terraform just made and there is **no `forge` block**. That one difference is what makes the compute environment manual instead of Forge. `nextflow_config` routes tasks to the worker pool. | ||
|
|
||
| Let's walk the key blocks of `terraform/compute-env/main.tf`. |
There was a problem hiding this comment.
Too much 'just talking' about tf below, I'd hate to teach that and just waffle on about terraform code blocks for 5 mins straight. We should have folks running pieces more, e.g. do the 'init' up front.
There was a problem hiding this comment.
Agreed. Snipped right down and told users to open the Terraform file themselves if they want to explore it. Suggested the key points that it refers to variables and resources from the Terraform.
There was a problem hiding this comment.
Also simplified the heck out of it.
| ```bash | ||
| # you may need to log in to the cloud provider with `az login` | ||
| terraform init | ||
| terraform apply |
There was a problem hiding this comment.
This asks the user for a whole bunch of stuff we haven't told them how to find out.
There was a problem hiding this comment.
you mean the subscription ID and stuff? Good point, I'll add some quick bullet points.
| terraform output compute_env_id | ||
| ``` | ||
|
|
||
| On the Azure side, open the Batch account in the portal. You will see the head and worker pools Terraform created, sitting idle with no jobs yet. Once you launch a pipeline (sections 2 and 3), jobs and tasks stack onto these pools, and you can drill into a task's logs and exit code. That is the whole point of the Admin tier: the Platform submits to Azure Batch, and Azure Batch runs the work. Maintain- and Launch-role users see only the compute environment in the workspace, not the cloud behind it. |
There was a problem hiding this comment.
Does this make sense to include? Are we ever going to give trainees access to cloud consoles?
There was a problem hiding this comment.
This is strictly for admins who have access to their own cloud portal. In a live training I might show access to the relevant resources with a screen share.
|
|
||
| Click **Add**. The pipeline appears on the Launchpad with no run started. Adding a pipeline only saves a launch configuration; it does not run anything. | ||
|
|
||
| To remove from the workspace, you can click the hamburger menu on the top right and click **Delete**. |
There was a problem hiding this comment.
| ```bash | ||
| tw pipelines add \ | ||
| --name="rnaseq-nf-$WORKSHOP_USER" \ | ||
| --compute-env="azure-batch-manual" \ |
There was a problem hiding this comment.
Will we guarantee 'azure-batch-manual'? What to do if we're not doing 'admin'?
There was a problem hiding this comment.
It's hard coded in the Terraform.
I left it because the Terraform spins up a few hot nodes to work on 😉 so the training will go much faster.
It probably needs a comment to acknowledge your compute env name might be different 🤔
pinin4fjords
left a comment
There was a problem hiding this comment.
Just a few specific points below. General ones:
- Should try and make sure everything is runnable without having to think too hard, make sure different flavours of the same commands don't conflict.
- Is it worth teaching Seqerakit, or should we just do TF for infra and
twfor e.g. pipeline runs? I've never found seqerakit's IaC to make much sense for runs. - Need screenshots for Platform pieces.
|
|
||
| ```bash | ||
| tw pipelines add \ | ||
| --name="rnaseq-nf-$WORKSHOP_USER" \ |
There was a problem hiding this comment.
| --name="rnaseq-nf-$WORKSHOP_USER" \ | |
| --name="rnaseq-nf-$WORKSHOP_USER-tw" \ |
prevent clash with manual creation
| tw pipelines delete --name="rnaseq-nf-$WORKSHOP_USER" | ||
| ``` | ||
|
|
||
| ### 2.3. Add a pipeline with `seqerakit` |
There was a problem hiding this comment.
Is it even worth teaching seqerakit with the Terraform provider available now?
|
|
||
| ```yaml | ||
| pipelines: | ||
| - name: "rnaseq-nf-${WORKSHOP_USER}" |
There was a problem hiding this comment.
| - name: "rnaseq-nf-${WORKSHOP_USER}" | |
| - name: "rnaseq-nf-${WORKSHOP_USER}-sk" |
Prevent clashes
| url: "https://github.com/nextflow-io/rnaseq-nf" | ||
| workspace: "${TOWER_WORKSPACE_ID}" | ||
| description: "Added with seqerakit" | ||
| compute-env: "azure-batch-manual" |
There was a problem hiding this comment.
| compute-env: "azure-batch-manual" | |
| compute-env: "<CE name>" |
unless guaranteed
| `side-quests/platform_automation/terraform/pipeline` adds the same pipeline declaratively. You describe the pipeline that should exist; Terraform makes the workspace match. Like the imperative methods above, the config tracks the `master` branch; you will pin it to a release tag below to see Terraform update the pipeline in place. | ||
|
|
||
| ```bash | ||
| cd /workspaces/training/side-quests/platform_automation/terraform/pipeline |
There was a problem hiding this comment.
Not sure why, but I can't make this work
seqera_pipeline.rnaseq_nf: Creating...
╷
│ Error: unexpected response from API. Got an unexpected response code 403
│
│ with seqera_pipeline.rnaseq_nf,
│ on main.tf line 27, in resource "seqera_pipeline" "rnaseq_nf":
│ 27: resource "seqera_pipeline" "rnaseq_nf" {
│
│ **Request**:
│ POST /pipelines?workspaceId=75541431575041 HTTP/1.1
│ Host: api.cloud.seqera.io
│ Accept: application/json
│ Authorization: (sensitive)
│ Content-Type: application/json
│ User-Agent: speakeasy-sdk/terraform 0.40.1 2.903.0 1.153.0
│ github.com/seqeralabs/terraform-provider-seqera/internal/sdk
│
│
│ **Response**:
│ HTTP/2.0 403 Forbidden
│ Content-Length: 0
│ Date: Thu, 18 Jun 2026 15:28:47 GMT
│
│
There was a problem hiding this comment.
Ran the Platform side of this end to end in a container (terraform 1.9.8, tw 0.32.0, seqerakit 0.5.7, against an Azure Batch workspace). Notes from actually executing it, plus code-block formatting / pedagogy suggestions inline.
Verified works exactly as written:
- 2.4 Terraform: create, idempotent re-apply (
No changes), and themaster->v2.4update-in-place all match the documented console output verbatim. Nice bit of teaching. - 2.2
tw pipelines addsecond-run "already exists" error is accurate.
Needs attention:
- The
forge-ce.jsonblock is not whattwemits - realtw compute-envs exportreturns a flat object keyed bydiscriminator, with nocomputeEnv/configwrapper. Suggestion inline. - Name clashes between the four add methods. The UI,
tw,seqerakit, and Terraform steps all add the samernaseq-nf-$WORKSHOP_USER. Running the section top to bottom,seqerakit adderrors on its first run because thetw addstep already created that name, so the "run it again and it errors" point lands for the wrong reason. Suffixing each method's name (e.g.-tw,-sk,-tf) keeps them independent. - The Terraform pipeline create can return a 403 depending on the token's workspace role. The same
main.tfand provider 0.40.1 created the pipeline fine with a Maintain-capable token, so this is environmental rather than a code bug. Worth a troubleshooting note ("403 = your token's role can't create pipelines in this workspace") rather than a code change. azure-batch-manualisn't guaranteed for Maintain/Launch-only learners (they never run section 1), so the hardcoded compute-env name needs to be a placeholder. I ran the quest's commands against an existing CE with a different name to confirm the rest holds.
Couldn't exercise: 1.1/1.3/1.4 (Azure provisioning + cloud console), the UI steps, and real launches (didn't fire runs).
| ```json title="forge-ce.json" | ||
| { | ||
| "computeEnv": { | ||
| "name": "azure-batch", | ||
| "platform": "azure-batch", | ||
| "config": { | ||
| "workDir": "az://work", | ||
| "region": "eastus", | ||
| "waveEnabled": true, | ||
| "fusion2Enabled": true, | ||
| "forge": { | ||
| "headPool": { | ||
| "vmType": "Standard_D2s_v3", | ||
| "vmCount": 1, | ||
| "autoScale": true | ||
| }, | ||
| "workerPool": { | ||
| "vmType": "Standard_D4s_v3", | ||
| "vmCount": 4, | ||
| "autoScale": true | ||
| }, | ||
| "disposeOnDeletion": true | ||
| } | ||
| } | ||
| } | ||
| } | ||
| ``` |
There was a problem hiding this comment.
tw compute-envs export (0.32.0) does not emit a computeEnv/config wrapper. The real output is a flat object keyed by discriminator, with the config fields hoisted to the top level. I ran this against an Azure Batch Forge CE and got the shape below. The actual file also carries default/null fields (deleteJobsOnCompletion, managedIdentityClientId, labels, ...) that aren't worth showing here. The forge block survives, so the prose still lands.
| ```json title="forge-ce.json" | |
| { | |
| "computeEnv": { | |
| "name": "azure-batch", | |
| "platform": "azure-batch", | |
| "config": { | |
| "workDir": "az://work", | |
| "region": "eastus", | |
| "waveEnabled": true, | |
| "fusion2Enabled": true, | |
| "forge": { | |
| "headPool": { | |
| "vmType": "Standard_D2s_v3", | |
| "vmCount": 1, | |
| "autoScale": true | |
| }, | |
| "workerPool": { | |
| "vmType": "Standard_D4s_v3", | |
| "vmCount": 4, | |
| "autoScale": true | |
| }, | |
| "disposeOnDeletion": true | |
| } | |
| } | |
| } | |
| } | |
| ``` | |
| ```json title="forge-ce.json" hl_lines="2 7" | |
| { | |
| "discriminator": "azure-batch", | |
| "region": "eastus", | |
| "workDir": "az://work", | |
| "waveEnabled": true, | |
| "fusion2Enabled": true, | |
| "forge": { | |
| "headPool": { "vmType": "Standard_D2s_v3", "vmCount": 1, "autoScale": true }, | |
| "workerPool": { "vmType": "Standard_D4s_v3", "vmCount": 4, "autoScale": true }, | |
| "disposeOnDeletion": true, | |
| "dualPoolConfig": true | |
| } | |
| } | |
| ``` |
|
|
||
| The first block declares the providers and pins their versions. The `seqera` provider is pinned to exactly `0.40.1`: | ||
|
|
||
| ```terraform |
There was a problem hiding this comment.
Title the excerpt and highlight the pinned seqera provider line the prose calls out.
| ```terraform | |
| ```terraform title="terraform/compute-env/main.tf" hl_lines="5" |
|
|
||
| Next we configure the providers. The `seqera` provider reads `TOWER_ACCESS_TOKEN` from the environment, so there is no token argument here: | ||
|
|
||
| ```terraform |
There was a problem hiding this comment.
| ```terraform | |
| ```terraform title="terraform/compute-env/main.tf" |
|
|
||
| Next we can define some variables we can use throughout our deployment. In this case, we will set the node sizes and details once and reuse them throughout the configuration: | ||
|
|
||
| ```terraform |
There was a problem hiding this comment.
Highlight the VM sizes, since the surrounding text is about node sizing.
| ```terraform | |
| ```terraform title="terraform/compute-env/main.tf" hl_lines="2 3" |
|
|
||
| Next we can refer to resources that already exist. These are called `data` in Terraform. Here we refer to the Azure Batch account: | ||
|
|
||
| ```terraform |
There was a problem hiding this comment.
| ```terraform | |
| ```terraform title="terraform/compute-env/main.tf" |
|
|
||
| This only exists in a single terminal session, if you open a new terminal you will need to export them again. | ||
|
|
||
| For Seqera Enterprise, also set `SEQERA_API_URL` (and the `server_url` Terraform variable) to your install's API URL. Everything else is identical. |
There was a problem hiding this comment.
Double-check the variable name here: tw (and therefore seqerakit) read the Enterprise endpoint from TOWER_API_ENDPOINT, not SEQERA_API_URL. The Terraform server_url variable is correct. Worth being precise so Enterprise users don't set a var nothing reads.
|
|
||
| In the side bar, open **Compute Environments** and click **Create compute environment**. Give it a name, pick your cloud platform, and select the credentials for that cloud. The rest of the form differs by provider; recommended settings: | ||
|
|
||
| **AWS** |
There was a problem hiding this comment.
1.1 walks both AWS and Azure, but everything after it (the 1.2 export example, the 1.3 Terraform, and the az://work work-dir throughout 2-3) is Azure-only. An AWS learner who follows 1.1 hits a wall at 1.3 with no path forward. Either say up front "the rest of this quest assumes Azure Batch" or note where AWS users diverge.
|
|
||
| The dry run shows the underlying `tw` command. Run it twice and you get two runs. That is the imperative model: do the thing, now. | ||
|
|
||
| One advantage of using Seqerakit is the YAML forms a template of actions to perform. Because of this we can do two more things: firstly, we can save it and re-use it later. Secondly, we can launch the same pipeline several times by adding more launch blocks to the YAML file. This is useful if you want to launch the same pipeline with different parameters or on different compute environments. Let's try and launch the pipeline now with |
There was a problem hiding this comment.
Seqerakit should be `seqerakit` (lowercase, backticked) to match the rest of the doc, and this is a long run-on. Suggest splitting.
|
|
||
| ## What's next? | ||
|
|
||
| - The AI half of the workshop is the [Building with Seqera AI (CoScientist)](../co_scientist/index.md) side quest. It uses the same `rnaseq-nf` pipeline and API endpoints, but drives them via AI agents. |
pinin4fjords
left a comment
There was a problem hiding this comment.
A second pass, this time on teaching style, lining the quest up with the conventions in the other side quests (essential_scripting_patterns, metadata, working_with_files, ...). The framing (learning goals, role table) and the wrap-up (per-section Takeaways, Summary, the declarative-vs-imperative table) already match the house style well, and the idempotency demonstrations (run tw add twice, apply Terraform twice) are exactly the "run and observe" loop those quests are built on. These suggestions push the rest of the body toward the same "do, then explain" rhythm.
- Collapsible command output. The other quests wrap expected output in
??? success/??? failure "Command output"so the page stays scannable and learners self-check. Converted the four bareconsoleblocks inline. - Make the hand-off artifact visible from the CLI. 1.2/1.4 read the compute environment back over the API; mirrored that for the Maintain tier so the Launchpad pipeline is something the learner sees, not just reads about.
- Less passive code-walking in 1.3. Reframed the "walk every block" lead-in inline. The fuller restructure (too big for a clean suggestion): once
terraform.tfvarsis filled, runterraform init+terraform planup front so learners see the two pools and the CE the config will create, then explain only the manual-marker block against that plan and drop the providers/locals/pools into a??? abstractfor reference. No other quest narrates eight blocks before the first run. - Voice. Minor nudge from tour-guide "we build" to second-person "you'll build".
One diagram (recommendation, no code to suggest): the Admin -> Maintain -> Launch artifact hand-off and the Platform -> Batch -> VM submission relationship are the quest's core mental model and are inherently spatial. A single .excalidraw.svg (per the repo's diagram convention) would anchor the whole quest; the other quests use images where the idea is spatial.
The CE-name placeholder edit is already covered by existing threads plus the hl_lines highlight in my earlier review, so I haven't duplicated it here.
|
|
||
| **Requires:** Owner or Admin role, and permissions in the cloud environment. If you are using a Cloud provider, authenticate with them first via their CLI (e.g. `aws sso login`). | ||
|
|
||
| The same compute environment can be created with increasing control over the cloud. We build it two ways. |
There was a problem hiding this comment.
Small voice nudge toward the second person the other quests use ("you'll build", not "we build").
| The same compute environment can be created with increasing control over the cloud. We build it two ways. | |
| The same compute environment can be created with increasing control over the cloud. You'll build it two ways. |
|
|
||
| The manual marker: `head_pool` is set to the pool Terraform just made and there is **no `forge` block**. That one difference is what makes the compute environment manual instead of Forge. `nextflow_config` routes tasks to the worker pool. | ||
|
|
||
| Let's walk the key blocks of `terraform/compute-env/main.tf`. |
There was a problem hiding this comment.
The other quests never narrate eight code blocks before the learner runs anything; they run early and explain against real output. Reframe the lead-in so the providers/locals/pools read as reference and the focus lands on the one block that encodes the lesson. (See the review summary for the fuller plan-first restructure: init + plan once terraform.tfvars is filled, then collapse the boilerplate into a ??? abstract.)
| Let's walk the key blocks of `terraform/compute-env/main.tf`. | |
| The whole file is in the repo to read at your own pace, and most of it is standard Terraform: the providers, the locals, and the two Azure Batch pools. Only one block encodes the lesson that makes this compute environment _manual_, so we'll focus there and treat the rest as reference. |
| ```console | ||
| The pipelines resource already exists and will not be created. Please set 'on_exists: overwrite' to replace the resource or set 'on_exists: ignore' to ignore this error. | ||
| ``` |
There was a problem hiding this comment.
The other quests wrap expected output in collapsible ??? success/??? failure "Command output" blocks so the page stays scannable and learners can self-check. This one is an error, so failure.
| ```console | |
| The pipelines resource already exists and will not be created. Please set 'on_exists: overwrite' to replace the resource or set 'on_exists: ignore' to ignore this error. | |
| ``` | |
| ??? failure "Command output" | |
| ```console | |
| The pipelines resource already exists and will not be created. Please set 'on_exists: overwrite' to replace the resource or set 'on_exists: ignore' to ignore this error. | |
| ``` |
| ```console | ||
| No changes. Your infrastructure matches the configuration. | ||
| ``` |
There was a problem hiding this comment.
Collapsible output, matching the house style.
| ```console | |
| No changes. Your infrastructure matches the configuration. | |
| ``` | |
| ??? success "Command output" | |
| ```console | |
| No changes. Your infrastructure matches the configuration. | |
| ``` |
| ```console | ||
| Terraform will perform the following actions: | ||
|
|
||
| # seqera_pipeline.rnaseq_nf will be updated in-place | ||
| ~ resource "seqera_pipeline" "rnaseq_nf" { | ||
| ~ launch = { | ||
| ~ revision = "master" -> "v2.4" | ||
| # (4 unchanged attributes hidden) | ||
| } | ||
| } | ||
|
|
||
| Plan: 0 to add, 1 to change, 0 to destroy. | ||
| ``` |
There was a problem hiding this comment.
Collapsible output, matching the house style.
| ```console | |
| Terraform will perform the following actions: | |
| # seqera_pipeline.rnaseq_nf will be updated in-place | |
| ~ resource "seqera_pipeline" "rnaseq_nf" { | |
| ~ launch = { | |
| ~ revision = "master" -> "v2.4" | |
| # (4 unchanged attributes hidden) | |
| } | |
| } | |
| Plan: 0 to add, 1 to change, 0 to destroy. | |
| ``` | |
| ??? success "Command output" | |
| ```console | |
| Terraform will perform the following actions: | |
| # seqera_pipeline.rnaseq_nf will be updated in-place | |
| ~ resource "seqera_pipeline" "rnaseq_nf" { | |
| ~ launch = { | |
| ~ revision = "master" -> "v2.4" | |
| # (4 unchanged attributes hidden) | |
| } | |
| } | |
| Plan: 0 to add, 1 to change, 0 to destroy. | |
| ``` |
| ```console | ||
| Workflow 2ZXaU1AzEn7Onk submitted at [Organization / Workspace] workspace. | ||
|
|
||
| https://cloud.seqera.io/orgs/Organization/workspaces/Workspace/watch/2ZXaU1AzEn7Onk | ||
| ``` |
There was a problem hiding this comment.
Collapsible output, matching the house style.
| ```console | |
| Workflow 2ZXaU1AzEn7Onk submitted at [Organization / Workspace] workspace. | |
| https://cloud.seqera.io/orgs/Organization/workspaces/Workspace/watch/2ZXaU1AzEn7Onk | |
| ``` | |
| ??? success "Command output" | |
| ```console | |
| Workflow 2ZXaU1AzEn7Onk submitted at [Organization / Workspace] workspace. | |
| https://cloud.seqera.io/orgs/Organization/workspaces/Workspace/watch/2ZXaU1AzEn7Onk | |
| ``` |
|
|
||
| Copy `terraform.tfvars.example` to `terraform.tfvars` and fill it in so you stop passing `-var` flags. | ||
|
|
||
| Open the Launchpad: `rnaseq-nf-$WORKSHOP_USER` is there, with no run. Now apply again: |
There was a problem hiding this comment.
Section 1.2/1.4 read the compute environment back over the API; mirror that here so the learner watches the Launchpad pipeline appear (the artifact handed to the Launch tier), instead of only being told it's there.
| Open the Launchpad: `rnaseq-nf-$WORKSHOP_USER` is there, with no run. Now apply again: | |
| Confirm it landed, in the UI (open the Launchpad) or from the terminal, the same way you read the compute environment back in section 1.2: | |
| ```bash | |
| tw pipelines list | |
| ``` | |
| `rnaseq-nf-$WORKSHOP_USER` is there, with no run. Now apply again: |
Surface the role/tier table at the top of the side quest so participants pick their starting section before any setup. Reword the Admin/Maintain/Launch guidance and update the table's Produces column. Generated by Claude Code
Co-authored-by: Jonathan Manning <jonathan.manning@seqera.io>
Co-authored-by: Jonathan Manning <jonathan.manning@seqera.io>
Co-authored-by: Jonathan Manning <jonathan.manning@seqera.io>
- Correct forge-ce.json to the flat discriminator-keyed shape tw export emits - Add titles and hl_lines to the Terraform/pipeline code blocks - Wrap command output in collapsible ??? success blocks (house style) - Add tw pipelines list step so the Launchpad pipeline is visible - Note the quest assumes Azure Batch after 1.1 - Make the tw compute-env a placeholder and delete an explicit pre-Terraform step - Voice/casing/run-on cleanups; drop the removed seqerakit add-rnaseq.yml Generated by Claude Code
Summary
Adds a new Seqera Platform Automation side quest that walks the Platform's programmatic surface across three workspace roles of decreasing privilege (Admin → Maintain → Launch), each handing an artifact to the next.
docs/en/docs/side_quests/platform_automation/index.md— create compute environments (Batch Forge UI + Terraform), add pipelines to the Launchpad four ways (UI,tw, seqerakit, Terraform), and launch (GUI,tw, seqerakit, Actions). The throughline is declarative existence (Terraform) vs imperative actions (UI,tw, seqerakit).side-quests/platform_automation/—terraform/compute-env/,terraform/pipeline/, andseqerakit/with*.tfvars.exampletemplates.hashicorp.terraformextension),tw(0.32.0), andseqerakit(0.5.7) to the toolchain.Notes
side_quests/index.mdtable in this PR.Verification
uv run .github/check_headings.py docs/en/docs/side_quests/platform_automation/index.md→ 0 errorsnpx prettier --checkon the lesson → passesgit check-ignoreconfirmsterraform.tfvars/*.tfstateare ignored while*.tfvars.examplestay trackedGenerated by Claude Code