{"id":43862843,"url":"https://github.com/forj-oss/forjj","last_synced_at":"2026-02-06T10:58:11.357Z","repository":{"id":57611207,"uuid":"78142661","full_name":"forj-oss/forjj","owner":"forj-oss","description":"Build your DevOps environment in minutes - thanks to docker!","archived":false,"fork":false,"pushed_at":"2020-11-13T14:13:46.000Z","size":1180,"stargazers_count":9,"open_issues_count":49,"forks_count":12,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-04-26T00:13:17.394Z","etag":null,"topics":["devops","devops-environment","devops-solution","infrastructure"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/forj-oss.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-01-05T19:41:49.000Z","updated_at":"2022-10-14T09:07:28.000Z","dependencies_parsed_at":"2022-09-16T00:51:29.877Z","dependency_job_id":null,"html_url":"https://github.com/forj-oss/forjj","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/forj-oss/forjj","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/forj-oss%2Fforjj","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/forj-oss%2Fforjj/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/forj-oss%2Fforjj/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/forj-oss%2Fforjj/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/forj-oss","download_url":"https://codeload.github.com/forj-oss/forjj/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/forj-oss%2Fforjj/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29158560,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-06T07:18:23.844Z","status":"ssl_error","status_checked_at":"2026-02-06T07:13:32.659Z","response_time":59,"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":["devops","devops-environment","devops-solution","infrastructure"],"created_at":"2026-02-06T10:58:10.708Z","updated_at":"2026-02-06T10:58:11.339Z","avatar_url":"https://github.com/forj-oss.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Forjj - Factory as Code\n\n[![Build Status](https://jenkins-forjj.eastus.cloudapp.azure.com/buildStatus/icon?job=forjj/master)](https://jenkins-forjj.eastus.cloudapp.azure.com/job/forjj/job/master)\n\n## Introduction\n\nWhat is `Forjj`?\nThis is a tool to help building a Factory as Code.\n\nWhat is Factory as Code?\nIn short, it is a way to deploy and maintain a collection of tools and process, Described/Developed from code perspective.\n\nIn a little more details, `Forjj` describes in a `Forjfile` (yaml file) a collection of tools, like github, jenkins, vault, etc... and\nattach one of more flow process to it to deliver an immediate service to Development and Operators teams.\n\nThis means that as soon as you started your Factory with `Forjj`, your next action is ... ask your development teams to start their \ndevelopment work with a minimum viable software factory to run CI/CD, tests, ...\n\nFrom the operator point of view, with `Forjj`, you deliver services through code as well. So that you do not need to send\na mail to your preferred Operator to create a repo and configure everything around related to the flow, you just\nexplain how to update some configuration files, request a pull request to approve, suggest, discuss and then merge.\n\nThen the `Forjj pipeline` (created by `Forjj`) will deliver the change to your factory (ie new repo (github), webhook (github), pipeline (jenkins), secrets path (vault), etc ...)\n\nAs everything is Code, the core of your operator team is to deliver the code in any kind of language or tools to deliver the final service to the end users.\n\n## Note about Devops and `Forjj`\n\nIt is recurrent that `DevOps` coaches remind that `DevOps` is not methodology or a tools or a team.\n\nSo, `Forjj` is NOT a DevOps tool, mainly because `DevOps` is mainly a Culture mindset.\nSo, you can't consider that adopting `Forjj` will ensure you are DevOps!\n\nBut as soon as you want to adopt a `DevOps` Culture for any reasons, `Forjj`\n can help you very much to automate your process to move to a more\n compliant DevOps environment and support your new `DevOps` Culture.\n\nThe core design of Forjj implements an automated way to start from\nscratch and maintain a combination of tools completely integrated\n(github/jenkins/...) with some **DevOps paradigm** applied like:\n\n- Everything as Code, declined by Forjj as *Factory as code*.\n- Control everything from GIT as Source control system.\n- Use a DevOps Flow which helps to eliminates walls between teams.\n  Ie, Code open, shared, and accessible to newbies or experts.\n\nWe called this **a DevOps Solution**\n\nBut do not forget that Your DevOps solution is not only what Forjj can\ndo for you, but how you are going to transform your process, organization and teams, with the help of Forjj\n\nNote also, that Forjj requires you to help others.\nWhat does it mean? Shortly, we need your contribution!\n\nIn details, Forjj is designed to share the way we do to start a new factory.\n\nIf you use Forjj to deliver your Factory, share this if you can, so that others can rely on your work and our work.\nWhich finally will build the Forjj community to help anyone and improve Forjj and your factory.\n\n## How to start your first simple DevOps solution on your workstation\n\nReally? I can create a DevOps organization on my workstation??? Yes.\n\n### Requirement\n\n- A linux 64 bits system with docker 1.9 or higher. It can be a VM.\n- A *static* docker binary. You can get it from https://get.docker.com\n- wget \u0026 git 1.9 or higher installed\n- Internet access (through proxy or not)\n- A github organization\n- A github Token to manage repositories and organization\n\n### Getting started\n\nHow easy is it to create and maintain a DevOps Solution? Follow this\n3 steps to get a Minimal DevOps Solution based on github and jenkins\n\n1. Download our Forjfile model template and edit it. Replace any \u003c...\u003e by appropriate value.\n\n    ```bash\n    cd /tmp\n    wget -O Forjfile https://github.com/forj-oss/forjj/raw/master/samples/minimal/Forjfile\n    vim Forjfile\n    ```\n\n\u003e **NOTE**: A Forjfile model is a unique Forjfile describing a Factory model and used at create time only to create a new factory.\n\u003e This file usually defines deployments specification (`deployments/\u003cdeployName\u003e/define/...`) and can contain credentials.\n\u003e When your forge will be created:\n\u003e - deployment specfications will be dispatched in several deployment files in the infra repository (`deployments/\u003cdeployName\u003e/Forfile`)\n\u003e - Credentials data will be moved to Forjj vault.\n\u003e\n\u003e Later, you can create your own Forjfile model to help other teams to create their Factory from your Factory model. So it became easy to deploy a `Factory On Demand`.\n\n1. Download `forjj` binary with the `do-refresh-forjj.sh` helper\n\n    ```bash\n    mkdir -p ~/bin\n    wget -O ~/bin/do-refresh-forjj.sh https://raw.githubusercontent.com/forj-oss/forjj/master/bin/do-refresh-forjj.sh\n    bash ~/bin/do-refresh-forjj.sh\n    ```\n\n    **NOTE**: Anytime you need to get latest forjj version, call `do-refresh-forjj.ss`.\n\n2. Create your infra with:\n\n    ```bash\n    forjj create --infra-path ~/devops/myforj-infra\n    ```\n\n    Access your github organization to see what has been created.\n    Open http://localhost:8080 to see your Jenkins master.\n    (You may need to replace localhost by your VM DNS name instead)\n\n### What is behind the scene?\n\n`Forjj` has created 4 things:\n\n1. Your source infra repository\n2. A production deployment repository\n3. Configured a Github public/entreprise organization with your inputs (repos/teams/webhooks)\n4. Started a jenkins container on your linux system.\n\nThis was done by 2 phases described in details below. This is given to understand how it works...\n\n#### Create phase\n\nThis is the details of what `forjj` did at `create phase`:\n\n- `forjj` creates local git repositories, infra and production to host respectively source code (source repository) and deployment code (deployment repository).\n- It starts creating source code for github as follow\n  - It starts a `forjj plugin` called `forjj-github` as container\n  - Then creates 1 file. `github.yaml` under `apps/upstream/github` directory.\n- It starts creating source code for jenkins as follow\n  - It starts a `forjj plugin` called `forjj-jenkins` as container\n  - Then creates few files. like `jenkins.yaml` under `apps/ci/jenkins` directory. forjj-jenkins use GO templates to generate `deploy code`.\n    By default, this templates files are stored in forjj-jenkins plugin under [`templates`](https://github.com/forj-oss/forjj-jenkins/tree/master/templates)\n\n- Now `forjj` starts creating your deploy code.\n- It starts generating deploy code for github as follow\n  - It starts/restarts the `forjj plugin` called `forjj-github` as container\n  - Then copy 1 file. `github.yaml` under `github` directory for the `deployment repository`.\n- It starts creating source code for jenkins as follow\n  - It starts/restarts the `forjj plugin` called `forjj-jenkins` as container\n  - It reads the `templates.yaml` to identify how to copy/generate source code. Except if you set `appplications/jenkins/source-templates` in your Forjfile, the templates.yaml file is located under [`templates`](https://github.com/forj-oss/forjj-jenkins/tree/master/templates)\n  - It copies or generates code to the deployment repository.\n  - If the templates describes a `run_build` command, this command is executed.\n  - Any files generated at build time are collected and reported back to forjj.\n\n- Now `forjj` do a git add of those new files. Ready to to be `git commited`.\n\nExcept if you used `--no-maintain`, `forjj create` automatically run your initial deployment code to deploy your factory. This is done through the call to `forjj maintain` internally.\n\nNOTE: `forjj` communicates with `forjj plugins` using REST API.\n\n#### Maintain phase\n\nNow, `forjj` is going to deploy, based on the code generated, ie from `deployment repository`. This is an automatic maintain step executed from `forjj create`.\n\n- `forjj` started the github deployment.\n  - forjj starts (or restart) at this time the `forjj plugin` called `forjj-github` as container\n  - forjj-github created the repos and configure them accordingly to what Forjfile describes.\n- `forjj` push source codes created at create phase\n- It started the jenkins deployment\n  - `forjj` started (or restarts) the `forjj plugin` called `forjj-jenkins` as container.\n  - `forjj-jenkins` read the `maintain-cmd.yaml` from the deployment repository and run the command identified as `deploy_run`\n  - `forjj-jenkins` then wait for the end of this deployment command.\n\n## What do we do next\n\nIn short, you start using your factory!\n\n**Warning! What is described here is currently not fully implemented !!**\n\nWell. Let's say you are a Team leader or project leader and you want to\nstart a new project. And so you need a Repository... but not just that!\nWith everything pre-configured in background, ie, jenkins and Pull Request\n\nOK! This is done in 3 steps.\n\n- Fork the infra repository\n- Create a Pull request and update the `deployments/production/Forjfile`\n- Merge the pull request\n\nNow, let's dot it. We want to create a repository called `my-project`:\n\nSo, you read in the documentation that you have to update the production Forjfile with\n\n```bash\nrepositories:\n  my-project:\n    title: This is my new repo to host my project\n    issue_tracker: false # By default it is true... your choice for the example...\n```\n\n- Connect to github, forjj the INFRA repo and update the `deployments/production/Forjfile`.\n- Update the appropriate section and submit as pull request.\n\nSo, if you are happy with that first contribution, merge it!\n\nThen shortly, Jenkins will call `forjj maintain` to create your new repository.\n\n\u003e **NOTE:**  This Jenkins job is not yet implemented. It will be shortly with a Jenkinsfile in your infra repository.\n\u003e This task is currently made manually in 2 steps:\n\u003e `forjj update production \u0026\u0026 forjj maintain production`\n\nDONE!\n\nGo to github and a new repository has been created.\nBut jenkins also has been updated with new pipeline jobs!\n\nAnd so now your team can start developing!!!\n\nIn real life, you may introduce more step before creating a Pull request\n, like:\n\n- Create a git branch\n- Update source with `Forjj` (add repo, applications, update any existing apps ...)\n- Update any other source, like templates\n- create one or more commits\n- Push\n- Create your Pull request.\n\nIn the above command, `Forjj` did it all for you.\n\n\n### What is behind the scene?\n\n`Forjj` has :\n\n- created a new empty repository with a simple README and a\nbasic Jenkinsfile.\n- Pushed the repository to github\n- Configured a seedjob for your project to automatically build your\n Jenkins pipeline\n- Configure github flow to call those jobs when a new Pull request is made\n\n## What next?\n\nAs everything with `Forjj` is managed through code, so you can do everything!!!\nBut everything controlled, secured and contributed.\n\nThe contribution can be made at several levels:\n\nNewbie or Dev team:\n\n- Call `forjj` to update source code for you. Good for team that do not want\nto go deeply in infrastructure automation Code.\n- End user Documentation.\n\nExpert/active contributor or Ops team\n\n- Update Application data exposure to enhance `Forjj` cli\n- Update application templates\n- Share your DevOps model (Forjfile stored as source in your infra repo)\n\nInteresting? Then go to the [User Guide](USER_GUIDE.md) or\n[Dev Guide](DEV_GUIDE.md)\n\nThank you\nForj team\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fforj-oss%2Fforjj","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fforj-oss%2Fforjj","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fforj-oss%2Fforjj/lists"}