How to deploy a CircleCI configuration to multiple GitHub repositories

The approach we suggest is to have a dedicated CircleCI build that pushes the configuration to a list of repositories by leveraging the GitHub API.

The repository this CircleCI project is built on would contain:

  • The separate configuration file to be pushed to the other repositories ( global-ci.yml in this example)
  • A config.yml that defines the build to push the above configuration file
  • A file containing the list of repositories in the form “user/repository” or “org/repository” (satellites.txt in this example)

You would also need to add an environment variable containing a GitHub API token with appropriate permissions/scopes.

The config.yml would be:

version: 2.1

jobs:
  deploy-config:
    docker:
      - image: circleci/python
    steps:
      - checkout
      - run:
          name: Test
          command: |
            echo GLOBAL_64=$(base64 -w 0 global-ci.yml) >> $BASH_ENV
            while IFS= read -r repo
              do
                echo BLOB_SHA=$(curl --location --request GET "https://api.github.com/repos/$repo/contents/.circleci/config.yml" --header "Authorization: token ${GH_TOKEN}" --header "Accept: application/vnd.github.v3+json"|jq -r .sha) >> $BASH_ENV
                source $BASH_ENV
                curl --location --request PUT "https://api.github.com/repos/$repo/contents/.circleci/config.yml" --header "Authorization: token ${GH_TOKEN}" --header "Accept: application/vnd.github.v3+json" --data-raw "{\"message\":\"Global config update\", \"content\":\"$GLOBAL_64\", \"sha\":\"${BLOB_SHA}\"}"
              done < "satellites.txt"
          
workflows:
  main:
    jobs:
      - deploy-config

 

GitHub API references:

Was this article helpful?
0 out of 0 found this helpful

Comments

0 comments

Article is closed for comments.