diff --git a/.github/workflows/repos.yml b/.github/workflows/repos.yml new file mode 100644 index 0000000..74f7eca --- /dev/null +++ b/.github/workflows/repos.yml @@ -0,0 +1,64 @@ +name: Preview or update Pulumi app nf-core/github-repos/prod +on: + push: + branches: + - main + paths: + - "pulumi/github/repos/**/*" + pull_request: + branches: + - main + paths: + - "pulumi/github/repos/**/*" + +# These are the environment variables that jobs in the workflow have access to. +# By defining them here, all jobs/steps will have access to these variables. +env: + # IMPORTANT! You must map the env vars for your cloud provider here even though you add them as secrets + # to this repository. + # See the setup page for cloud providers here: https://www.pulumi.com/docs/intro/cloud-providers/. + # For example, if you are using AWS, then you should add the following: + # AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + # AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} + PULUMI_STACK_NAME: nf-core/github-repos/prod + PULUMI_WORKING_DIRECTORY: pulumi/github/repos/ + +jobs: + pulumi: + name: Pulumi + runs-on: ubuntu-latest + steps: + # Turnstyle is used to prevent multiple push jobs from running at the same time. We + # limit it to push jobs to allow PR jobs to run concurrently. + - name: Turnstyle + if: ${{ github.event_name == 'push' }} + uses: softprops/turnstyle@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/checkout@v2 + + - name: Install Python + uses: actions/setup-python@v5 + cache: 'pip' + + - run: pip install -r requirements.txt + working-directory: ${{ env.PULUMI_WORKING_DIRECTORY }} + + - name: PR previews + if: ${{ github.event_name == 'pull_request' }} + uses: pulumi/actions@v3 + with: + command: preview + stack-name: ${{ env.PULUMI_STACK_NAME }} + work-dir: ${{ env.PULUMI_WORKING_DIRECTORY }} + + - name: Apply infrastructure update + if: ${{ github.event_name == 'push' }} + uses: pulumi/actions@v3 + with: + command: up + stack-name: ${{ env.PULUMI_STACK_NAME }} + work-dir: ${{ env.PULUMI_WORKING_DIRECTORY }} + diff --git a/docs/1password.md b/docs/1password.md new file mode 100644 index 0000000..6159912 --- /dev/null +++ b/docs/1password.md @@ -0,0 +1,28 @@ +# Pulumi + +[Pulumi Shell Plugin](https://developer.1password.com/docs/cli/shell-plugins/pulumi/) + +[How to use 1Password with different accounts automatically](https://developer.1password.com/docs/cli/shell-plugins/multiple-accounts/) + +```console +cd ~/src/nf-core + +op signin + +# Select nf-core + +op plugin init pulumi +``` + +This should result in: +``` + +Pulumi CLI +Authenticate with Pulumi Personal Access Token. + +? Locate your Pulumi Personal Access Token: Search in 1Password... + +? Locate your Pulumi Personal Access Token: Pulumi Personal Access Token (Private) + +? Configure when the chosen credential(s) will be used to authenticate: Use automatically when in this directory or subdirectories +``` diff --git a/docs/pulumi.md b/docs/pulumi.md new file mode 100644 index 0000000..ad430fb --- /dev/null +++ b/docs/pulumi.md @@ -0,0 +1,72 @@ +# Pulumi + +nf-core specific docs, links and guides. + +## Quick Start + +### Repo structure + +This repo is a "Monorepo", basically a bunch of smaller projects inside of one bigger project. + +```console +tree -L 1 pulumi +pulumi +├── AWSMegatests +├── github +├── repo-backups +├── sentieon-license-server +└── test-datasets +``` + +Each of these are their own projects. + +### Install Pulumi + +[Here's the official guide](https://www.pulumi.com/docs/clouds/aws/get-started/) + +### Working with this repo + + + +1. Open up the project you want to make a change to +2. Make the change (Probably in `__main.py__`) +3. If you have a Pulumi cloud account in the nf-core org `pulumi preview` and `pulumi up` should work locally +4. Create a branch in the repo and make a PR, and a preview of the deployment should get ran. + +## Terminology + +Pulumi is pretty heavy on the terms and it was kinda confusing. A hierarchy kinda helps + +``` +Projects +├── Stacks +├──── Deployments +├──── Resources +Environments +``` + +### Projects + +Each directory in `pulumi` is a project. + +#### Stacks + +Each project can have multiple stacks. For example, `dev`, `prod`, `test`. + +Official quote: + +> What are projects and stacks? Pulumi projects and stacks let you organize Pulumi code. Consider a Pulumi project to be analogous to a GitHub repo—a single place for code—and a stack to be an instance of that code with a separate configuration. For instance, project foo may have multiple stacks for different deployment environments (dev, test, or prod), or perhaps for different cloud configurations (geographic region for example). See Organizing Projects and Stacks for some best practices on organizing your Pulumi projects and stacks. + +https://www.pulumi.com/docs/using-pulumi/organizing-projects-stacks/ + +##### Deployments + +Everytime you push to main in this repo a new deployment of the stack goes out. + +##### Resources + +These are individual pieces of infrastructure. An EC2 instance, a VPC, a GitHub repo, a GitHub team are some examples. + +### Environments + +This is Pulumi's hosted Secrete management. I'm thinking of these like, well "Environments". The nf-core AWS, the nf-core Azure, nf-core GCP, nf-core GitHub org, the nf-core-tf GitHub org. diff --git a/pulumi/github/repos/.gitignore b/pulumi/github/repos/.gitignore new file mode 100644 index 0000000..18fa2a3 --- /dev/null +++ b/pulumi/github/repos/.gitignore @@ -0,0 +1,3 @@ +*.pyc +venv/ +__pycache__/ diff --git a/pulumi/github/repos/Pulumi.dev.yaml b/pulumi/github/repos/Pulumi.dev.yaml new file mode 100644 index 0000000..3a722fd --- /dev/null +++ b/pulumi/github/repos/Pulumi.dev.yaml @@ -0,0 +1,5 @@ +config: + github:owner: nf-core-tf + # https://start.1password.com/open/i?a=O5GICFDKPNABLLVGMKBL5JWDWA&v=rdfcz6oy6qxxrc4clu467a7dmm&i=4ajrv44kc5lcbboa37fr5oydla&h=nf-core.1password.eu +environment: + - github-nf-core-tf diff --git a/pulumi/github/repos/Pulumi.prod.yaml b/pulumi/github/repos/Pulumi.prod.yaml new file mode 100644 index 0000000..d0ca5fc --- /dev/null +++ b/pulumi/github/repos/Pulumi.prod.yaml @@ -0,0 +1,5 @@ +config: + github:owner: nf-core +# https://start.1password.com/open/i?a=O5GICFDKPNABLLVGMKBL5JWDWA&v=rdfcz6oy6qxxrc4clu467a7dmm&i=ttqz63qvlr5qfwfde424nbl4re&h=nf-core.1password.eu +environment: + - github-prod diff --git a/pulumi/github/repos/Pulumi.yaml b/pulumi/github/repos/Pulumi.yaml new file mode 100644 index 0000000..ea14373 --- /dev/null +++ b/pulumi/github/repos/Pulumi.yaml @@ -0,0 +1,6 @@ +name: github-repos +runtime: + name: python + options: + virtualenv: venv +description: Managing nf-core GitHub repos diff --git a/pulumi/github/repos/README.md b/pulumi/github/repos/README.md new file mode 100644 index 0000000..b005a8c --- /dev/null +++ b/pulumi/github/repos/README.md @@ -0,0 +1,18 @@ +# Repos + +Replaces the automatic rule enforcement from the [old Pipeline Health PHP code](https://github.com/nf-core/website/blob/old-site/public_html/pipeline_health.php), + +[Main GitHub Issue](https://github.com/nf-core/ops/issues/5) +[Tracking Milestone](https://github.com/nf-core/ops/milestone/1) + +## Useful Docs + +- https://www.pulumi.com/registry/packages/github/api-docs/repository/ +- [Old Pipeline Health PHP code](https://github.com/nf-core/website/blob/old-site/public_html/pipeline_health.php) +- [New Pipeline Health page](https://github.com/nf-core/website/blob/main/sites/pipelines/src/pages/pipeline_health.astro) + +### Importing Repos + +```sh +pulumi env run nf-core/github-prod -i pulumi import github:index/repository:Repository testpipeline testpipeline +``` diff --git a/pulumi/github/repos/__main__.py b/pulumi/github/repos/__main__.py new file mode 100644 index 0000000..a8bcc2d --- /dev/null +++ b/pulumi/github/repos/__main__.py @@ -0,0 +1,3 @@ +#!/usr/bin/env python + +import pipelines.testpipeline diff --git a/pulumi/github/repos/core/modules.py b/pulumi/github/repos/core/modules.py new file mode 100644 index 0000000..0f9bf16 --- /dev/null +++ b/pulumi/github/repos/core/modules.py @@ -0,0 +1,42 @@ +import yaml + +import pulumi +import pulumi_github as github + + +nf_core_tf = github.Repository( + "nf-core-tf", + allow_merge_commit=False, + allow_rebase_merge=False, + allow_squash_merge=False, + default_branch="master", + description="Repository to host tool-specific module files for the Nextflow DSL2 community!", + has_downloads=True, + has_issues=True, + has_projects=True, + homepage_url="https://nf-co.re", + merge_commit_message="", + merge_commit_title="", + name="modules", + security_and_analysis=github.RepositorySecurityAndAnalysisArgs( + secret_scanning=github.RepositorySecurityAndAnalysisSecretScanningArgs( + status="disabled", + ), + secret_scanning_push_protection=github.RepositorySecurityAndAnalysisSecretScanningPushProtectionArgs( + status="disabled", + ), + ), + squash_merge_commit_message="", + squash_merge_commit_title="", + topics=[ + "nextflow", + "pipelines", + "nf-test", + "modules", + "nf-core", + "dsl2", + "workflows", + ], + visibility="public", + opts=pulumi.ResourceOptions(protect=True), +) diff --git a/pulumi/github/repos/core_repos.yml b/pulumi/github/repos/core_repos.yml new file mode 100644 index 0000000..14ebcf5 --- /dev/null +++ b/pulumi/github/repos/core_repos.yml @@ -0,0 +1,16 @@ +- .github +- basic_training +- configs +- logos +- modules +- ops +- prettier-plugin-nextflow +- references +- setup-nextflow +- setup-nf-test +- sublime +- test-datasets +- tools +- vale +- vscode-extensionpack +- website diff --git a/pulumi/github/repos/import_by_hand.py b/pulumi/github/repos/import_by_hand.py new file mode 100644 index 0000000..7a723a9 --- /dev/null +++ b/pulumi/github/repos/import_by_hand.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python + +import pulumi +import pulumi_github as github + +import pipelines.denovotranscript +import pipelines.meerpipe +import pipelines.pairgenomealign +import pipelines.phaseimpute +import pipelines.reportho + +# ... + +import core.github +import core.modules + +# ... +import core.website diff --git a/pulumi/github/repos/loop_example.py b/pulumi/github/repos/loop_example.py new file mode 100644 index 0000000..58be0c1 --- /dev/null +++ b/pulumi/github/repos/loop_example.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python + +import pulumi +import pulumi_github as github + +TOPICS = [ + "nextflow", + "pipelines", + "nf-test", + "modules", + "nf-core", + "dsl2", + "workflows", +] + +alpha_test_pipeline_repos = [ + "denovotranscript", + "meerpipe", + "pairgenomealign", + "phaseimpute", + "reportho", +] + +for pipeline in alpha_test_pipeline_repos: + github.Repository( + pipeline, + allow_merge_commit=True, + allow_rebase_merge=True, + allow_squash_merge=True, + default_branch="master", + description="Alpha test repository for nf-core", + has_downloads=True, + has_issues=True, + has_projects=True, + homepage_url=f"https://nf-co.re/{pipeline}", + merge_commit_message="", + merge_commit_title="", + name=pipeline, + security_and_analysis=github.RepositorySecurityAndAnalysisArgs( + secret_scanning=github.RepositorySecurityAndAnalysisSecretScanningArgs( + status="disabled", + ), + secret_scanning_push_protection=github.RepositorySecurityAndAnalysisSecretScanningPushProtectionArgs( + status="disabled", + ), + ), + squash_merge_commit_message="", + squash_merge_commit_title="", + topics=TOPICS, + visibility="public", + # NOTE Idk if this will work + opts=pulumi.ResourceOptions(protect=True), + ) diff --git a/pulumi/github/repos/pipelines.yml b/pulumi/github/repos/pipelines.yml new file mode 100644 index 0000000..f73ac11 --- /dev/null +++ b/pulumi/github/repos/pipelines.yml @@ -0,0 +1,99 @@ +- airrflow +- ampliseq +- atacseq +- bacass +- bactmap +- bamtofastq +- cageseq +- callingcards +- chipseq +- circdna +- circrna +- clipseq +- coproid +- createpanelrefs +- createtaxdb +- crisprseq +- cutandrun +- datasync +- demo +- demultiplex +- denovotranscript +- detaxizer +- diaproteomics +- differentialabundance +- dualrnaseq +- eager +- epitopeprediction +- fastquorum +- fetchngs +- funcscan +- genomeannotator +- genomeassembler +- genomeskim +- gwas +- hgtseq +- hic +- hicar +- hlatyping +- imcyto +- isoseq +- lncpipe +- mag +- magmap +- marsseq +- mcmicro +- meerpipe +- metaboigniter +- metapep +- metatdenovo +- methylseq +- mhcquant +- mnaseseq +- molkart +- multiplesequencealign +- nanoseq +- nanostring +- nascent +- omicsgenetraitassociation +- oncoanalyser +- pairgenomealign +- pangenome +- pathogensurveillance +- pgdb +- phageannotator +- phaseimpute +- phyloplace +- pixelator +- proteinfold +- proteomicslfq +- radseq +- rangeland +- raredisease +- readsimulator +- reportho +- riboseq +- rnadnavar +- rnafusion +- rnaseq +- rnasplice +- rnavar +- sammyseq +- sarek +- scdownstream +- scnanoseq +- scrnaseq +- seqinspector +- setup-nf-test +- slamseq +- smrnaseq +- spatialvi +- spinningjenny +- taxprofiler +- tbanalyzer +- tfactivity +- vale +- variantbenchmarking +- variantcatalogue +- viralintegration +- viralrecon diff --git a/pulumi/github/repos/pipelines/__init__.py b/pulumi/github/repos/pipelines/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pulumi/github/repos/pipelines/testpipeline.py b/pulumi/github/repos/pipelines/testpipeline.py new file mode 100644 index 0000000..38ad7bf --- /dev/null +++ b/pulumi/github/repos/pipelines/testpipeline.py @@ -0,0 +1,212 @@ +# NOTE => are tests from PHP +# TODO Convert => to actual tests https://www.pulumi.com/docs/using-pulumi/testing/ +# https://github.com/pulumi/examples/blob/74db62a03d013c2854d2cf933c074ea0a3bbf69d/testing-unit-py/test_ec2.py +import pulumi +import pulumi_github as github + +NAME = "testpipeline" + +TOPICS = [ + "nextflow", + "pipelines", + "nf-test", + "modules", + "nf-core", + "dsl2", + "workflows", +] + +# Names of required CI checks. These are added to whatever already exists. +# public $required_status_check_contexts = [ +# 'pre-commit', +# 'nf-core', +REQUIRED_CI_CHECKS = [ + github.RepositoryRulesetRulesRequiredStatusChecksRequiredCheckArgs( + context="pre-commit", + integration_id=0, + ), + github.RepositoryRulesetRulesRequiredStatusChecksRequiredCheckArgs( + context="nf-core", + integration_id=0, + ), +] + +CORE_TEAM_ID = 2649377 +MAINTAINERS_TEAM_ID = 4462882 + +nfcore_testpipeline = github.Repository( + NAME, + description="A small example pipeline used to test new nf-core infrastructure and common code.", # 'repo_description' => 'Description must be set', + has_downloads=True, + has_issues=True, # 'repo_issues' => 'Enable issues', + has_projects=True, + has_wiki=False, # 'repo_wikis' => 'Disable wikis', + allow_merge_commit=True, # 'repo_merge_commits' => 'Allow merge commits', + allow_rebase_merge=True, # 'repo_merge_rebase' => 'Allow rebase merging', + allow_squash_merge=False, # 'repo_merge_squash' => 'Do not allow squash merges', + delete_branch_on_merge=True, + homepage_url=f"https://nf-co.re/{NAME}", # 'repo_url' => 'URL should be set to https://nf-co.re', + name=NAME, + security_and_analysis=github.RepositorySecurityAndAnalysisArgs( + secret_scanning=github.RepositorySecurityAndAnalysisSecretScanningArgs( + status="disabled", + ), + secret_scanning_push_protection=github.RepositorySecurityAndAnalysisSecretScanningPushProtectionArgs( + status="disabled", + ), + ), + visibility="public", + topics=TOPICS, # 'repo_keywords' => 'Minimum keywords set', +) + + +# Make branches foreach (['master', 'dev', 'TEMPLATE'] as $branch) { +# 'repo_default_branch' => 'default branch master (released) or dev (no releases)', +# TODO Toggle this on dev as default if there's not release? +# 'branch_master_exists' => 'master branch: branch must exist', +branch_default_testpipeline = github.BranchDefault( + f"branch_default_{NAME}", + branch="master", + repository=NAME, + opts=pulumi.ResourceOptions(protect=True), +) +# 'branch_dev_exists' => 'dev branch: branch must exist', +branch_dev_testpipeline = github.Branch( + f"branch_dev_{NAME}", + branch="dev", + repository=NAME, + opts=pulumi.ResourceOptions(protect=True), +) +# 'branch_template_exists' => 'TEMPLATE branch: branch must exist', +branch_template_testpipeline = github.Branch( + f"branch_template_{NAME}", + branch="TEMPLATE", + repository=NAME, + opts=pulumi.ResourceOptions(protect=True), +) +# Add branch protections https://github.com/nf-core/website/blob/33acd6a2fab2bf9251e14212ce731ef3232b5969/public_html/pipeline_health.php#L296 +# NOTE This uses the new Rulesets instead of classic branch protection rule +# TODO 'branch_master_strict_updates' => 'master branch: do not require branch to be up to date before merging', +ruleset_branch_default_testpipeline = github.RepositoryRuleset( + f"ruleset_branch_default_{NAME}", + bypass_actors=[ + # 'branch_master_enforce_admins' => 'master branch: do not enforce rules for admins', + github.RepositoryRulesetBypassActorArgs( + actor_id=CORE_TEAM_ID, + actor_type="Team", + bypass_mode="always", + ) + ], + conditions=github.RepositoryRulesetConditionsArgs( + ref_name=github.RepositoryRulesetConditionsRefNameArgs( + excludes=[], + includes=["~DEFAULT_BRANCH"], + ), + ), + enforcement="active", + name="master", + repository=NAME, + rules=github.RepositoryRulesetRulesArgs( + deletion=True, + non_fast_forward=True, + pull_request=github.RepositoryRulesetRulesPullRequestArgs( + required_approving_review_count=2, # 'branch_master_required_num_reviews' => 'master branch: 2 reviews required', + dismiss_stale_reviews_on_push=False, # 'branch_master_stale_reviews' => 'master branch: reviews not marked stale after new commits' + require_code_owner_review=False, # 'branch_master_code_owner_reviews' => 'master branch: code owner reviews not required', + ), + # 'branch_master_required_ci' => 'master branch: minimum set of CI tests must pass', + required_status_checks=github.RepositoryRulesetRulesRequiredStatusChecksArgs( + required_checks=REQUIRED_CI_CHECKS, + strict_required_status_checks_policy=True, + ), + ), + target="branch", + opts=pulumi.ResourceOptions(protect=True), +) +# TODO 'branch_dev_strict_updates' => 'dev branch: do not require branch to be up to date before merging', +ruleset_branch_dev_testpipeline = github.RepositoryRuleset( + f"ruleset_branch_dev_{NAME}", + # 'branch_dev_enforce_admins' => 'dev branch: do not enforce rules for admins', + bypass_actors=[ + github.RepositoryRulesetBypassActorArgs( + actor_id=CORE_TEAM_ID, + actor_type="Team", + bypass_mode="always", + ), + github.RepositoryRulesetBypassActorArgs( + actor_id=MAINTAINERS_TEAM_ID, + actor_type="Team", + bypass_mode="always", + ), + ], + conditions=github.RepositoryRulesetConditionsArgs( + ref_name=github.RepositoryRulesetConditionsRefNameArgs( + excludes=[], + includes=["refs/heads/dev"], + ), + ), + enforcement="active", + name="dev", + repository=NAME, + rules=github.RepositoryRulesetRulesArgs( + deletion=True, + non_fast_forward=True, + pull_request=github.RepositoryRulesetRulesPullRequestArgs( + dismiss_stale_reviews_on_push=False, # 'branch_dev_stale_reviews' => 'dev branch: reviews not marked stale after new commits', + require_code_owner_review=False, # 'branch_dev_code_owner_reviews' => 'dev branch: code owner reviews not required', + # TODO require_last_push_approval=True, + required_approving_review_count=1, # 'branch_dev_required_num_reviews' => 'dev branch: 1 review required', + # TODO required_review_thread_resolution=True, + ), + # 'branch_dev_required_ci' => 'dev branch: minimum set of CI tests must pass', + required_status_checks=github.RepositoryRulesetRulesRequiredStatusChecksArgs( + required_checks=REQUIRED_CI_CHECKS, + strict_required_status_checks_policy=True, + ), + ), + target="branch", + opts=pulumi.ResourceOptions(protect=True), +) +# TODO Double check +# Template branch protection https://github.com/nf-core/website/blob/33acd6a2fab2bf9251e14212ce731ef3232b5969/public_html/pipeline_health.php#L509 +ruleset_branch_template_testpipeline = github.RepositoryRuleset( + f"ruleset_branch_TEMPLATE_{NAME}", + bypass_actors=[ + github.RepositoryRulesetBypassActorArgs( + actor_id=CORE_TEAM_ID, + actor_type="Team", + bypass_mode="always", + ) + # TODO 'branch_template_restrict_push' => 'Restrict push to TEMPLATE to @nf-core-bot', + ], + conditions=github.RepositoryRulesetConditionsArgs( + ref_name=github.RepositoryRulesetConditionsRefNameArgs( + excludes=[], + includes=["refs/heads/TEMPLATE"], + ), + ), + enforcement="active", + name="template", + repository=NAME, + rules=github.RepositoryRulesetRulesArgs( + deletion=True, + non_fast_forward=True, + update=True, + ), + target="branch", + opts=pulumi.ResourceOptions(protect=True), +) +# 'team_contributors' => 'Write access for nf-core/contributors', +contributors_team_repo_testpipeline = github.TeamRepository( + f"contributors_team_repo_{NAME}", + team_id="contributors", + repository=NAME, + permission="push", +) +# 'team_core' => 'Admin access for nf-core/core', +core_team_repo_testpipeline = github.TeamRepository( + f"core_team_repo_{NAME}", + team_id="core", + repository=NAME, + permission="admin", +) diff --git a/pulumi/github/repos/requirements.txt b/pulumi/github/repos/requirements.txt new file mode 100644 index 0000000..d265c6c --- /dev/null +++ b/pulumi/github/repos/requirements.txt @@ -0,0 +1,3 @@ +pulumi>=3 +pulumi_github>=5.20.0 +ruff>=0.3.7 diff --git a/pulumi/github/teams/.gitignore b/pulumi/github/teams/.gitignore index 75384ec..18fa2a3 100644 --- a/pulumi/github/teams/.gitignore +++ b/pulumi/github/teams/.gitignore @@ -1,8 +1,3 @@ *.pyc venv/ __pycache__/ - -# sensitive data -Pulumi*yaml -*.txt -!requirements.txt diff --git a/pulumi/github/teams/__main__.py b/pulumi/github/teams/__main__.py index d825b3a..739eaa4 100644 --- a/pulumi/github/teams/__main__.py +++ b/pulumi/github/teams/__main__.py @@ -24,7 +24,8 @@ def setup_team(self, team, parent_team=None): for user in members: # Add a user to the newly created team - team_membership = github.TeamMembership( + # team_membership = + github.TeamMembership( f"{team['name']}-{user['name']}", team_id=team_resource, username=user["name"], @@ -37,7 +38,8 @@ def setup_team(self, team, parent_team=None): continue # Associate a repository with the team - team_repository = github.TeamRepository( + # team_repository = + github.TeamRepository( f"{team['name']}-{repo['name']}", team_id=team_resource, repository=self._repos[repo["name"]], @@ -75,4 +77,4 @@ def __init__(self, org_file): self.setup_team(team) -Organization("org.yaml") \ No newline at end of file +Organization("org.yaml")