{"id":39075378,"url":"https://github.com/cloud-gov/common-pipelines","last_synced_at":"2026-01-17T18:26:18.183Z","repository":{"id":164490895,"uuid":"633981762","full_name":"cloud-gov/common-pipelines","owner":"cloud-gov","description":"Reusable Concourse pipelines.","archived":false,"fork":false,"pushed_at":"2026-01-12T16:32:18.000Z","size":934,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":9,"default_branch":"main","last_synced_at":"2026-01-12T21:59:52.800Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Dockerfile","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/cloud-gov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-04-28T18:24:06.000Z","updated_at":"2026-01-12T16:32:22.000Z","dependencies_parsed_at":"2023-11-07T14:42:02.208Z","dependency_job_id":"e378b381-0739-454f-b56f-03c68b086cee","html_url":"https://github.com/cloud-gov/common-pipelines","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cloud-gov/common-pipelines","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloud-gov%2Fcommon-pipelines","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloud-gov%2Fcommon-pipelines/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloud-gov%2Fcommon-pipelines/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloud-gov%2Fcommon-pipelines/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cloud-gov","download_url":"https://codeload.github.com/cloud-gov/common-pipelines/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloud-gov%2Fcommon-pipelines/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28515468,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T17:57:59.192Z","status":"ssl_error","status_checked_at":"2026-01-17T17:57:52.527Z","response_time":85,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":[],"created_at":"2026-01-17T18:26:17.974Z","updated_at":"2026-01-17T18:26:18.157Z","avatar_url":"https://github.com/cloud-gov.png","language":"Dockerfile","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Common Concourse Pipelines\n\nReusable Concourse pipelines. Reference the pipeline for your app's language, `fly set-pipeline`, and you're done.\n\n## Index\n\n* `ci`: Concrete pipeline instances that use templates from this repository.\n* `container`: Template pipelines for containerized software.\n* `go`: Template pipeline for Go apps. Not currently in use.\n\n## Usage\n\nSee the README in each folder for pipeline-specific details. In general, you will \"register\" a new pipeline by modifying a parent pipeline in `ci/` and configuring it with a vars file. Once you merge your changes to `main`, the parent pipeline will automatically create your new child pipeline.\n\n## Motivation\n\nAn adage of Continuous Integration: \"Treat pipelines like cattle, not like pets.\"\n\ncloud.gov maintains a variety of software written in a handful of programming languages. Apps written in the same language should be built and deployed in the same way, and developers should not have to reinvent the wheel by writing a new pipeline every time.\n\n## Architecture\n\nCommon pipelines use a parent/child pattern so that one pipeline can manage many others. For example, this diagram shows the relationships between container pipelines:\n\n```mermaid\nflowchart LR\n    classDef ellipses fill:#ffffff,stroke:#ffffff\n    classDef job fill:#ecffec,stroke:#73d893\n\n    subgraph Main Concourse Team\n        container[\"container pipeline\"]\n        container --\u003e|sets self| container\n        container --\u003e|contains| external[\"set-external-pipelines job\"]:::job\n        container --\u003e|contains| internal[\"set-internal-pipelines job\"]:::job\n        container --\u003e|contains| pages[\"set-pages-pipelines job\"]:::job\n\n        external --\u003e|sets| cf-cli-resource[\"cf-cli-resource pipeline\"]\n        external --\u003e|sets| cf-resource[\"cf-resource pipeline\"]\n        external --\u003e|sets| external-etc[\"...\"]:::ellipses\n        external --\u003e|sets| time-resource[\"time-resource pipeline\"]\n        internal --\u003e|sets| cron-resource[\"cron-resource pipeline\"]\n        internal --\u003e|sets| general-task[\"general-task pipeline\"]\n        internal --\u003e|sets| internal-etc[\"...\"]:::ellipses\n        internal --\u003e|sets| s3-resource[\"s3-resource pipeline\"]\n    end\n\n    subgraph Pages Concourse Team\n        pages --\u003e|sets| pages-dind-v25[\"image-dind-v25 pipeline\"]\n        pages --\u003e|sets| pages-node-v20[\"image-node-v20 pipeline\"]\n        pages --\u003e|sets| pages-node-v22[\"image-node-v22 pipeline\"]\n        pages --\u003e|sets| pages-node-v24[\"image-node-v24 pipeline\"]\n        pages --\u003e|sets| pages-python-v3[\"image-python-v3.11 pipeline\"]\n        pages --\u003e|sets| pages-etc[\"...\"]:::ellipses\n    end\n```\n\nThis has several advantages over individually set pipelines:\n\n* Operators only need to manually fly one pipeline, for example `container`, instead of many individual pipelines, making recovery in case of system error easier.\n* The single top-level pipeline can use Concourse steps like `across` to set each child pipeline in the exact same way, with any differences extracted as `vars`. This brings all the benefits of DRY to pipelines.\n\n## Design principles\n\n* Developers should be able to adopt common pipelines with a minimum of effort. One line of code would be ideal.\n* The configuration options for each pipeline should be minimal. They're the API of the pipelines; keep it simple.\n* Favor convention over configuration. Repositories using common pipelines should \"just work\" if their folders and files are in the right place.\n\n## Development\n\nIf you want to iterate on a pipeline in this repository, consider pushing your changes to a topic branch. Topic branches do not have merge protection, so you will be able to iterate more quickly without getting pull requests approved. Change your `pipeline.yml` in your downstream repository to reference your topic branch instead of `main` in the `common-pipelines` resource to continuously pull in your changes. (You can consider working on a topic branch in your downstream repo as well.)\n\n## Troubleshooting\n\n### Pipeline archived after bootstrap\n\nIf your pipeline shows up as \"Archived\" in Concourse after running the steps in [Usage](#Usage), the cause could be one of the following:\n\n* A branch is wrong. If you are using a topic branch to work on a pipeline, double-check that you updated all references from `main` to the topic branch. See [Development](#Development). You may need to run `fly destroy-pipeline` to remove the archived pipeline before you can `set` it again.\n* An input name may be wrong. Check the logs of any `set_pipeline` steps for errors.\n\n### Old pipeline version\n\nAfter bootstrapping, Concourse will sometimes update a pipeline using outdated (possibly cached) resources. Destroy the pipeline, wait a moment, and try again.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloud-gov%2Fcommon-pipelines","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcloud-gov%2Fcommon-pipelines","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloud-gov%2Fcommon-pipelines/lists"}