Updated index.md and github-features-simple.md to include comprehensive navigation between all guide levels (beginner/advanced), creating clear learning paths for users ð€ Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
45 KiB
| layout | title | description |
|---|---|---|
| default | GitHubæ©èœè©³çްã¬ã€ã - å š20æ©èœã®å®å šè§£èª¬ | GitHubã®å šæ©èœãå®äŸãšãã¹ããã©ã¯ãã£ã¹ãšå ±ã«åŸ¹åºè§£èª¬ |
ð GitHubæ©èœè©³çްã¬ã€ã - å š20æ©èœã®å®å šè§£èª¬
GitHubã®å š20æ©èœã«ã€ããŠãå®è·µçãªäœ¿ãæ¹ããããã¬ãã«ã®æŽ»çšæ³ãŸã§åŸ¹åºçã«è§£èª¬ããŸãã
ð ç®æ¬¡
åºæ¬æ©èœïŒ1-6ïŒ
- ãªããžããªïŒRepositoryïŒ
- ãã©ã³ãïŒBranchïŒ
- ã³ãããïŒCommitïŒ
- ãã«ãªã¯ãšã¹ãïŒPull RequestïŒ
- ã€ã·ã¥ãŒïŒIssuesïŒ
- ãããžã§ã¯ãïŒProjectsïŒ
èªååã»å ¬éæ©èœïŒ7-9ïŒ
ãœãŒã·ã£ã«æ©èœïŒ10-12ïŒ
Gitæäœæ©èœïŒ13-16ïŒ
æ¡åŒµæ©èœïŒ17-20ïŒ
- ãã£ã¹ã«ãã·ã§ã³ïŒDiscussionsïŒ
- ã®ã¹ãïŒGistïŒ
- ããã±ãŒãžïŒPackagesïŒ
- ã¹ãã³ãµãŒïŒSponsorsïŒ
1. ð ãªããžããªïŒRepositoryïŒ
æŠèŠ
ãªããžããªã¯ããããžã§ã¯ãã®å šãã¡ã€ã«ãå±¥æŽãèšå®ãä¿åããåºæ¬åäœã§ããGoogleãã©ã€ãã®ãã©ã«ãã«äŒŒãŠããŸããã倿Žå±¥æŽãå®å šã«èšé²ããè€æ°äººã§ã®åæç·šéãå¯èœã«ããŸãã
詳现æ©èœ
ãªããžããªã®çš®é¡
âââââââââââââââââââââââââââââââââââââââââââââââ
â ãªããžããªã¿ã€ã â
âââââââââââââââââââ¬ââââââââââââââââââââââââââââ€
â Public â Private â
âââââââââââââââââââŒââââââââââââââââââââââââââââ€
â â 誰ã§ãé²èŠ§å¯ â â æåŸ
è
ã®ã¿é²èŠ§å¯ â
â â æ€çŽ¢å¯èœ â â æ€çŽ¢äžå¯ â
â â ç¡æã»ç¡å¶é â â ç¡æïŒåäººïŒ â
â â GitHub Pages â â Proçã§Pageså¯ â
âââââââââââââââââââŽââââââââââââââââââââââââââââ
å¿ é ãã¡ã€ã«æ§æ
my-project/
âââ README.md # ãããžã§ã¯ã説æïŒå¿
é ïŒ
âââ LICENSE # ã©ã€ã»ã³ã¹æ
å ±
âââ .gitignore # ç¡èŠãã¡ã€ã«èšå®
âââ .github/ # GitHubèšå®
â âââ workflows/ # Actionsèšå®
â âââ ISSUE_TEMPLATE/
â âââ PULL_REQUEST_TEMPLATE.md
â âââ CODEOWNERS # ã³ãŒããªãŒããŒ
âââ docs/ # ããã¥ã¡ã³ã
âââ src/ # ãœãŒã¹ã³ãŒã
âââ tests/ # ãã¹ãã³ãŒã
å®è·µäŸ
1. ãã³ãã¬ãŒããããªããžããªäœæ
# GitHub CLIã䜿çš
gh repo create my-app --template owner/template-repo --public
# ãã³ãã¬ãŒã䜿çšã®å©ç¹
- æšæºæ§æã®å³æé©çš
- CI/CDèšå®ã®ç¶æ¿
- ã³ãŒãã£ã³ã°èŠçŽã®çµ±äž
2. ã¢ãã¬ãæ§æ
company-monorepo/
âââ packages/
â âââ frontend/ # Reactã¢ããª
â âââ backend/ # Node.js API
â âââ mobile/ # React Native
â âââ shared/ # å
±éã©ã€ãã©ãª
âââ lerna.json # Lernaã¢ãã¬ãèšå®
âââ package.json # ã«ãŒãèšå®
3. ãªããžããªèšå®ã®ãã¹ããã©ã¯ãã£ã¹
# .github/settings.yml (probot/settings䜿çš)
repository:
name: my-project
description: ãããžã§ã¯ãã®èª¬æ
private: false
has_issues: true
has_projects: true
has_wiki: true
has_downloads: true
default_branch: main
allow_squash_merge: true
allow_merge_commit: true
allow_rebase_merge: false
delete_branch_on_merge: true
enable_automated_security_fixes: true
é«åºŠãªæŽ»çš
1. ãªããžããªã€ã³ãµã€ãåæ
Insights â åçš®åæ
âââ Pulse: 鱿¬¡/ææ¬¡ã¢ã¯ãã£ããã£
âââ Contributors: è²¢ç®è
çµ±èš
âââ Community: ã³ãã¥ããã£å¥å
šæ§
âââ Traffic: ã¢ã¯ã»ã¹çµ±èš
âââ Commits: ã³ãããé »åºŠ
âââ Code frequency: ã³ãŒã远å /åé€
âââ Dependency graph: äŸåé¢ä¿
2. ã»ãã¥ãªãã£èšå®
# Security â Settings
- â Dependency alerts
- â Dependabot security updates
- â Code scanning alerts
- â Secret scanning alerts
3. ã¢ã¯ã»ã¹ç®¡ç
Settings â Manage access
âââ Collaborators: å奿åŸ
âââ Teams: ããŒã åäœç®¡ç
âââ Deploy keys: CI/CDçšéµ
ãã©ãã«ã·ã¥ãŒãã£ã³ã°
ãªããžããªãµã€ãºåé¡
# 倧ããªãã¡ã€ã«ã®å±¥æŽåé€
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch path/to/large-file" \
--prune-empty --tag-name-filter cat -- --all
# Git LFSå°å
¥
git lfs track "*.psd"
git lfs track "*.zip"
git add .gitattributes
2. ð¿ ãã©ã³ãïŒBranchïŒ
æŠèŠ
ãã©ã³ãã¯ãã¡ã€ã³ã®ã³ãŒãããåå²ããŠç¬ç«ããéçºãè¡ãããã®ä»çµã¿ã§ããè€æ°ã®æ©èœã䞊è¡éçºããããå®éšçãªå€æŽãå®å šã«è©Šãããšãã§ããŸãã
ãã©ã³ãæŠç¥
1. Git Flow
main (production)
â
âââ develop (éçºçµ±å)
â âââ feature/user-auth
â âââ feature/payment
â âââ feature/notifications
â
âââ release/v1.2.0
â âââ æ¬çªãªãªãŒã¹æºå
â
âââ hotfix/critical-bug
âââ ç·æ¥ä¿®æ£
2. GitHub FlowïŒã·ã³ãã«ïŒ
main
âââ feature/new-feature
âââ fix/bug-123
âââ docs/update-readme
3. GitLab FlowïŒç°å¢å¥ïŒ
main
âââ pre-production
âââ production
âââ feature-branches
å®è·µçãªãã©ã³ãéçš
ãã©ã³ãåœåèŠå
# æ©èœè¿œå
feature/user-authentication
feature/JIRA-123-shopping-cart
# ãã°ä¿®æ£
fix/login-error
bugfix/issue-456
# ããã¥ã¡ã³ã
docs/api-documentation
docs/installation-guide
# ãªãã¡ã¯ã¿ãªã³ã°
refactor/database-optimization
chore/update-dependencies
# ãªãªãŒã¹
release/v2.0.0
release/2023-12-01
ãã©ã³ãä¿è·ã«ãŒã«
# branch protection rules
main:
required_reviews: 2
dismiss_stale_reviews: true
require_code_owner_reviews: true
required_status_checks:
- continuous-integration/travis-ci
- security/snyk
enforce_admins: false
restrictions:
users: []
teams: ["maintainers"]
é«åºŠãªãã©ã³ãæäœ
1. ãã©ã³ãã®æ¯èŒãšããŒãžäºæž¬
# ãã©ã³ãéã®å·®å確èª
git diff main..feature/new-feature
# ããŒãžäºæž¬ïŒãã©ã€ã©ã³ïŒ
git merge --no-commit --no-ff feature/new-feature
git diff --cached
git merge --abort # åãæ¶ã
# ã³ã³ããªã¯ãäºå確èª
git log --oneline --left-right main...feature/new-feature
2. ãã©ã³ãã®ã¯ãªãŒã³ã¢ãã
# ããŒãžæžã¿ãã©ã³ãäžèЧ
git branch --merged main
# ãªã¢ãŒãã®å逿žã¿ãã©ã³ããåæ
git remote prune origin
# äžæ¬åé€ã¹ã¯ãªãã
git branch --merged main | grep -v "main\|develop" | xargs -n 1 git branch -d
3. ãã©ã³ã埩å
# åé€ãããã©ã³ãã埩å
git reflog
git checkout -b recovered-branch HEAD@{2}
ã¯ãŒã¯ãããŒäŸ
ãã£ãŒãã£ãŒãã©ã³ãã¯ãŒã¯ãããŒ
# 1. ææ°ã®mainããåå²
git checkout main
git pull origin main
git checkout -b feature/awesome-feature
# 2. éçºäœæ¥
# ... ã³ãŒãå€æŽ ...
git add .
git commit -m "feat: add awesome feature"
# 3. 宿çã«mainã®å€æŽãåã蟌ã
git checkout main
git pull origin main
git checkout feature/awesome-feature
git rebase main
# 4. ããã·ã¥ããŠPRäœæ
git push origin feature/awesome-feature
gh pr create --fill
3. ðŸ ã³ãããïŒCommitïŒ
æŠèŠ
ã³ãããã¯ããã¡ã€ã«ã®å€æŽãå±¥æŽãšããŠèšé²ããæäœã§ããåã³ãããã¯äžæã®IDãæã¡ããã€ã§ãéå»ã®ç¶æ ã«æ»ãããšãã§ããŸãã
ã³ãããã¡ãã»ãŒãžã®èŠçŽ
Conventional Commits
<type>(<scope>): <subject>
<body>
<footer>
ã¿ã€ãäžèЧ
feat: æ°æ©èœ
fix: ãã°ä¿®æ£
docs: ããã¥ã¡ã³ãã®ã¿ã®å€æŽ
style: ãã©ãŒããã倿ŽïŒã³ãŒãã®åäœã«åœ±é¿ãªãïŒ
refactor: ãªãã¡ã¯ã¿ãªã³ã°
perf: ããã©ãŒãã³ã¹æ¹å
test: ãã¹ã远å ã»ä¿®æ£
chore: ãã«ãããã»ã¹ãããŒã«ã®å€æŽ
ci: CIèšå®ã®å€æŽ
å®äŸ
# è¯ãäŸ
git commit -m "feat(auth): add OAuth2 login support
- Implement Google OAuth2 integration
- Add refresh token handling
- Update user model with OAuth fields
Closes #123"
# æªãäŸ
git commit -m "æŽæ°"
git commit -m "fix"
é«åºŠãªã³ãããæäœ
1. ã€ã³ã¿ã©ã¯ãã£ããªããŒã¹
# çŽè¿3ã€ã®ã³ããããæŽç
git rebase -i HEAD~3
# ãšãã£ã¿ã§æäœãéžæ
pick abc1234 feat: add login
squash def5678 fix: typo
reword ghi9012 docs: update
# çµæ: 3ã€ã®ã³ãããã2ã€ã«æŽçããã
2. ã³ãããã®åå²
# 倧ããããã³ããããåå²
git reset HEAD~1
git add -p # éšåçã«ã¹ããŒãžã³ã°
git commit -m "feat: add user model"
git add -p
git commit -m "feat: add user controller"
3. ã³ãããã®æ€çŽ¢
# ã¡ãã»ãŒãžã§æ€çŽ¢
git log --grep="fix.*login"
# 倿Žå
å®¹ã§æ€çŽ¢
git log -S "function loginUser"
# æ¥ä»ç¯å²
git log --since="2023-01-01" --until="2023-12-31"
# èè
git log --author="John Doe"
ã³ãããããã¯
pre-commitèšå®
# .git/hooks/pre-commit
#!/bin/sh
# ã³ãŒãå質ãã§ãã¯
npm run lint
npm run test:unit
# ã³ãããã¡ãã»ãŒãžæ€èšŒ
commit_regex='^(feat|fix|docs|style|refactor|perf|test|chore|ci)(\(.+\))?: .{1,50}'
if ! grep -qE "$commit_regex" "$1"; then
echo "Invalid commit message format!"
exit 1
fi
眲åä»ãã³ããã
# GPG眲åã®èšå®
git config --global user.signingkey YOUR_GPG_KEY
git config --global commit.gpgsign true
# 眲åä»ãã³ããã
git commit -S -m "feat: secure feature"
# 眲åã®æ€èšŒ
git log --show-signature
4. ð ãã«ãªã¯ãšã¹ãïŒPull RequestïŒ
æŠèŠ
ãã«ãªã¯ãšã¹ãïŒPRïŒã¯ããã©ã³ãã®å€æŽãã¡ã€ã³ãã©ã³ãã«çµ±åããåã«ãã³ãŒãã¬ãã¥ãŒãè°è«ãè¡ãããã®æ©èœã§ãã
PRäœæã®ãã¹ããã©ã¯ãã£ã¹
PRãã³ãã¬ãŒã
<!-- .github/pull_request_template.md -->
## æŠèŠ
<!-- 倿Žã®æŠèŠãèšè¿° -->
## 倿Žã¿ã€ã
- [ ] ð ãã°ä¿®æ£
- [ ] âš æ°æ©èœ
- [ ] ð¥ ç Žå£ç倿Ž
- [ ] ð ããã¥ã¡ã³ãæŽæ°
## é¢é£Issue
Closes #
## 倿Žå
容
<!-- 詳现ãªå€æŽå
容 -->
## ã¹ã¯ãªãŒã³ã·ã§ãã
<!-- UI倿Žã®å Žå -->
## ãã¹ã
- [ ] ãŠããããã¹ã远å /æŽæ°
- [ ] çµ±åãã¹ã宿œ
- [ ] æåãã¹ãå®äº
## ãã§ãã¯ãªã¹ã
- [ ] ã»ã«ãã¬ãã¥ãŒå®æœ
- [ ] ã³ãŒãã£ã³ã°èŠçŽæºæ
- [ ] ããã¥ã¡ã³ãæŽæ°
- [ ] 倿Žå±¥æŽïŒCHANGELOGïŒæŽæ°
PRèªåå
èªåã©ããªã³ã°
# .github/labeler.yml
frontend:
- src/components/**
- src/pages/**
backend:
- api/**
- server/**
documentation:
- docs/**
- '*.md'
tests:
- '**/*.test.js'
- '**/*.spec.ts'
èªåã¢ãµã€ã³
# .github/CODEOWNERS
# ããã³ããšã³ã
/src/components/ @frontend-team
/src/pages/ @frontend-team
# ããã¯ãšã³ã
/api/ @backend-team @tech-lead
# ããã¥ã¡ã³ã
/docs/ @docs-team
*.md @docs-team
é«åºŠãªPR管ç
1. Draft PR掻çš
# Draft PRãšããŠäœæ
gh pr create --draft --title "WIP: New feature"
# æºåå®äºåŸ
gh pr ready 123
2. ã¹ã¿ãã¯åPRïŒäŸåPRïŒ
main
âââ PR #1: feature/database-schema
âââ PR #2: feature/api-endpoints
âââ PR #3: feature/frontend-ui
3. PRèªåããŒãžèšå®
# .github/auto-merge.yml
merge_rules:
- name: èªåããŒãžïŒdependabotïŒ
conditions:
- author = dependabot[bot]
- status-check = continuous-integration/travis-ci
- '#approved-reviews >= 1'
actions:
merge:
method: squash
ã³ãŒãã¬ãã¥ãŒã®ãã¹ããã©ã¯ãã£ã¹
ã¬ãã¥ãŒã³ã¡ã³ãã®æžãæ¹
# 建èšçãªã³ã¡ã³ãäŸ
## ð€ 質å
ãã®ã¢ãããŒããéžãã çç±ãæããŠããã ããŸããïŒ
å¥ã®æ¹æ³ãšããŠãããèããããŸãããæ€èšãããŸãããïŒ
## ð¡ ææ¡
```suggestion
const result = users.filter(u => u.active).map(u => u.name);
ããã©ãŒãã³ã¹ãèæ ®ããŠãfilterãšmapã1åã®reduceã«ãŸãšããããšãææ¡ããŸãã
â ïž æžå¿µäºé
ãã®ã³ãŒãã¯N+1åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã ããŒã¿ããŒããŒã®äœ¿çšãæ€èšããŠãã ããã
â è¯ãç¹
ãšã©ãŒãã³ããªã³ã°ãé©åã«å®è£ ãããŠããŠçŽ æŽãããã§ãïŒ
---
## 5. ð« ã€ã·ã¥ãŒïŒIssuesïŒ
### æŠèŠ
Issuesã¯ããã°å ±åãæ©èœèŠæãã¿ã¹ã¯ç®¡çã質åãªã©ããããžã§ã¯ãã«é¢ããããããè°è«ã管çããæ©èœã§ãã
### Issue掻çšãã¿ãŒã³
#### 1. ãã°å ±åãã³ãã¬ãŒã
```markdown
<!-- .github/ISSUE_TEMPLATE/bug_report.md -->
---
name: ãã°å ±å
about: ãã°ã®å ±åã¯ãã¡ã
title: '[BUG] '
labels: bug, triage
assignees: ''
---
## ãã°ã®æŠèŠ
<!-- ç°¡æœãªèª¬æ -->
## åçŸæé
1.
2.
3.
## æåŸ
ãããåäœ
<!-- æ£åžžãªåäœ -->
## å®éã®åäœ
<!-- ãã°ã®åäœ -->
## ç°å¢
- OS: [e.g. macOS 13.0]
- ãã©ãŠã¶: [e.g. Chrome 100]
- ããŒãžã§ã³: [e.g. 1.0.0]
## ã¹ã¯ãªãŒã³ã·ã§ãã
<!-- 該åœããå Žå -->
## ãã°
ãšã©ãŒãã°ãããã«è²Œä»
2. æ©èœèŠæãã³ãã¬ãŒã
<!-- .github/ISSUE_TEMPLATE/feature_request.md -->
---
name: æ©èœèŠæ
about: æ°æ©èœã®ææ¡
title: '[FEATURE] '
labels: enhancement
---
## æ©èœã®æŠèŠ
<!-- ææ¡ããæ©èœã®èª¬æ -->
## 解決ããã課é¡
<!-- ãã®æ©èœã§è§£æ±ºãããåé¡ -->
## ææ¡ãã解決ç
<!-- å®è£
æ¹æ³ã®ææ¡ -->
## ä»£æ¿æ¡
<!-- ä»ã®è§£æ±ºæ¹æ³ -->
## è¿œå æ
å ±
<!-- åèè³æããªã³ã¯ -->
é«åºŠãªIssue管ç
1. ã©ãã«äœç³»
# åªå
床
- P0: Critical
- P1: High
- P2: Medium
- P3: Low
# ã¿ã€ã
- bug: ãã°
- enhancement: æ©èœæ¹å
- documentation: ããã¥ã¡ã³ã
- question: 質å
# ç¶æ
- triage: ããªã¢ãŒãžåŸ
ã¡
- in-progress: äœæ¥äž
- blocked: ãããã¯äž
- ready-for-review: ã¬ãã¥ãŒåŸ
ã¡
# ã³ã³ããŒãã³ã
- frontend
- backend
- database
- infrastructure
2. èªååã«ãŒã«
# .github/workflows/issue-automation.yml
name: Issue Automation
on:
issues:
types: [opened, labeled]
jobs:
auto-assign:
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v6
with:
script: |
// ã©ãã«ã«åºã¥ãèªåã¢ãµã€ã³
const labelAssignees = {
'frontend': ['frontend-lead'],
'backend': ['backend-lead'],
'urgent': ['tech-lead', 'manager']
};
const labels = context.payload.issue.labels;
const assignees = new Set();
labels.forEach(label => {
const users = labelAssignees[label.name];
if (users) users.forEach(u => assignees.add(u));
});
if (assignees.size > 0) {
await github.rest.issues.addAssignees({
...context.repo,
issue_number: context.issue.number,
assignees: Array.from(assignees)
});
}
3. Issueåæããã·ã¥ããŒã
// GitHub GraphQL APIã䜿çšããåæ
const query = `
query($owner: String!, $repo: String!) {
repository(owner: $owner, name: $repo) {
issues(first: 100, states: OPEN) {
totalCount
edges {
node {
createdAt
closedAt
labels(first: 10) {
nodes { name }
}
assignees(first: 5) {
nodes { login }
}
}
}
}
}
}
`;
// å¹³å解決æéãã©ãã«å¥çµ±èšãªã©ãèšç®
6. ð ãããžã§ã¯ãïŒProjectsïŒ
æŠèŠ
GitHub Projectsã¯ãã«ã³ãã³ããŒããããŒãã«åœ¢åŒã§ã¿ã¹ã¯ãèŠèŠçã«ç®¡çã§ããæ©èœã§ããIssueãPRãšé£æºããŠããããžã§ã¯ãå šäœã®é²æãææ¡ã§ããŸãã
Projects v2ã®æŽ»çš
ãã¥ãŒã¿ã€ã
1. Board ViewïŒã«ã³ãã³ïŒ
âââ ãã©ãã°&ããããã§çŽæç
2. Table ViewïŒè¡šåœ¢åŒïŒ
âââ ãã£ã«ã¿ã»ãœãŒãã§åæ
3. Roadmap ViewïŒã¿ã€ã ã©ã€ã³ïŒ
âââ ã¹ã±ãžã¥ãŒã«ç®¡ç
ã«ã¹ã¿ã ãã£ãŒã«ã
fields:
- name: Priority
type: single_select
options: [High, Medium, Low]
- name: Story Points
type: number
- name: Sprint
type: iteration
duration: 2 weeks
- name: Start Date
type: date
- name: Team
type: single_select
options: [Frontend, Backend, QA, DevOps]
å®è·µçãªãããžã§ã¯ãèšå®
ã¹ã¯ã©ã éçºãã³ãã¬ãŒã
ð Sprint Board
âââ ð¥ Backlog
âââ ð¯ Sprint Planning
âââ ð§ In Progress
âââ ð In Review
âââ â
Done
âââ ð¢ Deployed
èªååã¯ãŒã¯ãããŒ
# ãããžã§ã¯ãèªåå
workflows:
- name: æ°èŠIssue远å
trigger: item_added
if: item.type == "issue"
then:
- set_field: "Status", "Backlog"
- set_field: "Priority", "Medium"
- name: PRäœææ
trigger: item_added
if: item.type == "pull_request"
then:
- set_field: "Status", "In Review"
- link_to_issue
- name: å®äºæ
trigger: item_closed
then:
- set_field: "Status", "Done"
- set_field: "Completed Date", current_date()
é«åºŠãªæŽ»çšäŸ
1. ããã·ãã£ãã©ããã³ã°
// ã¹ããªã³ãå¥ã®å®äºãã€ã³ãéèš
const calculateVelocity = (projectItems) => {
const sprintVelocity = {};
projectItems
.filter(item => item.status === 'Done')
.forEach(item => {
const sprint = item.fields.sprint;
const points = item.fields.storyPoints || 0;
sprintVelocity[sprint] = (sprintVelocity[sprint] || 0) + points;
});
return sprintVelocity;
};
2. ããŒã³ããŠã³ãã£ãŒã
graph LR
A[Sprint Start: 50pts] --> B[Day 3: 42pts]
B --> C[Day 6: 28pts]
C --> D[Day 9: 15pts]
D --> E[Sprint End: 0pts]
3. è€æ°ãªããžããªçµ±å
# Organization-level project
repositories:
- frontend-app
- backend-api
- mobile-app
- shared-components
sync_rules:
- source: "*/issues"
filter: "label:epic"
destination: "Epic Board"
7. â¡ ã¢ã¯ã·ã§ã³ïŒActionsïŒ
æŠèŠ
GitHub Actionsã¯ãCI/CDãèªååã宿å®è¡ãªã©ãããããã¯ãŒã¯ãããŒãå®è¡ã§ãã匷åãªèªååãã©ãããã©ãŒã ã§ãã
åºæ¬æ§é
name: ã¯ãŒã¯ãããŒå
on: [ããªã¬ãŒã€ãã³ã]
env:
GLOBAL_VAR: value
jobs:
job-name:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: ã¹ãããå
run: |
å®è¡ã³ãã³ã
å®è·µçãªã¯ãŒã¯ãããŒäŸ
1. ãã«ãç°å¢CI/CD
name: CI/CD Pipeline
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
env:
NODE_VERSION: '18'
jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
node: [16, 18, 20]
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run tests
run: |
npm run lint
npm run test:unit
npm run test:integration
- name: Upload coverage
uses: codecov/codecov-action@v3
with:
token: ${{ secrets.CODECOV_TOKEN }}
build:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build application
run: |
npm ci
npm run build
- name: Build Docker image
run: |
docker build -t ${{ github.repository }}:${{ github.sha }} .
docker tag ${{ github.repository }}:${{ github.sha }} ${{ github.repository }}:latest
- name: Push to registry
if: github.ref == 'refs/heads/main'
run: |
echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
docker push ${{ github.repository }}:${{ github.sha }}
docker push ${{ github.repository }}:latest
deploy:
needs: build
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
environment: production
steps:
- name: Deploy to Kubernetes
run: |
kubectl set image deployment/app app=${{ github.repository }}:${{ github.sha }}
kubectl rollout status deployment/app
2. 宿å®è¡ã¯ãŒã¯ãããŒ
name: Scheduled Tasks
on:
schedule:
# æ¯æ¥ 9:00 JST
- cron: '0 0 * * *'
# æ¯é±ææ 10:00 JST
- cron: '0 1 * * 1'
jobs:
security-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run security audit
run: |
npm audit
pip-audit
bundle-audit check
- name: Dependency check
uses: dependency-check/Dependency-Check_Action@main
with:
project: 'my-project'
path: '.'
format: 'HTML'
- name: Upload reports
uses: actions/upload-artifact@v3
with:
name: security-reports
path: reports/
backup:
runs-on: ubuntu-latest
steps:
- name: Backup database
run: |
pg_dump ${{ secrets.DATABASE_URL }} > backup.sql
aws s3 cp backup.sql s3://backups/$(date +%Y%m%d).sql
3. é«åºŠãªæ¡ä»¶åå²
name: Conditional Workflow
on: [push, pull_request]
jobs:
determine-changes:
runs-on: ubuntu-latest
outputs:
frontend: ${{ steps.filter.outputs.frontend }}
backend: ${{ steps.filter.outputs.backend }}
docs: ${{ steps.filter.outputs.docs }}
steps:
- uses: actions/checkout@v4
- uses: dorny/paths-filter@v2
id: filter
with:
filters: |
frontend:
- 'src/**'
- 'public/**'
- 'package.json'
backend:
- 'api/**'
- 'server/**'
- 'requirements.txt'
docs:
- 'docs/**'
- '*.md'
frontend-tests:
needs: determine-changes
if: needs.determine-changes.outputs.frontend == 'true'
runs-on: ubuntu-latest
steps:
- run: echo "Frontend changed, running tests..."
backend-tests:
needs: determine-changes
if: needs.determine-changes.outputs.backend == 'true'
runs-on: ubuntu-latest
steps:
- run: echo "Backend changed, running tests..."
ã«ã¹ã¿ã ã¢ã¯ã·ã§ã³éçº
JavaScript Action
# action.yml
name: 'Custom Action'
description: 'ã«ã¹ã¿ã ã¢ã¯ã·ã§ã³ã®èª¬æ'
inputs:
token:
description: 'GitHub token'
required: true
outputs:
result:
description: 'åŠççµæ'
runs:
using: 'node16'
main: 'dist/index.js'
// index.js
const core = require('@actions/core');
const github = require('@actions/github');
async function run() {
try {
const token = core.getInput('token');
const octokit = github.getOctokit(token);
// ã«ã¹ã¿ã ããžãã¯
const result = await processData(octokit);
core.setOutput('result', result);
} catch (error) {
core.setFailed(error.message);
}
}
run();
8. ð ããŒãžïŒPagesïŒ
æŠèŠ
GitHub Pagesã¯ããªããžããªããçŽæ¥éçWebãµã€ãããã¹ãã£ã³ã°ã§ããç¡æãµãŒãã¹ã§ãã
èšå®ãã¿ãŒã³
1. åºæ¬èšå®
# _config.yml (Jekyll)
title: My Awesome Site
description: ãµã€ãã®èª¬æ
url: https://username.github.io
baseurl: /repository-name
theme: minima
plugins:
- jekyll-feed
- jekyll-sitemap
- jekyll-seo-tag
2. ã«ã¹ã¿ã ãã¡ã€ã³èšå®
# CNAME
www.example.com
# DNSèšå®
A @ 185.199.108.153
A @ 185.199.109.153
A @ 185.199.110.153
A @ 185.199.111.153
CNAME www username.github.io
é«åºŠãªæŽ»çš
1. è€æ°ã®éçãµã€ããžã§ãã¬ãŒã¿
# Hugo
name: Deploy Hugo site
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: 'latest'
extended: true
- name: Build
run: hugo --minify
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./public
2. SPAïŒSingle Page ApplicationïŒ
# React/Vue/Angular
name: Deploy SPA
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
- name: Install and Build
run: |
npm ci
npm run build
env:
REACT_APP_API_URL: ${{ secrets.API_URL }}
- name: Deploy
uses: JamesIves/github-pages-deploy-action@v4
with:
folder: build
clean: true
3. ããã¥ã¡ã³ããµã€ã
# VitePress/Docusaurus
name: Deploy Docs
on:
push:
branches: [main]
paths:
- 'docs/**'
- 'package.json'
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build VitePress site
run: |
npm ci
npm run docs:build
- name: Deploy to GitHub Pages
uses: crazy-max/ghaction-github-pages@v3
with:
target_branch: gh-pages
build_dir: docs/.vitepress/dist
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ããã©ãŒãã³ã¹æé©å
# æé©åèšå®
optimization:
- HTML minification
- CSS/JS minification
- Image optimization
- Lazy loading
- Service Worker
- CDN integration
# ãã£ãã·ã¥èšå®
cache_control:
- "*.html": "no-cache"
- "*.css": "max-age=31536000"
- "*.js": "max-age=31536000"
- "*.jpg": "max-age=31536000"
9. ð ãŠã£ãïŒWikiïŒ
æŠèŠ
GitHubã®Wikiã¯ããããžã§ã¯ãã®è©³çްãªããã¥ã¡ã³ããäœæã»ç®¡çããããã®æ©èœã§ãããªããžããªãšã¯ç¬ç«ããGitãªããžããªãšããŠç®¡çãããŸãã
Wikiæ§æã®ãã¹ããã©ã¯ãã£ã¹
ãã£ã¬ã¯ããªæ§é
Home.md
âââ Getting-Started/
â âââ Installation.md
â âââ Configuration.md
â âââ Quick-Start.md
âââ User-Guide/
â âââ Basic-Usage.md
â âââ Advanced-Features.md
â âââ Troubleshooting.md
âââ API-Reference/
â âââ REST-API.md
â âââ GraphQL-API.md
â âââ Webhooks.md
âââ Contributing/
âââ Code-Style.md
âââ Testing.md
âââ Release-Process.md
é«åºŠãªWiki管ç
1. Wikiã®èªåçæ
name: Generate Wiki
on:
push:
branches: [main]
paths:
- 'src/**'
- 'docs/**'
jobs:
wiki:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Generate API docs
run: |
npm run docs:generate
- name: Sync to Wiki
uses: SwiftDocOrg/github-wiki-publish-action@v1
with:
path: docs/generated
env:
GH_PERSONAL_ACCESS_TOKEN: ${{ secrets.GH_PAT }}
2. Wikiæ€çŽ¢æ©èœã®å®è£
// Wikiå
æ€çŽ¢ïŒã«ã¹ã¿ã å®è£
ïŒ
class WikiSearch {
constructor(pages) {
this.index = this.buildIndex(pages);
}
buildIndex(pages) {
return pages.map(page => ({
title: page.title,
content: page.content.toLowerCase(),
tokens: this.tokenize(page.content),
url: page.url
}));
}
search(query) {
const queryTokens = this.tokenize(query.toLowerCase());
return this.index
.map(page => ({
...page,
score: this.calculateScore(page.tokens, queryTokens)
}))
.filter(page => page.score > 0)
.sort((a, b) => b.score - a.score);
}
}
10. ðïž ãŠã©ããïŒWatchïŒ
æŠèŠ
Watchã¯ããªããžããªã®æŽ»åãç£èŠããéç¥ãåãåãããã®æ©èœã§ãã
éç¥ã¬ãã«ã®è©³çް
âââââââââââââââââââââââââââââââââââââââââââââââââââ
â Watchèšå®ã¬ãã« â
ââââââââââââââââ¬âââââââââââââââââââââââââââââââââââ€
â Not watching â åå ããŠããIssue/PRã®ã¿éç¥ â
â Releases onlyâ ãªãªãŒã¹æã®ã¿éç¥ â
â Watching â ãã¹ãŠã®æŽ»åãéç¥ â
â Ignoring â éç¥ãå®å
šã«ç¡å¹å â
ââââââââââââââââŽâââââââââââââââââââââââââââââââââââ
ã«ã¹ã¿ã éç¥èšå®
1. éç¥ãã£ã«ã¿ãªã³ã°
// GitHub API ã䜿çšããéç¥ç®¡ç
const filterNotifications = async (octokit) => {
const notifications = await octokit.rest.activity.listNotificationsForAuthenticatedUser();
return notifications.data.filter(notification => {
// éèŠåºŠã§ãã£ã«ã¿
if (notification.reason === 'security_alert') return true;
if (notification.reason === 'mention') return true;
if (notification.reason === 'review_requested') return true;
// ãã以å€ã¯ç¡èŠ
return false;
});
};
2. éç¥ã®èªååŠç
name: Process Notifications
on:
schedule:
- cron: '*/30 * * * *' # 30åããš
jobs:
process:
runs-on: ubuntu-latest
steps:
- name: Auto-respond to notifications
uses: actions/github-script@v6
with:
script: |
const notifications = await github.rest.activity.listNotificationsForAuthenticatedUser();
for (const notification of notifications.data) {
if (notification.reason === 'ci_activity' && notification.subject.title.includes('passed')) {
// CIæåéç¥ã¯æ¢èªã«ãã
await github.rest.activity.markThreadAsRead({
thread_id: notification.id
});
}
}
11. â ã¹ã¿ãŒïŒStarïŒ
æŠèŠ
Starã¯ãæ°ã«å ¥ã£ããªããžããªãããã¯ããŒã¯ãããããžã§ã¯ããžã®æ¯æã衚æããæ©èœã§ãã
ã¹ã¿ãŒã®æŽ»ç𿹿³
1. ã¹ã¿ãŒå±¥æŽã®åæ
import requests
import matplotlib.pyplot as plt
from datetime import datetime
def analyze_star_history(owner, repo):
# GitHub APIã§ã¹ã¿ãŒå±¥æŽãååŸ
headers = {'Accept': 'application/vnd.github.star+json'}
stars = []
page = 1
while True:
response = requests.get(
f'https://api.github.com/repos/{owner}/{repo}/stargazers',
headers=headers,
params={'per_page': 100, 'page': page}
)
if not response.json():
break
stars.extend(response.json())
page += 1
# æ¥ä»ããšã«éèš
dates = [datetime.fromisoformat(s['starred_at'].replace('Z', '')) for s in stars]
cumulative_stars = range(1, len(dates) + 1)
# ã°ã©ãå
plt.plot(dates, cumulative_stars)
plt.xlabel('Date')
plt.ylabel('Stars')
plt.title(f'{owner}/{repo} Star History')
plt.show()
2. ã¹ã¿ãŒããŒã¹ã®æšèŠã·ã¹ãã
// ãŠãŒã¶ãŒã®ã¹ã¿ãŒåŸåããé¡äŒŒãããžã§ã¯ããæšèŠ
async function recommendProjects(username) {
const starredRepos = await getStarredRepos(username);
const topics = extractTopics(starredRepos);
const languages = extractLanguages(starredRepos);
// é¡äŒŒãããžã§ã¯ããæ€çŽ¢
const recommendations = await searchSimilarRepos({
topics,
languages,
minStars: 100,
exclude: starredRepos.map(r => r.full_name)
});
return recommendations;
}
12. ðŽ ãã©ãŒã¯ïŒForkïŒ
æŠèŠ
Forkã¯ãä»ã®ãŠãŒã¶ãŒã®ãªããžããªãèªåã®ã¢ã«ãŠã³ãã«ã³ããŒããç¬ç«ããŠéçºãé²ããããæ©èœã§ãã
ãã©ãŒã¯ã¯ãŒã¯ãããŒ
1. ã³ã³ããªãã¥ãŒã·ã§ã³ãããŒ
# 1. ãã©ãŒã¯åŸã®ã»ããã¢ãã
git clone https://github.com/YOUR_USERNAME/FORKED_REPO.git
cd FORKED_REPO
git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git
# 2. ææ°ã®å€æŽãåã蟌ã
git fetch upstream
git checkout main
git merge upstream/main
# 3. æ©èœãã©ã³ãã§äœæ¥
git checkout -b feature/my-contribution
# ... 倿Žãå ãã ...
git commit -m "feat: add awesome feature"
# 4. ããã·ã¥ããŠPRäœæ
git push origin feature/my-contribution
gh pr create --repo ORIGINAL_OWNER/ORIGINAL_REPO
2. ãã©ãŒã¯ã®åæèªåå
name: Sync Fork
on:
schedule:
- cron: '0 0 * * *' # æ¯æ¥
workflow_dispatch:
jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
token: ${{ secrets.PAT }}
- name: Sync upstream changes
run: |
git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git
git fetch upstream
git checkout main
git merge upstream/main
git push origin main
13-16. Gitæäœæ©èœïŒClone/Push/Pull/MergeïŒ
13. ð¥ ã¯ããŒã³ïŒCloneïŒ
åºæ¬çãªã¯ããŒã³
# HTTPS
git clone https://github.com/user/repo.git
# SSH
git clone git@github.com:user/repo.git
# ç¹å®ã®ãã©ã³ã
git clone -b develop https://github.com/user/repo.git
# æµ
ãã¯ããŒã³ïŒå±¥æŽãéå®ïŒ
git clone --depth 1 https://github.com/user/repo.git
# ãµãã¢ãžã¥ãŒã«å«ã
git clone --recursive https://github.com/user/repo.git
å€§èŠæš¡ãªããžããªã®å¹ççãªã¯ããŒã³
# éšåã¯ããŒã³ïŒPartial CloneïŒ
git clone --filter=blob:none https://github.com/large/repo.git
# ã¹ããŒã¹ãã§ãã¯ã¢ãŠã
git clone --no-checkout https://github.com/large/repo.git
cd repo
git sparse-checkout init --cone
git sparse-checkout set src/specific-folder
git checkout main
14. â¬ïž ããã·ã¥ïŒPushïŒ
é«åºŠãªããã·ã¥æäœ
# 匷å¶ããã·ã¥ïŒæ³šæïŒïŒ
git push --force-with-lease origin feature-branch
# ã¿ã°ãããã·ã¥
git push origin v1.0.0
git push origin --tags
# åé€ãããã·ã¥
git push origin --delete old-branch
# ç¹å®ã®ã³ããããŸã§ããã·ã¥
git push origin HEAD~3:feature-branch
15. â¬ïž ãã«ïŒPullïŒ
ãã«æŠç¥
# ãªããŒã¹ã§ãã«
git pull --rebase origin main
# èªåã¹ã¿ãã·ã¥
git pull --autostash
# ãã«ã®è©³çŽ°ç¢ºèª
git pull --verbose --progress
16. ð ããŒãžïŒMergeïŒ
ããŒãžæŠç¥
# éåžžã®ããŒãž
git merge feature-branch
# Squash ããŒãž
git merge --squash feature-branch
# No-FF ããŒãžïŒå¿
ãããŒãžã³ãããäœæïŒ
git merge --no-ff feature-branch
# Octopus ããŒãžïŒè€æ°ãã©ã³ãïŒ
git merge feature-1 feature-2 feature-3
17. ð¬ ãã£ã¹ã«ãã·ã§ã³ïŒDiscussionsïŒ
æŠèŠ
Discussionsã¯ãã³ãã¥ããã£ãšã®å¯Ÿè©±ãQ&Aãã¢ã€ãã¢å ±æã®ããã®ãã©ãŒã©ã æ©èœã§ãã
ã«ããŽãªèšå®
categories:
- name: Announcements
description: éèŠãªãç¥ãã
emoji: ð¢
discussion_type: announcement
- name: Q&A
description: 質åãšåç
emoji: â
discussion_type: q&a
- name: Ideas
description: ã¢ã€ãã¢ãšææ¡
emoji: ð¡
discussion_type: ideas
- name: Show and Tell
description: äœå玹ä»
emoji: ðš
discussion_type: general
é«åºŠãªæŽ»çš
1. Discussion ãã³ãã¬ãŒã
<!-- .github/DISCUSSION_TEMPLATE/questions.yml -->
name: 質å
description: ãããžã§ã¯ãã«é¢ãã質å
title: "[Question]: "
labels: ["question"]
body:
- type: dropdown
id: category
attributes:
label: ã«ããŽãª
options:
- äœ¿ãæ¹
- ã€ã³ã¹ããŒã«
- ãã°ããïŒ
- ãã®ä»
validations:
required: true
- type: textarea
id: question
attributes:
label: 質åå
容
description: ã§ããã ã詳ããèšèŒããŠãã ãã
validations:
required: true
2. Discussion åæ
# GitHub GraphQL APIã§Discussionåæ
query = """
query($owner: String!, $repo: String!) {
repository(owner: $owner, name: $repo) {
discussions(first: 100) {
nodes {
title
category { name }
createdAt
comments { totalCount }
reactions { totalCount }
answerChosenAt
}
}
}
}
"""
# ã«ããŽãªå¥ã®æŽ»çºåºŠãåççãªã©ãåæ
18. ð ã®ã¹ãïŒGistïŒ
æŠèŠ
Gistã¯ãã³ãŒãã¹ãããããã¡ã¢ãç°¡åã«å ±æã§ããæ©èœã§ãã
掻çšãã¿ãŒã³
1. èšå®ãã¡ã€ã«ç®¡ç
# dotfiles管ç
https://gist.github.com/username/xxxxx
âââ .vimrc
âââ .bashrc
âââ .gitconfig
âââ .tmux.conf
# ã€ã³ã¹ããŒã«ã¹ã¯ãªãã
curl -sL https://gist.github.com/username/xxxxx/raw/install.sh | bash
2. ã³ãŒãã¹ããããã©ã€ãã©ãª
// 䟿å©ãªé¢æ°é
const utils = {
debounce: (func, wait) => {
let timeout;
return (...args) => {
clearTimeout(timeout);
timeout = setTimeout(() => func.apply(this, args), wait);
};
},
deepClone: (obj) => {
return JSON.parse(JSON.stringify(obj));
},
formatDate: (date, format) => {
// æ¥ä»ãã©ãŒãããå®è£
}
};
3. Gist API掻çš
import requests
class GistManager:
def __init__(self, token):
self.token = token
self.headers = {
'Authorization': f'token {token}',
'Accept': 'application/vnd.github.v3+json'
}
def create_gist(self, description, files, public=True):
data = {
'description': description,
'public': public,
'files': files
}
response = requests.post(
'https://api.github.com/gists',
headers=self.headers,
json=data
)
return response.json()
def update_gist(self, gist_id, files):
data = {'files': files}
response = requests.patch(
f'https://api.github.com/gists/{gist_id}',
headers=self.headers,
json=data
)
return response.json()
19. ðŠ ããã±ãŒãžïŒPackagesïŒ
æŠèŠ
GitHub Packagesã¯ããœãããŠã§ã¢ããã±ãŒãžããã¹ãã£ã³ã°ã»é åžããããã®ã¬ãžã¹ããªãµãŒãã¹ã§ãã
åçš®ããã±ãŒãžã®èšå®
1. npm ããã±ãŒãž
// package.json
{
"name": "@username/package-name",
"version": "1.0.0",
"publishConfig": {
"registry": "https://npm.pkg.github.com"
}
}
# .npmrc
@username:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN}
2. Docker ã€ã¡ãŒãž
# Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
# èªåãã«ãã»ããã·ã¥
name: Docker Build and Push
on:
push:
tags:
- 'v*'
jobs:
docker:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: |
ghcr.io/${{ github.repository }}:latest
ghcr.io/${{ github.repository }}:${{ github.ref_name }}
cache-from: type=gha
cache-to: type=gha,mode=max
3. Maven ããã±ãŒãž
<!-- pom.xml -->
<distributionManagement>
<repository>
<id>github</id>
<name>GitHub Packages</name>
<url>https://maven.pkg.github.com/OWNER/REPOSITORY</url>
</repository>
</distributionManagement>
20. ð ã¹ãã³ãµãŒïŒSponsorsïŒ
æŠèŠ
GitHub Sponsorsã¯ããªãŒãã³ãœãŒã¹éçºè ãééçã«æ¯æŽããããã®ãã©ãããã©ãŒã ã§ãã
ã¹ãã³ãµãŒèšå®
1. ãããã£ãŒã«èšå®
# .github/FUNDING.yml
github: [username1, username2]
patreon: username
open_collective: username
ko_fi: username
tidelift: npm/package-name
community_bridge: project-name
liberapay: username
issuehunt: username
otechie: username
custom: ['https://www.paypal.me/username']
2. ã¹ãã³ãµãŒãã£ã¢èšå®
tiers:
- name: "â Coffee Supporter"
amount: 3
description: |
ãã°ä¿®æ£ã®åªå
察å¿
Discordã§ã®ç¹å¥ããŒã«
rewards:
- Priority bug fixes
- Special Discord role
- name: "ð Pro Supporter"
amount: 10
description: |
æ©èœãªã¯ãšã¹ãã®åªå
æ€èš
ææ¬¡é²æã¬ããŒã
README ã«ãååæ²èŒ
rewards:
- Feature request priority
- Monthly progress reports
- Name in README
- name: "ð¢ Corporate Sponsor"
amount: 100
description: |
å°çšãµããŒããã£ã³ãã«
ããŽæ²èŒ
ååæããŒãã£ã³ã°
rewards:
- Dedicated support
- Logo placement
- Quarterly meetings
3. ã¹ãã³ãµãŒç®¡çèªåå
name: Sponsor Management
on:
sponsorship:
types: [created, cancelled, edited, pending_cancellation, pending_tier_change, tier_changed]
jobs:
update-sponsors:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Update sponsor list
uses: actions/github-script@v6
with:
script: |
const sponsors = await github.graphql(`
query {
user(login: "${{ github.repository_owner }}") {
sponsorshipsAsMaintainer(first: 100) {
nodes {
sponsor { login, name }
tier { name, monthlyPriceInDollars }
}
}
}
}
`);
// READMEæŽæ°ããžãã¯
updateReadmeSponsors(sponsors);
- name: Send thank you message
if: github.event.action == 'created'
run: |
echo "New sponsor: ${{ github.event.sponsorship.sponsor.login }}"
# æè¬ã®ã¡ãã»ãŒãžéä¿¡
ãŸãšã
GitHubã®20æ©èœã¯ããããããç¬ç«ããŠåŒ·åã§ãããªãããçµã¿åãããããšã§ããã«å€§ããªäŸ¡å€ãçã¿åºããŸãããã®ã¬ã€ãã§ç޹ä»ããå®è·µäŸããã¹ããã©ã¯ãã£ã¹ãåèã«ããããžã§ã¯ãã«æé©ãªäœ¿ãæ¹ãèŠã€ããŠãã ããã
次ã®ã¹ããã
- åºæ¬æ©èœã®ç¿åŸ: ãŸãã¯1-6ã®åºæ¬æ©èœããã¹ã¿ãŒ
- èªååã®å°å ¥: Actions ã䜿ã£ãå¹çå
- ã³ãã¥ããã£æ§ç¯: Discussions ã Sponsors ã®æŽ»çš
- ç¶ç¶çãªæ¹å: Insights ã§ããŒã¿åæ
質åãææ¡ãããã°ãDiscussions ã§ãåŸ ã¡ããŠããŸãïŒ