Skip to content

Commit 31e4fa8

Browse files
authored
chore: unify shared actions signatures (#169)
* chore: unify shared actions signatures * docs: udpated changelog * chore: apply the suggestion from copilot
1 parent d160627 commit 31e4fa8

20 files changed

+154
-120
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2222
- new args for repositories and branch protection rules
2323

2424
### Changed
25+
- Updated the signatures of all the shared actions; now the runAction function will persist the changes to disk while action functions will operate on the in-memory state
2526
- Synchronization script: to use GitHub API directly instead of relying on TF GH Provider's Data Sources
2627
- Configuration: replaced multiple JSONs with a single, unified YAML
2728
- Synchronization script: rewrote the script in JS

docs/HOWTOS.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ I want to ensure that all the public repositories in my organization have their
118118
To do that, I ensure the following content is present in `scripts/src/actions/fix-yaml-config.ts`:
119119
```ts
120120
import 'reflect-metadata'
121-
import { protectDefaultBranches } from './shared/protect-default-branches'
121+
import { runProtectDefaultBranches } from './shared/protect-default-branches'
122122
123-
protectDefaultBranches()
123+
runProtectDefaultBranches()
124124
```

scripts/__tests__/__resources__/github/default.yml

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -160,27 +160,7 @@ repositories:
160160
visibility: public
161161
vulnerability_alerts: false
162162
rust-sccache-action:
163-
advanced_security: false
164-
allow_auto_merge: false
165-
allow_merge_commit: true
166-
allow_rebase_merge: true
167-
allow_squash_merge: true
168-
archived: false
169-
auto_init: false
170-
default_branch: main
171-
delete_branch_on_merge: false
172-
has_downloads: true
173-
has_issues: true
174-
has_projects: true
175-
has_wiki: true
176-
is_template: false
177-
secret_scanning_push_protection: false
178-
secret_scanning: false
179-
teams:
180-
maintain:
181-
- ipdx
182-
visibility: public
183-
vulnerability_alerts: true
163+
archived: true
184164
tf-aws-gh-runner:
185165
advanced_security: false
186166
allow_auto_merge: false

scripts/__tests__/__resources__/terraform/terraform.tfstate

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -618,7 +618,7 @@
618618
"allow_merge_commit": true,
619619
"allow_rebase_merge": true,
620620
"allow_squash_merge": true,
621-
"archived": false,
621+
"archived": true,
622622
"branches": [
623623
{
624624
"name": "arm64",
@@ -1644,7 +1644,7 @@
16441644
"allow_rebase_merge": true,
16451645
"allow_squash_merge": true,
16461646
"archive_on_destroy": null,
1647-
"archived": false,
1647+
"archived": true,
16481648
"auto_init": false,
16491649
"branches": [
16501650
{

scripts/__tests__/sync.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {GitHub} from '../src/github'
99
import env from '../src/env'
1010
import {Resource} from '../src/resources/resource'
1111
import {RepositoryFile} from '../src/resources/repository-file'
12+
import {toggleArchivedRepos} from '../src/actions/shared/toggle-archived-repos'
1213

1314
test('sync', async () => {
1415
const yamlConfig = new config.Config('{}')
@@ -17,6 +18,7 @@ test('sync', async () => {
1718
const expectedYamlConfig = config.Config.FromPath()
1819

1920
await sync(tfConfig, yamlConfig)
21+
await toggleArchivedRepos(tfConfig, yamlConfig)
2022

2123
yamlConfig.format()
2224

scripts/__tests__/terraform/state.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ test('can retrieve resources from tf state', async () => {
1212
for (const resourceClass of ResourceConstructors) {
1313
const classResources = config.getResources(resourceClass)
1414
expect(classResources).toHaveLength(
15-
global.ResourceCounts[resourceClass.name]
15+
global.StateResourceCounts[resourceClass.name]
1616
)
1717
resources.push(...classResources)
1818
}
1919

20-
expect(resources).toHaveLength(global.ResourcesCount)
20+
expect(resources).toHaveLength(global.StateResourcesCount)
2121
})
2222

2323
test('can ignore resource types', async () => {

scripts/__tests__/yaml/config.test.ts

Lines changed: 35 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {randomUUID} from 'crypto'
1313
import {Team, Privacy as TeamPrivacy} from '../../src/resources/team'
1414
import {RepositoryBranchProtectionRule} from '../../src/resources/repository-branch-protection-rule'
1515
import {toggleArchivedRepos} from '../../src/actions/shared/toggle-archived-repos'
16-
import * as state from '../../src/terraform/state'
16+
import {State} from '../../src/terraform/state'
1717

1818
test('can retrieve resources from YAML schema', async () => {
1919
const config = Config.FromPath()
@@ -23,13 +23,13 @@ test('can retrieve resources from YAML schema', async () => {
2323
for (const resourceClass of ResourceConstructors) {
2424
const classResources = config.getResources(resourceClass)
2525
expect(classResources).toHaveLength(
26-
global.ResourceCounts[resourceClass.name]
26+
global.ConfigResourceCounts[resourceClass.name]
2727
)
2828
resources.push(...classResources)
2929
}
3030

3131
expect(resources).toHaveLength(
32-
Object.values(global.ResourceCounts).reduce(
32+
Object.values(global.ConfigResourceCounts).reduce(
3333
(a: number, b: number) => a + b,
3434
0
3535
)
@@ -58,7 +58,7 @@ test('can remove members', async () => {
5858
}
5959

6060
expect(config.getAllResources()).toHaveLength(
61-
global.ResourcesCount - global.ResourceCounts[Member.name]
61+
global.ConfigResourcesCount - global.ConfigResourceCounts[Member.name]
6262
)
6363
})
6464

@@ -76,8 +76,8 @@ test('can remove repositories, including their sub-resources', async () => {
7676
}
7777

7878
const count =
79-
global.ResourcesCount -
80-
Object.entries(global.ResourceCounts).reduce(
79+
global.ConfigResourcesCount -
80+
Object.entries(global.ConfigResourceCounts).reduce(
8181
(a: number, [key, value]) =>
8282
key.startsWith(Repository.name) ? a + value : a,
8383
0
@@ -98,12 +98,12 @@ test('can add members', async () => {
9898
config.addResource(member)
9999
expect(config.someResource(member)).toBeTruthy()
100100
expect(config.getResources(Member)).toHaveLength(
101-
global.ResourceCounts[Member.name] + index + 1
101+
global.ConfigResourceCounts[Member.name] + index + 1
102102
)
103103
}
104104

105105
expect(config.getAllResources()).toHaveLength(
106-
global.ResourcesCount + members.length
106+
global.ConfigResourcesCount + members.length
107107
)
108108
})
109109

@@ -124,15 +124,15 @@ test('can add files, including their parent resources', async () => {
124124
}
125125

126126
const count =
127-
global.ResourcesCount +
127+
global.ConfigResourcesCount +
128128
files.filter(f => !config.someResource(f)).length +
129129
repositories.filter(r => !config.someResource(r)).length
130130

131131
for (const [index, file] of files.entries()) {
132132
config.addResource(file)
133133
expect(config.someResource(file)).toBeTruthy()
134134
expect(config.getResources(RepositoryFile)).toHaveLength(
135-
global.ResourceCounts[RepositoryFile.name] + index + 1
135+
global.ConfigResourceCounts[RepositoryFile.name] + index + 1
136136
)
137137
}
138138

@@ -365,7 +365,7 @@ repositories:
365365

366366
test('can add and remove resources through sync', async () => {
367367
const config = new Config('{}')
368-
let desiredResources: Resource[] = []
368+
const desiredResources: Resource[] = []
369369
let resources = config.getAllResources()
370370

371371
config.sync(desiredResources)
@@ -389,41 +389,37 @@ test('can add and remove resources through sync', async () => {
389389
})
390390

391391
test('clears and re-adds repository fields when archiving/unarchiving', async () => {
392-
let config = Config.FromPath()
393-
394-
const unarchivedRepo = config.getResources(Repository).find(r => !r.archived)!
395-
396-
expect(unarchivedRepo.visibility).toBeDefined()
397-
398-
unarchivedRepo.archived = true
399-
config.addResource(unarchivedRepo)
400-
401-
await toggleArchivedRepos(config)
392+
const config = Config.FromPath()
393+
const state = await State.New()
402394

403-
const archivedRepo = config
395+
const archivedRepository = config
396+
.getResources(Repository)
397+
.find(r => r.archived)!
398+
const unarchivedRepository = config
404399
.getResources(Repository)
405-
.find(r => r.getStateAddress() == unarchivedRepo.getStateAddress())!
400+
.find(r => !r.archived)!
406401

407-
expect(archivedRepo.archived).toBe(true)
408-
expect(archivedRepo.visibility).not.toBeDefined()
402+
expect(archivedRepository.archived).toBe(true)
403+
expect(archivedRepository.visibility).not.toBeDefined()
409404

410-
archivedRepo.archived = false
411-
config.addResource(archivedRepo)
405+
expect(unarchivedRepository.archived).toBe(false)
406+
expect(unarchivedRepository.visibility).toBeDefined()
412407

413-
const newState = JSON.parse(await state.loadState())
414-
newState.values.root_module.resources.find(
415-
(r: any) => r.address == unarchivedRepo.getStateAddress()
416-
)!.values.archived = true
408+
archivedRepository.archived = false
409+
unarchivedRepository.archived = true
417410

418-
const loadStateMock = jest.spyOn(state, 'loadState')
419-
loadStateMock.mockImplementation(async () => JSON.stringify(newState))
411+
config.addResource(archivedRepository)
412+
config.addResource(unarchivedRepository)
420413

421-
await toggleArchivedRepos(config)
414+
await toggleArchivedRepos(state, config)
422415

423-
const toggledRepo = config
424-
.getResources(Repository)
425-
.find(r => r.getStateAddress() == unarchivedRepo.getStateAddress())!
416+
const previouslyArchivedRepository = config.findResource(archivedRepository)!
417+
const previouslyUnarchivedRepository =
418+
config.findResource(unarchivedRepository)!
419+
420+
expect(previouslyArchivedRepository.archived).toBe(false)
421+
expect(previouslyArchivedRepository.visibility).toBeDefined()
426422

427-
expect(toggledRepo.archived).toBe(false)
428-
expect(toggledRepo.visibility).toBeDefined()
423+
expect(previouslyUnarchivedRepository.archived).toBe(true)
424+
expect(previouslyUnarchivedRepository.visibility).not.toBeDefined()
429425
})

scripts/jest.d.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
declare global {
2-
var ResourceCounts: Record<string, number>
3-
var ResourcesCount: number
2+
var StateResourceCounts: Record<string, number>
3+
var StateResourcesCount: number
4+
var ConfigResourceCounts: Record<string, number>
5+
var ConfigResourcesCount: number
46
}
57

68
export {}

scripts/jest.setup.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,22 @@ GitHub.github = {
5858
}
5959
} as GitHub
6060

61-
global.ResourceCounts = {
61+
global.ConfigResourceCounts = {
62+
[Member.name]: 2,
63+
[Repository.name]: 7,
64+
[Team.name]: 2,
65+
[RepositoryCollaborator.name]: 1,
66+
[RepositoryBranchProtectionRule.name]: 1,
67+
[RepositoryTeam.name]: 6,
68+
[TeamMember.name]: 2,
69+
[RepositoryFile.name]: 1,
70+
[RepositoryLabel.name]: 3
71+
}
72+
global.ConfigResourcesCount = Object.values(global.ConfigResourceCounts).reduce(
73+
(a, b) => a + b,
74+
0
75+
)
76+
global.StateResourceCounts = {
6277
[Member.name]: 2,
6378
[Repository.name]: 7,
6479
[Team.name]: 2,
@@ -69,7 +84,7 @@ global.ResourceCounts = {
6984
[RepositoryFile.name]: 1,
7085
[RepositoryLabel.name]: 3
7186
}
72-
global.ResourcesCount = Object.values(global.ResourceCounts).reduce(
87+
global.StateResourcesCount = Object.values(global.StateResourceCounts).reduce(
7388
(a, b) => a + b,
7489
0
7590
)

scripts/src/actions/fix-yaml-config.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
11
import 'reflect-metadata'
22

3-
import {Config} from '../yaml/config'
4-
import {toggleArchivedRepos} from './shared/toggle-archived-repos'
5-
import {describeAccessChanges} from './shared/describe-access-changes'
3+
import {runToggleArchivedRepos} from './shared/toggle-archived-repos'
4+
import {runDescribeAccessChanges} from './shared/describe-access-changes'
65

76
import * as core from '@actions/core'
87

98
async function run(): Promise<void> {
10-
const config = Config.FromPath()
11-
await toggleArchivedRepos(config)
12-
config.save()
9+
await runToggleArchivedRepos()
1310

14-
const accessChangesDescription = await describeAccessChanges()
11+
const accessChangesDescription = await runDescribeAccessChanges()
1512

1613
core.setOutput(
1714
'comment',

0 commit comments

Comments
 (0)