Cross-Repository Workflows

Repository relationships and workflow dispatch chains for the Posit container image ecosystem, including dogfooding and internal deployment paths.

Note

This document represents the desired future state of the cross-repo workflow architecture. Not all workflows shown here are implemented yet. See posit-dev/images-shared#302 for implementation status and open PRs.

Legend

graph TD
    A["Repository"] ==>|"workflow_dispatch"| B["Repository"]
    C["Repository"] -.->|"workflow_call"| D["Repository"]
    E["Repository"] -->|"push"| F[("Registry")]
    F --> I(["Environment"])
    G{{"GitHub App"}} ==> H["Repository"]

Legend

Symbol Meaning
Thick line workflow_dispatch — cross-repo trigger via GitHub App
Dashed line workflow_call — reusable workflow (same CI run)
Thin line Direct action: push, Flux sync, PR merge
Rectangle Repository or workflow
Cylinder Registry
Stadium Environment
Hexagon GitHub App identity

GitHub Apps

App Installed on Role
posit-connect-projects posit-dev/connect
posit-dev/images-connect
rstudio/helm
Dispatches downstream from Connect releases
workbench-ide-release posit-dev/images-workbench
rstudio/rstudio-pro
rstudio/helm
Dispatches downstream from Workbench releases
posit-package-manager-automation posit-dev/images-package-manager
rstudio/package-manager
rstudio/helm
Dispatches downstream from PPM releases
posit-platform posit-dev/images-shared
rstudio/helm
Platform team operations, centralized dispatch

Product GitHub Apps own the dispatch chain from product release through to Helm chart update. posit-platform handles platform-team-owned operations (e.g., scheduled rebuilds, cache cleanup).

Production Release Flow

graph TD
    subgraph "Product Repos"
        CONNECT_PROD["connect"]
        WORKBENCH_PROD["rstudio-pro"]
        PPM_PROD["package-manager"]
    end

    CONNECT_PROD ==> IMG_CONNECT
    WORKBENCH_PROD ==> IMG_WORKBENCH
    PPM_PROD ==> IMG_PM

    subgraph "Image Repos"
        IMG_CONNECT["images-connect"]
        IMG_WORKBENCH["images-workbench"]
        IMG_PM["images-package-manager"]
    end

    IMG_CONNECT -.-> SHARED
    IMG_WORKBENCH -.-> SHARED
    IMG_PM -.-> SHARED

    SHARED["images-shared"]

    IMG_CONNECT --> REGISTRIES
    IMG_WORKBENCH --> REGISTRIES
    IMG_PM --> REGISTRIES

    REGISTRIES[("Docker Hub + GHCR")]

    IMG_CONNECT ==> HELM
    IMG_WORKBENCH ==> HELM
    IMG_PM ==> HELM

    HELM["helm"] --> K8S(["K8s Dogfood Sites"])

Production Release Flow

Development / Preview Flow

graph TD
    subgraph "Product Repos"
        CONNECT_PROD["connect"]
        WORKBENCH_PROD["rstudio-pro"]
        PPM_PROD["package-manager"]
    end

    CONNECT_PROD ==> IMG_CONNECT
    WORKBENCH_PROD ==> IMG_WORKBENCH
    PPM_PROD ==> IMG_PM

    subgraph "Image Repos"
        IMG_CONNECT["images-connect"]
        IMG_WORKBENCH["images-workbench"]
        IMG_PM["images-package-manager"]
    end

    IMG_CONNECT -.-> SHARED
    IMG_WORKBENCH -.-> SHARED
    IMG_PM -.-> SHARED

    SHARED["images-shared"]

    IMG_CONNECT --> GHCR
    IMG_WORKBENCH --> GHCR
    IMG_PM --> GHCR

    GHCR[("GHCR")]

    GHCR --> K8S(["K8s Dogfood Sites"])
    GHCR --> FUZZBUCKET(["Fuzzbucket"])
    GHCR --> EKS_REF(["EKS Reference Architecture"])

Development / Preview Flow

Per-Product Diagrams

Connect

Production

graph TD
    subgraph connect
        SCRIPTS["release-scripts.yml<br/>publish_release.py"]
    end

    SCRIPTS ==> APP_REL{{"posit-connect-projects"}}
    APP_REL ==> REL

    subgraph images-connect
        REL["release.yml<br/><i>version</i>"]
        PROD_WF["production.yml<br/><i>dev-versions=exclude</i>"]
        CONTENT["content.yml<br/><i>matrix-versions=only</i>"]
    end

    REL -.-> PRODUCT_REL

    subgraph images-shared
        PRODUCT_REL["product-release.yml<br/><i>version</i><br/><i>images</i>"]
        SHARED["bakery-build-native.yml"]
    end

    REL -->|"PR merge"| PROD_WF
    REL -->|"PR merge"| CONTENT

    PROD_WF -.-> SHARED
    CONTENT -.-> SHARED

    PROD_WF -->|push| REGISTRIES[("Docker Hub + GHCR")]
    CONTENT -->|push| REGISTRIES

    PROD_WF ==> APP_HELM{{"posit-connect-projects"}}
    APP_HELM ==> HELM_WF

    subgraph helm
        HELM_WF["product-release.yml<br/><i>product</i><br/><i>version</i>"]
    end

    HELM_WF --> K8S(["K8s Dogfood Sites"])

    click SCRIPTS "https://github.com/posit-dev/connect/blob/main/.github/workflows/release-scripts.yml" _blank
    click REL "https://github.com/posit-dev/images-connect/blob/main/.github/workflows/release.yml" _blank
    click PROD_WF "https://github.com/posit-dev/images-connect/blob/main/.github/workflows/production.yml" _blank
    click CONTENT "https://github.com/posit-dev/images-connect/blob/main/.github/workflows/content.yml" _blank
    click PRODUCT_REL "https://github.com/posit-dev/images-shared/blob/main/.github/workflows/product-release.yml" _blank
    click SHARED "https://github.com/posit-dev/images-shared/blob/main/.github/workflows/bakery-build-native.yml" _blank
    click HELM_WF "https://github.com/rstudio/helm/blob/main/.github/workflows/product-release.yml" _blank

Connect Production Flow

Development

graph TD
    subgraph connect
        CI["ci.yml"]
    end

    CI ==> APP{{"posit-connect-projects"}}
    APP ==> DEV

    subgraph images-connect
        DEV["development.yml<br/><i>version</i>"]
    end

    DEV -.-> SHARED

    subgraph images-shared
        SHARED["bakery-build-native.yml<br/><i>dev-versions=only</i>"]
    end

    DEV -->|push| GHCR[("GHCR<br/>connect-preview")]
    GHCR --> K8S(["K8s Dogfood Sites"])

    click CI "https://github.com/posit-dev/connect/blob/main/.github/workflows/ci.yml" _blank
    click DEV "https://github.com/posit-dev/images-connect/blob/main/.github/workflows/development.yml" _blank
    click SHARED "https://github.com/posit-dev/images-shared/blob/main/.github/workflows/bakery-build-native.yml" _blank

Connect Development Flow

Workbench

Production

graph TD
    subgraph rstudio-pro
        RELEASE_ALL["release-all.yml"]
        UPDATE_IMG["release-update-images-workbench.yml"]
        RELEASE_ALL --> UPDATE_IMG
    end

    UPDATE_IMG ==> APP_REL{{"workbench-ide-release"}}
    APP_REL ==> REL

    subgraph images-workbench
        REL["release.yml<br/><i>version</i>"]
        PROD_WF["production.yml<br/><i>dev-versions=exclude</i>"]
        SESSION["session.yml<br/><i>matrix-versions=only</i>"]
    end

    REL -.-> PRODUCT_REL

    subgraph images-shared
        PRODUCT_REL["product-release.yml<br/><i>version</i><br/><i>images</i>"]
        SHARED["bakery-build-native.yml"]
    end

    REL -->|"PR merge"| PROD_WF
    REL -->|"PR merge"| SESSION

    PROD_WF -.-> SHARED
    SESSION -.-> SHARED

    PROD_WF -->|push| REGISTRIES[("Docker Hub + GHCR")]
    SESSION -->|push| REGISTRIES

    PROD_WF ==> APP_HELM{{"workbench-ide-release"}}
    APP_HELM ==> HELM_WF

    subgraph helm
        HELM_WF["product-release.yml<br/><i>product</i><br/><i>version</i>"]
    end

    HELM_WF --> K8S(["K8s Dogfood Sites"])

    click RELEASE_ALL "https://github.com/rstudio/rstudio-pro/blob/main/.github/workflows/release-all.yml" _blank
    click UPDATE_IMG "https://github.com/rstudio/rstudio-pro/blob/main/.github/workflows/release-update-images-workbench.yml" _blank
    click REL "https://github.com/posit-dev/images-workbench/blob/main/.github/workflows/release.yml" _blank
    click PROD_WF "https://github.com/posit-dev/images-workbench/blob/main/.github/workflows/production.yml" _blank
    click SESSION "https://github.com/posit-dev/images-workbench/blob/main/.github/workflows/session.yml" _blank
    click PRODUCT_REL "https://github.com/posit-dev/images-shared/blob/main/.github/workflows/product-release.yml" _blank
    click SHARED "https://github.com/posit-dev/images-shared/blob/main/.github/workflows/bakery-build-native.yml" _blank
    click HELM_WF "https://github.com/rstudio/helm/blob/main/.github/workflows/product-release.yml" _blank

Workbench Production Flow

Development

graph TD
    subgraph rstudio-pro
        NIGHTLY["release-nightly-test.yml"]
    end

    NIGHTLY ==> APP{{"workbench-ide-release"}}
    APP ==> DEV

    subgraph images-workbench
        DEV["development.yml<br/><i>version</i><br/><i>stream</i>"]
    end

    DEV -.-> SHARED

    subgraph images-shared
        SHARED["bakery-build-native.yml<br/><i>dev-versions=only</i>"]
    end

    DEV -->|push| GHCR[("GHCR<br/>workbench-preview<br/>workbench-session-init-preview")]
    GHCR --> K8S(["K8s Dogfood Sites"])
    GHCR --> FUZZBUCKET(["Fuzzbucket"])
    GHCR --> EKS_REF(["EKS Reference Architecture"])

    click NIGHTLY "https://github.com/rstudio/rstudio-pro/blob/main/.github/workflows/release-nightly-test.yml" _blank
    click DEV "https://github.com/posit-dev/images-workbench/blob/main/.github/workflows/development.yml" _blank
    click SHARED "https://github.com/posit-dev/images-shared/blob/main/.github/workflows/bakery-build-native.yml" _blank

Workbench Development Flow

Package Manager

Production

graph TD
    subgraph package-manager
        CI["ci.yml (publish job)"]
    end

    CI ==> APP_REL{{"posit-package-manager-automation"}}
    APP_REL ==> REL

    subgraph images-package-manager
        REL["release.yml<br/><i>version</i>"]
        PROD_WF["production.yml<br/><i>dev-versions=exclude</i>"]
    end

    REL -.-> PRODUCT_REL

    subgraph images-shared
        PRODUCT_REL["product-release.yml<br/><i>version</i><br/><i>images</i>"]
        SHARED["bakery-build-native.yml"]
    end

    REL -->|"PR merge"| PROD_WF
    PROD_WF -.-> SHARED

    PROD_WF -->|push| REGISTRIES[("Docker Hub + GHCR")]

    PROD_WF ==> APP_HELM{{"posit-package-manager-automation"}}
    APP_HELM ==> HELM_WF

    subgraph helm
        HELM_WF["product-release.yml<br/><i>product</i><br/><i>version</i>"]
    end

    HELM_WF --> K8S(["K8s Dogfood Sites"])

    click CI "https://github.com/rstudio/package-manager/blob/main/.github/workflows/ci.yml" _blank
    click REL "https://github.com/posit-dev/images-package-manager/blob/main/.github/workflows/release.yml" _blank
    click PROD_WF "https://github.com/posit-dev/images-package-manager/blob/main/.github/workflows/production.yml" _blank
    click PRODUCT_REL "https://github.com/posit-dev/images-shared/blob/main/.github/workflows/product-release.yml" _blank
    click SHARED "https://github.com/posit-dev/images-shared/blob/main/.github/workflows/bakery-build-native.yml" _blank
    click HELM_WF "https://github.com/rstudio/helm/blob/main/.github/workflows/product-release.yml" _blank

Package Manager Production Flow

Development

graph TD
    subgraph package-manager
        CI["ci.yml (publish job)"]
    end

    CI ==> APP{{"posit-package-manager-automation"}}
    APP ==> DEV

    subgraph images-package-manager
        DEV["development.yml<br/><i>version</i>"]
    end

    DEV -.-> SHARED

    subgraph images-shared
        SHARED["bakery-build-native.yml<br/><i>dev-versions=only</i>"]
    end

    DEV -->|push| GHCR[("GHCR<br/>package-manager-preview")]
    GHCR --> K8S(["K8s Dogfood Sites"])

    click CI "https://github.com/rstudio/package-manager/blob/main/.github/workflows/ci.yml" _blank
    click DEV "https://github.com/posit-dev/images-package-manager/blob/main/.github/workflows/development.yml" _blank
    click SHARED "https://github.com/posit-dev/images-shared/blob/main/.github/workflows/bakery-build-native.yml" _blank

Package Manager Development Flow

Back to top