# scaffolder-backend-module-cookiecutter Welcome to the `fetch:cookiecutter` action for the `scaffolder-backend`. ## Getting started You need to configure the action in your backend: ## From your Backstage root directory ```bash # From your Backstage root directory yarn --cwd packages/backend add @backstage/plugin-scaffolder-backend-module-cookiecutter ``` Then ensure that both the scaffolder and this module are added to your backend: ```typescript // In packages/backend/src/index.ts const backend = createBackend(); // ... backend.add(import('@backstage/plugin-scaffolder-backend')); backend.add(import('@backstage/plugin-scaffolder-backend-module-cookiecutter')); ``` After that you can use the action in your template: ```yaml apiVersion: scaffolder.backstage.io/v1beta3 kind: Template metadata: name: cookiecutter-demo title: Cookiecutter Test description: Cookiecutter example spec: owner: backstage/techdocs-core type: service parameters: - title: Fill in some steps required: - name - owner properties: name: title: Name type: string description: Unique name of the component ui:autofocus: true ui:options: rows: 5 owner: title: Owner type: string description: Owner of the component ui:field: OwnerPicker ui:options: catalogFilter: kind: Group system: title: System type: string description: System of the component ui:field: EntityPicker ui:options: catalogFilter: kind: System defaultKind: System - title: Choose a location required: - repoUrl - dryRun properties: repoUrl: title: Repository Location type: string ui:field: RepoUrlPicker ui:options: allowedHosts: - github.com dryRun: title: Only perform a dry run, don't publish anything type: boolean default: false steps: - id: fetch-base name: Fetch Base action: fetch:cookiecutter input: url: ./template values: name: ${{ parameters.name }} owner: ${{ parameters.owner }} system: ${{ parameters.system }} destination: ${{ parameters.repoUrl | parseRepoUrl }} - id: publish if: ${{ parameters.dryRun !== true }} name: Publish action: publish:github input: allowedHosts: - github.com description: This is ${{ parameters.name }} repoUrl: ${{ parameters.repoUrl }} - id: register if: ${{ parameters.dryRun !== true }} name: Register action: catalog:register input: repoContentsUrl: ${{ steps['publish'].output.repoContentsUrl }} catalogInfoPath: '/catalog-info.yaml' - name: Results if: ${{ parameters.dryRun }} action: debug:log input: listWorkspace: true output: links: - title: Repository url: ${{ steps['publish'].output.remoteUrl }} - title: Open in catalog icon: catalog entityRef: ${{ steps['register'].output.entityRef }} ``` You can also visit the `/create/actions` route in your Backstage application to find out more about the parameters this action accepts when it's installed to configure how you like. ### Environment setup The environment needs to have either `cookiecutter` installed and be available in the `PATH` or access to a `docker` daemon so it can spin up a docker container with `cookiecutter` available. If you are running Backstage from a Docker container and you want to avoid calling a container inside a container, you can set up `cookiecutter` in your own image, this will use the local installation instead. You can do so by including the following lines in the last step of your Dockerfile: ```dockerfile RUN apt-get update && apt-get install -y python3 python3-pip RUN pip3 install cookiecutter ``` In this case, you don't have to include `containerRunner` in the action configuration.