An open API service indexing awesome lists of open source software.

https://github.com/boomit/github-config-manager

Manage GitHub repository secrets and variables across multiple repositories effortlessly with GitHub CLI automation.
https://github.com/boomit/github-config-manager

automation ci-cd configuration-management devops github-actions github-api python secrets-management

Last synced: 6 months ago
JSON representation

Manage GitHub repository secrets and variables across multiple repositories effortlessly with GitHub CLI automation.

Awesome Lists containing this project

README

          

# ๐Ÿš€ github-config-manager

> **License:** MIT
> **Python Version:** 3.9+

**`github-config-manager`**๋Š” GitHub CLI(`gh`)๋ฅผ ํ™œ์šฉํ•˜์—ฌ **์—ฌ๋Ÿฌ GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ Secrets ๋ฐ Variables๋ฅผ ์ผ๊ด„์ ์œผ๋กœ ๊ด€๋ฆฌ**ํ•˜๊ณ  ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
์กฐ์ง ๋‚ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์„ค์ •์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜ ๋Œ€๋Ÿ‰ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

---

## โœจ ์ฃผ์š” ๊ธฐ๋Šฅ

- ๐Ÿ” **Secrets ๋ฐ Variables ์ผ๊ด„ ์‚ญ์ œ**
์ง€์ •๋œ ํ•ญ๋ชฉ๋“ค์„ ์—ฌ๋Ÿฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ํ•œ ๋ฒˆ์— ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

- ๐Ÿ› ๏ธ **Secrets ๋ฐ Variables ์ผ๊ด„ ์„ค์ •/์—…๋ฐ์ดํŠธ**
์—ฌ๋Ÿฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋™์ผํ•œ ๊ฐ’๋“ค์„ ๋น ๋ฅด๊ฒŒ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
`--force` ์˜ต์…˜์„ ํ†ตํ•ด ๋ฎ์–ด์“ฐ๊ธฐ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- ๐Ÿ”Ž **๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ž๋™ ํƒ์ƒ‰**
GitHub ์กฐ์ง ๋˜๋Š” ์‚ฌ์šฉ์ž ๊ณ„์ •์˜ ๋ชจ๋“  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ํƒ์ƒ‰ํ•˜์—ฌ ๋Œ€์ƒ ๋ฆฌ์ŠคํŠธ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

- ๐ŸŽฏ **ํŠน์ • ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋งŒ ์ง€์ • ๊ฐ€๋Šฅ**
ํŒŒ์ผ(`--tr`)์„ ํ†ตํ•ด ํŠน์ • ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ชฉ๋ก๋งŒ ๋Œ€์ƒ์œผ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- โš™๏ธ **๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์ง€์›**
๋‹ค์ˆ˜์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ž‘์—… ์†๋„๋ฅผ ๋Œ€ํญ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

- โœ… **์ž‘์—… ์ „ ์‚ฌ์šฉ์ž ํ™•์ธ ์š”์ฒญ**
์‹ค์ œ ์ž‘์—… ์ˆ˜ํ–‰ ์ „, ์ž‘์—… ๋Œ€์ƒ๊ณผ ๋‚ด์šฉ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ช…ํ™•ํžˆ ๋ณด์—ฌ์ฃผ๊ณ  ์ตœ์ข… ํ™•์ธ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

- ๐Ÿ“ˆ **์‹ค์‹œ๊ฐ„ ์ง„ํ–‰ ์ƒํ™ฉ ๋ฐ ์ƒ์„ธ ๋กœ๊ทธ ์ถœ๋ ฅ**
๊ฐ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ „์ฒด ์ง„ํ–‰ ์ƒํ™ฉ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

- ๐Ÿ›‘ **์ž‘์—… ์ค‘๋‹จ ๊ธฐ๋Šฅ ์ œ๊ณต**
์‹คํ–‰ ๋„์ค‘ ์–ธ์ œ๋“ ์ง€ `'q' + Enter`๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ฒŒ ์ž‘์—…์„ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

---

## ๐Ÿš€ ์‹œ์ž‘ํ•˜๊ธฐ

### ๐Ÿ“‹ ์ „์ œ ์กฐ๊ฑด

- Python 3.9 ์ด์ƒ
- GitHub CLI (`gh`) ์„ค์น˜ ๋ฐ ๋กœ๊ทธ์ธ ํ•„์š”
๐Ÿ‘‰ ์„ค์น˜ ๊ฐ€์ด๋“œ: https://cli.github.com/
๐Ÿ‘‰ ๋กœ๊ทธ์ธ: `gh auth login`

- ํ•„์ˆ˜ GitHub ๊ถŒํ•œ (Scopes):**

`github-config-manager`๊ฐ€ Secrets ๋ฐ Variables ์ž‘์—…์„ ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด, `gh auth login` ์‹œ ๋ฐœ๊ธ‰๋ฐ›๋Š” GitHub Personal Access Token (PAT)์— ๋‹ค์Œ ๊ถŒํ•œ(Scope)์ด ๋ถ€์—ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

* `repo`: ๋ฆฌํฌ์ง€ํ† ๋ฆฌ Secrets ๋ฐ Variables๋ฅผ ์ฝ๊ณ , ์“ฐ๊ณ , ์‚ญ์ œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
* `read:org`: (์„ ํƒ ์‚ฌํ•ญ) ํŠน์ • ์กฐ์ง์˜ ๋ชจ๋“  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ ๋ฆฌํฌํ† ๋ฆฌ๋งŒ ๊ด€๋ฆฌํ•œ๋‹ค๋ฉด ํ•„์ˆ˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

์ด ๊ถŒํ•œ๋“ค์€ `gh auth login` ๊ณผ์ •์—์„œ GitHub CLI๊ฐ€ ์ž๋™์œผ๋กœ ์ œ์•ˆํ•˜๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

### ๐Ÿ“ฆ ์„ค์น˜

```bash
git clone https://github.com/your-username/github-config-manager.git
cd github-config-manager
pip install -r requirements.txt
```

---

### ์‚ฌ์šฉ๋ฒ•

'main.py' ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋ช…๋ น์ค„ ์ธ์ž๋ฅผ ํ†ตํ•ด Secret ๋ฐ Variable ์ž‘์—… ๋ฐฉ์‹์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
```bash
python main.py --help
```

์˜ˆ์‹œ:

1. ํŠน์ • ์กฐ์ง์˜ ๋ชจ๋“  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ Secret ์‚ญ์ œ:
'my-org' ์กฐ์ง์˜ ๋ชจ๋“  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ 'OLD_SECRET'์ด๋ผ๋Š” Secret์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

echo "OLD_SECRET" > secrets_to_delete.txt
python main.py -o my-org -ds secrets_to_delete.txt

2. ์ƒˆ๋กœ์šด Secret ๋ฐ Variable ์„ค์ •/์—…๋ฐ์ดํŠธ (๊ธฐ์กด ์กด์žฌ ์‹œ ๊ฑด๋„ˆ๋›ฐ๊ธฐ):
'my-org' ์กฐ์ง์˜ ๋ชจ๋“  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— 'NEW_SECRET=value1' Secret๊ณผ 'APP_VERSION=1.0' Variable์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.

echo "NEW_SECRET=value1" > secrets.env
echo "APP_VERSION=1.0" > variables.env
python main.py -o my-org -s secrets.env -v variables.env

3. ํŠน์ • ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ชฉ๋ก์— Secret ๊ฐ•์ œ ์—…๋ฐ์ดํŠธ:
'target_repos.txt'์— ๋‚˜์—ด๋œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ 'API_KEY' Secret์„ ๊ฐ•์ œ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

```bash
# target_repos.txt ์˜ˆ์‹œ:
# my-org/repo-a
# another-org/repo-b
```

```bash
echo "API_KEY=new_super_secret" > api_key.env
python main.py -tr target_repos.txt -s api_key.env --force
```

4. ๋‹ค์ค‘ ์›Œ์ปค(๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Secret ๋ฐ Variable ์‚ญ์ œ/์„ค์ •:
'my-org' ์กฐ์ง์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ 5๊ฐœ์˜ ์›Œ์ปค(์Šค๋ ˆ๋“œ)๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

```bash
echo "SECRET_TO_DELETE" > delete_secrets.txt
echo "VAR_TO_SET=value" > set_vars.txt
python main.py -o my-org -ds delete_secrets.txt -v set_vars.txt -w 5
```

### ์ธ์ž (Arguments)

๋‹จ์ถ• | ์ „์ฒด ์ธ์ž | ์„ค๋ช… | ํ•„์ˆ˜
:--- | :--------------- | :----------------------------------------------------------------------------- | :---
-o | --organization | ์ž‘์—…ํ•  GitHub ์กฐ์ง ๋˜๋Š” ์‚ฌ์šฉ์ž ์ด๋ฆ„ (์˜ˆ: 'my-org' ๋˜๋Š” 'my-username') | ์˜ˆ
-s | --secrets-file | ์„ค์ •ํ•  Secret ์ด๋ฆ„๊ณผ ๊ฐ’์„ ํฌํ•จํ•˜๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ (์˜ˆ: 'SECRET_NAME=VALUE') | ์•„๋‹ˆ์˜ค
-v | --values-file | ์„ค์ •ํ•  Variable ์ด๋ฆ„๊ณผ ๊ฐ’์„ ํฌํ•จํ•˜๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ (์˜ˆ: 'VAR_NAME=VALUE') | ์•„๋‹ˆ์˜ค
-ds | --ds | ์‚ญ์ œํ•  Secret ์ด๋ฆ„ ๋ชฉ๋ก์„ ํฌํ•จํ•˜๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ (ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ) | ์•„๋‹ˆ์˜ค
-dv | --dv | ์‚ญ์ œํ•  Variable ์ด๋ฆ„ ๋ชฉ๋ก์„ ํฌํ•จํ•˜๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ (ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ) | ์•„๋‹ˆ์˜ค
-tr | --tr | ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ํŠน์ • ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ชฉ๋ก์„ ํฌํ•จํ•˜๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ (ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ, 'repo' ํ˜•์‹). ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด organization๋‚ด์˜ ๋ชจ๋“  repo์— ์ ์šฉ | ์•„๋‹ˆ์˜ค
-w | --workers | ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ตœ๋Œ€ ์›Œ์ปค(์Šค๋ ˆ๋“œ) ์ˆ˜ (๊ธฐ๋ณธ๊ฐ’: '1' - ์ˆœ์ฐจ ์ฒ˜๋ฆฌ) | ์•„๋‹ˆ์˜ค
-sl | --sleep | ๊ฐ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ฒ˜๋ฆฌ ํ›„ ๋Œ€๊ธฐ ์‹œ๊ฐ„(์ดˆ) (์ˆœ์ฐจ ์ฒ˜๋ฆฌ ์‹œ ์ ์šฉ, ๊ธฐ๋ณธ๊ฐ’: '0') | ์•„๋‹ˆ์˜ค
-f | --force | Secret/Variable ์„ค์ • ์‹œ ๊ธฐ์กด ๊ฐ’์„ ๊ฐ•์ œ๋กœ ๋ฎ์–ด์“ธ์ง€ ์—ฌ๋ถ€ (๊ธฐ๋ณธ๊ฐ’: 'False') | ์•„๋‹ˆ์˜ค

---

### ํŒŒ์ผ ํฌ๋งท
1. --secrets-file, --values-file ํฌ๋งท
```txt
# secrets.env ํŒŒ์ผ ์˜ˆ์‹œ:
MY_API_KEY=your_secret_or_value_here
DATABASE_URL=postgres://user:pass@host:port/dbname
```

2. --ds, --dv ํฌ๋งท
```txt
# secrets_to_delete.txt ํŒŒ์ผ ์˜ˆ์‹œ:
MY_API_KEY
DATABASE_URL
```

3. --tr
```txt
repo-name1
repo-name2
repo-name3
```

## ๊ธฐ์—ฌํ•˜๊ธฐ

๊ธฐ์—ฌ๋Š” ์–ธ์ œ๋‚˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค! ๋ฒ„๊ทธ ๋ณด๊ณ , ๊ธฐ๋Šฅ ์ œ์•ˆ, ์ฝ”๋“œ ๊ฐœ์„  ๋“ฑ ์–ด๋–ค ํ˜•ํƒœ์˜ ๊ธฐ์—ฌ๋ผ๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

1. ์ด ์ €์žฅ์†Œ๋ฅผ Fork ํ•ฉ๋‹ˆ๋‹ค.
2. ์ƒˆ๋กœ์šด Feature Branch๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค ('git checkout -b feature/AmazingFeature').
3. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ Commit ํ•ฉ๋‹ˆ๋‹ค ('git commit -m 'Add some AmazingFeature'').
4. Branch๋ฅผ Push ํ•ฉ๋‹ˆ๋‹ค ('git push origin feature/AmazingFeature').
5. Pull Request๋ฅผ ์—ฝ๋‹ˆ๋‹ค.

---

## โœจ ํ”„๋กœ์ ํŠธ๊ฐ€ ์œ ์šฉํ•˜์…จ๋‹ค๋ฉด?

์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ๋งˆ์Œ์— ๋“œ์…จ๊ฑฐ๋‚˜ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์…จ๋‹ค๋ฉด, GitHub์—์„œ **Star**๋ฅผ ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š”! ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ด€์‹ฌ์€ ํ”„๋กœ์ ํŠธ ๋ฐœ์ „์— ํฐ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค.

---

## ๋ผ์ด์„ ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” MIT ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ 'LICENSE' ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.