{"id":16176115,"url":"https://github.com/piotr-kalanski/service-initializer","last_synced_at":"2026-02-19T17:31:45.986Z","repository":{"id":53529992,"uuid":"247999091","full_name":"piotr-kalanski/service-initializer","owner":"piotr-kalanski","description":"Tool for initializing new service","archived":false,"fork":false,"pushed_at":"2021-03-25T23:32:35.000Z","size":122,"stargazers_count":1,"open_issues_count":8,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-10-22T21:57:44.390Z","etag":null,"topics":["continous-delivery","devops","devops-tools","python","template"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/piotr-kalanski.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-03-17T15:02:21.000Z","updated_at":"2020-04-17T10:46:47.000Z","dependencies_parsed_at":"2022-09-03T02:22:06.468Z","dependency_job_id":null,"html_url":"https://github.com/piotr-kalanski/service-initializer","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/piotr-kalanski/service-initializer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotr-kalanski%2Fservice-initializer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotr-kalanski%2Fservice-initializer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotr-kalanski%2Fservice-initializer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotr-kalanski%2Fservice-initializer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/piotr-kalanski","download_url":"https://codeload.github.com/piotr-kalanski/service-initializer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotr-kalanski%2Fservice-initializer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29624564,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-19T13:04:20.082Z","status":"ssl_error","status_checked_at":"2026-02-19T13:03:33.775Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["continous-delivery","devops","devops-tools","python","template"],"created_at":"2024-10-10T04:47:44.357Z","updated_at":"2026-02-19T17:31:45.954Z","avatar_url":"https://github.com/piotr-kalanski.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# service-initializer\n\n## Introduction\n\nService Initializer is tool to initialize new service (e.g. REST API, batch job, data pipeline).\n\nYou can use Service Initializer to create standard workflows for initializing new services in your organization using multiple builtin tasks and/or your custom tasks.\n\n[![License](http://img.shields.io/:license-Apache%202-red.svg)](http://www.apache.org/licenses/LICENSE-2.0.txt)\n[![CI status](https://github.com/piotr-kalanski/service-initializer/workflows/CI%20workflow/badge.svg)](https://github.com/piotr-kalanski/service-initializer/actions)\n\n## Motivation\n\nWhen you start working on new Microservice you have to in each case do multiple repetitive and boring things like: create git repository, create basic directory structure in git repository, create CI/CD pipeline, create docker registry etc.\n\nAim of Service Initializer is to automate such tasks so that you can start from implementing business logic.\n\n### Benefits\n\nBenefits of Service Initializer:\n- Reduce time spent on boring and repetitive tasks\n- Support microservice architecture in your organization by reducing overhead on creating new service\n- Increase standardization in your organization\n- Speed up induction process of new developer in your organization\n- Technology and platform agnostic - you can use it to initialize any tech stack\n- Many built in tasks ([see more](#supported-tasks))\n- Extensibility - it is relatively easy to add support for automating new type of tasks ([see more](#add-new-task))\n\n## Table of contents\n\n- [service-initializer](#service-initializer)\n  - [Introduction](#introduction)\n  - [Motivation](#motivation)\n    - [Benefits](#benefits)\n  - [Table of contents](#table-of-contents)\n  - [Quick start](#quick-start)\n  - [Concepts](#concepts)\n    - [Task](#task)\n    - [Step](#step)\n    - [Workflow configuration](#workflow-configuration)\n      - [Example workflow configuration file](#example-workflow-configuration-file)\n    - [Service metadata](#service-metadata)\n      - [Example service metadata file](#example-service-metadata-file)\n  - [Architecture](#architecture)\n  - [Command line](#command-line)\n    - [Run workflow](#run-workflow)\n  - [Secrets](#secrets)\n    - [Secrets provided in environment variables](#secrets-provided-in-environment-variables)\n    - [Secrets provided in file](#secrets-provided-in-file)\n  - [Supported tasks](#supported-tasks)\n    - [Create AWS Code Commit repository](#create-aws-code-commit-repository)\n    - [Create ECR repository](#create-ecr-repository)\n    - [Create AWS CloudFormation stack](#create-aws-cloudformation-stack)\n      - [Parameters](#parameters)\n    - [Generate project directory using cookiecutter template](#generate-project-directory-using-cookiecutter-template)\n      - [Parameters](#parameters-1)\n    - [Create GitHub repository](#create-github-repository)\n      - [Parameters](#parameters-2)\n    - [Create GitLab project](#create-gitlab-project)\n      - [Parameters](#parameters-3)\n    - [Clone git repository](#clone-git-repository)\n      - [Parameters](#parameters-4)\n    - [Push all new files to git repository](#push-all-new-files-to-git-repository)\n      - [Parameters](#parameters-5)\n    - [Docker run command](#docker-run-command)\n      - [Executed Docker run command](#executed-docker-run-command)\n      - [Example in Workflow Configuration](#example-in-workflow-configuration)\n      - [Parameters](#parameters-6)\n  - [Add new task](#add-new-task)\n    - [Method 1 - Create custom Python class for task](#method-1---create-custom-python-class-for-task)\n      - [Create new Python class](#create-new-python-class)\n      - [Add mapping from expected task type name to Task class](#add-mapping-from-expected-task-type-name-to-task-class)\n    - [Method 2 - Create custom Docker image for your task](#method-2---create-custom-docker-image-for-your-task)\n\n## Quick start\n\nTODO\n\n## Concepts\n\n### Task\n\nTask is list of actions (recipe) with desired outcome.\n\nExample tasks:\n- create git repository\n- create build plan\n- create deployment plan\n- create Docker registry\n\n### Step\n\nStep is parameterized task with assigned name.\n\n### Workflow configuration\n\nWorkflow configuration is list of steps to be executed in sequence to initialize new service.\nIn other words it is recipe to initialize new service.\nWorkflow configuration is provided in YAML format.\n\n#### Example workflow configuration file\n\nExample workflow configuration YAML file:\n\n```yaml\nsteps:\n  - name: Step1\n    task:\n      type: AWS/CodeCommit/CreateRepository\n  - name: Step2\n    task:\n      type: AWS/CodePipeline/CreatePipeline\n  - name: Step3\n    task:\n      type: AWS/ECR/CreateRepository\n  - name: Step4\n    task:\n      type: git/PushToRepository\n```\n\nAbove workflow has four steps:\n- create AWS Code Commit Repository\n- create Code Pipeline pipeline\n- create ECR repository\n- push to git repository\n\n### Service metadata\n\nService metadata is list of parameters that are provided when running workflow and can be input to tasks.\n\nService metadata schema:\n- ``name`` - service name\n- ``description`` - service description\n- ``parameters`` - key value pairs\n\n#### Example service metadata file\n\n```yaml\nname: service\ndescription: service description\nparameters:\n  param1: value1\n  param2: value2\n  param3:\n    field1: 1\n    field2: f2\n```\n\n## Architecture\n\nTODO\n\n## Command line\n\n### Run workflow\n\nCommand to initialize new service based on provided workflow and service metadata.\n\n    python initialize_service.py --configuration PATH_TO_WORKFLOW_CONFIGURATION.yaml --parameters PATH_TO_SERVICE_METADATA.yaml\n\nExample:\n\n    python initialize_service.py --configuration workflow_simple.yaml --parameters service_metadata.yaml\n\n## Secrets\n\nYou can provide secrets (e.g. token, API key) using environment variables and/or file.\n\nSecrets are defined in Worfklow Configuration file in section *secrets*:\n\n```yaml\nsecrets:\n  [...]\n  \nsteps:\n  [...]\n```\n\nIn Workflow Steps you can provide reference to secret value using syntax: ```{secret:NAME_OF_SECRET}```.\n\nExample:\n\n```yaml\nsteps:\n  - name: Step name\n    task:\n      type: TYPE\n      parameters:\n        token: {secret:TOKEN}\n```\n\n### Secrets provided in environment variables\n\nYou can provide mapping from name of environment variable to secret name in section ```secrets.environment```.\n\nExample:\n\n```yaml\nsecrets:\n  environment:\n    ENVIRONMENT_VARIABLE_NAME: API_KEY\n```\n\n### Secrets provided in file\n\nYou can provide list of files with secrets in section ```secrets.files```.\n\nExample:\n\n```yaml\nsecrets:\n  files:\n    - /dir1/dir2/secrets1.yaml\n    - /dir1/dir2/secrets2.yaml\n```\nExpected file format with secrets:\n\n```yaml\nsecret_key1: value1\nsecret_key2: value2\n```\n\n## Supported tasks\n\n### Create AWS Code Commit repository\n\n```yaml\n  steps:\n  - name: Step name\n    task:\n      type: AWS/CodeCommit/CreateRepository\n\n  [...]\n```\n\n### Create ECR repository\n\n```yaml\n  steps:\n  - name: Step name\n    task:\n      type: AWS/ECR/CreateRepository\n\n  [...]\n```\n\n### Create AWS CloudFormation stack\n\nExample:\n\n```yaml\n  steps:\n  - name: step\n    task:\n      type: AWS/CloudFormation/CreateStack\n      parameters:\n        template_body: \u003e\n          Resources:\n            S3Bucket:\n              Type: AWS::S3::Bucket\n              DeletionPolicy: Retain\n              Properties:\n                BucketName: my-bucket\n        service_metadata_parameter_with_stack_name: cf_stack_name\n        service_metadata_parameter_with_stack_parameters: cf_stack_parameters\n        stack_parameters:\n          p1: v1\n          p2: v2\n  [...]\n```\n\n#### Parameters\n\n|Parameter|Required?|Description|\n|---|---|---|\n|template_body|YES|CloudFormation template body|\n|service_metadata_parameter_with_stack_name|YES|name of field in Service Metadata with information about Stack name|\n|service_metadata_parameter_with_stack_parameters|NO|name of field in Service Metadata with dictionary of parameters for CloudFormation stack|\n|stack_parameters|NO|dictionary with parameters for CloudFormation stack common for all services|\n\n### Generate project directory using cookiecutter template\n\nExample:\n\n```yaml\nsteps:\n  - name: Generate project directory using cookiecutter\n    task:\n      type: Cookiecutter/GenerateProjectDirectory\n      parameters:\n        template_url_field_name: 'cookiecutter.template_url'\n        parameters_field_name: 'cookiecutter.parameters'\n        output_dir: 'dir1/dir2'\n\n  [...]\n```\n\n#### Parameters\n\n|Parameter|Required?|Description|\n|---|---|---|\n|template_url_field_name|YES|name of field in Service Metadata with url to cookiecutter template|\n|parameters_field_name|YES|name of field in Service Metadata with input parameters for cookiecutter template|\n|output_dir|YES|output directory where to generate project template|\n\n### Create GitHub repository\n\n```yaml\n  steps:\n  - name: Step name\n    task:\n      type: GitHub/CreateRepository\n      parameters:\n        auth_token: TOKEN\n        service_metadata_parameter_with_request_body: create_github_repository_body\n  [...]\n```\n\n#### Parameters\n\n|Parameter|Required?|Description|\n|---|---|---|\n|auth_token|YES|Authentication token for GitHub API (https://developer.github.com/v3/#authentication)|\n|service_metadata_parameter_with_request_body|YES|Name of parameter in Service Metadata with create GitHub repository request body (https://developer.github.com/v3/repos/#create-a-repository-for-the-authenticated-user)|\n\n### Create GitLab project\n\n```yaml\n  steps:\n  - name: step\n    task:\n      type: GitLab/CreateProject\n      parameters:\n        personal_token: TOKEN\n        service_metadata_parameter_with_request_body: create_gitlab_project_body\n  [...]\n```\n\n#### Parameters\n\n|Parameter|Required?|Description|\n|---|---|---|\n|personal_token|YES|Authentication token for GitLab API (https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#creating-a-personal-access-token)|\n|service_metadata_parameter_with_request_body|YES|Name of parameter in Service Metadata with create GitLab repository request body (https://docs.gitlab.com/ee/api/projects.html#create-project)|\n\n### Clone git repository\n\n```yaml\nsteps:\n  - name: step\n    task:\n      type: git/CloneRepository\n      parameters:\n        service_metadata_parameter_with_target_directory: target_directory\n        service_metadata_parameter_with_repository_url: repository_url\n[...]\n```\n\n#### Parameters\n\n|Parameter|Required?|Description|\n|---|---|---|\n|service_metadata_parameter_with_target_directory|YES|name of field in Service Metadata with target directory for git repository|\n|service_metadata_parameter_with_repository_url|YES|name of field in Service Metadata with git repository url|\n\n### Push all new files to git repository\n\n```yaml\nsteps:\n  - name: step\n    task:\n      type: git/PushToRepository\n      parameters:\n        service_metadata_parameter_with_path_of_git_repository: path_of_git_repository\n[...]\n```\n\n#### Parameters\n\n|Parameter|Required?|Description|\n|---|---|---|\n|service_metadata_parameter_with_path_of_git_repository|YES|name of field in Service Metadata with path of git repository|\n\n### Docker run command\n\nGeneric task for running task using Docker image for task.\n\n#### Executed Docker run command\n\nThis task executes docker command using below template:\n\n    docker run -it --rm CUSTOM_DOCKER_OPTIONS --name SERVICE_METADATA.name --description \"SERVICE_METADATA.description\" --parameters \"CUSTOM_TASK_PARAMETERS\" --service-metadata \"SERVICE_METADATA.parameters\"\n\nwhere:\n- ``SERVICE_METADATA.name.*`` are fields values from (Service Metadata)[#service-metadata]\n- ``CUSTOM_DOCKER_OPTIONS`` is custom Docker run options that can be provided in Workflow Configuration file\n- ``CUSTOM_TASK_PARAMETERS`` is custom task parameters that can be provided in Workflow Configuration file\n\n#### Example in Workflow Configuration\n\n```yaml\n  steps:\n  - name: Step name\n    task:\n      type: Docker/Run\n      parameters:\n        docker_image: piotrkalanski/service-initializer-cookiecutter-task\n        task_parameters:\n          template_url_field_name: 'template_url'\n          output_dir: '/output/'\n          parameters_field_name: 'params'\n        docker_run_options:\n          - '-v generated_project:/output'\n  [...]\n```\nBased on above configuration following command will be executed:\n\n    docker run -it --rm -v generated_project:/output piotrkalanski/service-initializer-cookiecutter-task --name SERVICE_METADATA.name --description \"SERVICE_METADATA.description\" --parameters \"{'template_url_field_name': 'template_url', 'output_dir': '/output/', 'parameters_field_name': 'params'}\" --service-metadata \"SERVICE_METADATA.parameters\"\n\n#### Parameters\n\n|Parameter|Required?|Description|\n|---|---|---|\n|docker_image|YES|Docker image|\n|task_parameters|YES|Dictionary of custom parameters for your task|\n|docker_run_options|NO|Additional Docker command options e.g. for mapping volume|\n\n## Add new task\n\nThere are two methods for adding new tasks:\n1. [Method 1](#method-1---create-custom-python-class-for-task) - Create custom Python class for task\n2. [Method 2](#method-2---create-custom-docker-image-for-your-task) - Use generic [Docker task](#create-custom-docker-image-for-your-task)\n\n### Method 1 - Create custom Python class for task\n\nRequired steps:\n1. Create new Python class\n2. Add mapping from expected task type name to Task class in [WorkflowConfigurationReader](./src/workflow/configuration/workflow_configuration_reader.py).\n\n#### Create new Python class\n\nCreate new Python class derived from *AbstractTask* class.\n\nYou need to implement one method *execute* responsible for executing task.\n\n```python\n\nimport logging\nfrom tasks.abstract_task import AbstractTask\nfrom service_metadata.model import ServiceMetadata\n\nclass New_Task(AbstractTask):\n    \n    def execute(self, service_metadata: ServiceMetadata):\n        logging.info(\"Your message\")\n        # TODO - implementation\n```\n\n#### Add mapping from expected task type name to Task class\n\nAdd new mapping in [WorkflowConfigurationReader](./src/workflow/configuration/workflow_configuration_reader.py):\n\n```python\n\nclass WorkflowConfigurationReader:\n    [...]\n    TASKS_CLASSES = {\n        [...],\n        \"NewTask\": New_Task,\n    }\n\n    [...]\n\n```\n\nwhere ``NewTask`` is used in workflow configuration file, example:\n\n```yaml\nsteps:\n  - name: Step\n    task:\n      type: NewTask\n```\n\n### Method 2 - Create custom Docker image for your task\n\nTo create custom Docker image for new task you can use base Docker image: [piotr-kalanski/service-initializer-base-docker](https://github.com/piotr-kalanski/service-initializer-base-docker).\n\nYou can find example task using Docker image here: https://github.com/piotr-kalanski/service-initializer-cookiecutter-task.\n\nThen you can execute your custom task using [Docker/Run](#docker-run-command) task.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpiotr-kalanski%2Fservice-initializer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpiotr-kalanski%2Fservice-initializer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpiotr-kalanski%2Fservice-initializer/lists"}