Welcome to the fetch:copier
action for the scaffolder-backend
.
You need to configure the action in your backend:
# From your Backstage root directory
yarn add --cwd packages/backend @backstage/plugin-scaffolder-backend-module-copier
Configure the action: (you can check the docs to see all options):
// packages/backend/src/plugins/scaffolder.ts
import { CatalogClient } from '@backstage/catalog-client';
import { createRouter } from '@backstage/plugin-scaffolder-backend';
import { createFetchCopierAction } from '@backstage/plugin-scaffolder-backend-module-copier';
import { createBuiltinActions } from '@backstage/plugin-scaffolder-backend';
import { ScmIntegrations } from '@backstage/integration';
import Docker from 'dockerode';
import { DockerContainerRunner } from '@backstage/backend-common';
import { Router } from 'express';
import type { PluginEnvironment } from '../types';
export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
const catalogClient = new CatalogClient({
discoveryApi: env.discovery,
});
const integrations = ScmIntegrations.fromConfig(env.config);
const dockerClient = new Docker();
const containerRunner = new DockerContainerRunner({ dockerClient });
const builtInActions = createBuiltinActions({
integrations,
catalogClient,
config: env.config,
reader: env.reader,
});
const actions = [...builtInActions, createFetchCopierAction({integrations, reader: env.reader, containerRunner})];
return await createRouter({
containerRunner,
catalogClient,
actions,
logger: env.logger,
config: env.config,
database: env.database,
reader: env.reader,
identity: env.identity,
scheduler: env.scheduler,
});
}
After that you can use the action in your template:
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
name: copier-demo
title: Copier Test
description: Copier 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:
allowedKinds:
- Group
system:
title: System
type: string
description: System of the component
ui:field: EntityPicker
ui:options:
allowedKinds:
- 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:copier
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.
The environment needs to have either copier
installed and be available in the PATH
or access to a docker
daemon so it can spin up a docker container with copier
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 copier
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:
RUN apt-get update && apt-get install -y python3 python3-pip
RUN pip3 install copier