Skip to content

Commit c1e3288

Browse files
authored
Merge pull request #1603 from brettfo/dev/brettfo/github-packages
elevate GITHUB_TOKEN to packages feed credential
2 parents 8c7db12 + c69d6a8 commit c1e3288

File tree

7 files changed

+534
-6
lines changed

7 files changed

+534
-6
lines changed

.gitattributes

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
dist/** -diff linguist-generated=true
1+
dist/** -diff linguist-generated=true
2+
*.exe binary

__tests__/main.test.ts

Lines changed: 238 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as core from '@actions/core'
22
import {Context} from '@actions/github/lib/context'
33
import {
44
ApiClient,
5+
Credential,
56
JobDetails,
67
CredentialFetchingError,
78
JobDetailsFetchingError
@@ -11,7 +12,7 @@ import {Updater} from '../src/updater'
1112
import {ImageService, MetricReporter} from '../src/image-service'
1213
import {updaterImageName} from '../src/docker-tags'
1314
import * as inputs from '../src/inputs'
14-
import {run, credentialsFromEnv} from '../src/main'
15+
import {run, credentialsFromEnv, getPackagesCredential} from '../src/main'
1516

1617
import {eventFixturePath} from './helpers'
1718

@@ -139,7 +140,8 @@ describe('run', () => {
139140
'allowed-updates': [],
140141
'credentials-metadata': [],
141142
id: '1',
142-
experiments: {}
143+
experiments: {},
144+
source: {repo: 'test-org/test-repo'}
143145
})
144146

145147
const pullSpy = jest
@@ -820,3 +822,237 @@ describe('credentialsFromEnv', () => {
820822
expect(setSecretSpy).not.toHaveBeenCalledWith('https://foo')
821823
})
822824
})
825+
826+
describe('getPackagesCredential', () => {
827+
const experimentName = 'automatic_github_packages_auth'
828+
const alternateExperimentName = experimentName.replace(/_/g, '-')
829+
function createJobDetails(
830+
packageManager: string,
831+
experiments: {[key: string]: boolean},
832+
credentialsMetadata: Credential[] = []
833+
): JobDetails {
834+
return {
835+
'package-manager': packageManager,
836+
'allowed-updates': [],
837+
'credentials-metadata': credentialsMetadata,
838+
id: '1',
839+
experiments,
840+
source: {repo: 'test-org/test-repo'}
841+
}
842+
}
843+
844+
beforeEach(() => {
845+
process.env.GITHUB_TOKEN = 'test-token'
846+
})
847+
848+
afterEach(() => {
849+
delete process.env.GITHUB_TOKEN
850+
})
851+
852+
describe('when the package manager is unsupported', () => {
853+
it('returns null', () => {
854+
const details = createJobDetails('unsupported-package-manager', {
855+
[experimentName]: true
856+
})
857+
const cred = getPackagesCredential(details, 'test-actor')
858+
expect(cred).toBeNull()
859+
})
860+
})
861+
862+
describe('when the package manager is bundler', () => {
863+
describe('when automatic package auth is enabled', () => {
864+
it('creates a GitHub packages credential', () => {
865+
const details = createJobDetails('bundler', {[experimentName]: true})
866+
const cred = getPackagesCredential(details, 'test-actor')
867+
expect(cred).toEqual({
868+
type: 'rubygems_server',
869+
host: 'rubygems.pkg.github.com',
870+
token: 'test-actor:test-token'
871+
})
872+
})
873+
874+
it('does not create a duplicate credential', () => {
875+
const existingCred: Credential = {
876+
type: 'rubygems_server',
877+
host: 'rubygems.pkg.github.com',
878+
token: 'some-other-actor:some-other-token'
879+
}
880+
const details = createJobDetails('bundler', {[experimentName]: true}, [
881+
existingCred
882+
])
883+
const cred = getPackagesCredential(details, 'test-actor')
884+
expect(cred).toBeNull()
885+
})
886+
})
887+
})
888+
889+
describe('when the package manager is docker', () => {
890+
describe('when automatic package auth is enabled', () => {
891+
it('creates a GitHub packages credential', () => {
892+
const details = createJobDetails('docker', {[experimentName]: true})
893+
const cred = getPackagesCredential(details, 'test-actor')
894+
expect(cred).toEqual({
895+
type: 'docker_registry',
896+
registry: 'ghcr.io',
897+
username: 'test-actor',
898+
password: 'test-token'
899+
})
900+
})
901+
902+
it('does not create a duplicate credential', () => {
903+
const existingCred: Credential = {
904+
type: 'docker_registry',
905+
registry: 'ghcr.io',
906+
username: 'some-other-actor',
907+
password: 'some-other-token'
908+
}
909+
const details = createJobDetails('docker', {[experimentName]: true}, [
910+
existingCred
911+
])
912+
const cred = getPackagesCredential(details, 'test-actor')
913+
expect(cred).toBeNull()
914+
})
915+
})
916+
})
917+
918+
describe('when the package manager is maven', () => {
919+
describe('when automatic package auth is enabled', () => {
920+
it('creates a GitHub packages credential', () => {
921+
const details = createJobDetails('maven', {[experimentName]: true})
922+
const cred = getPackagesCredential(details, 'test-actor')
923+
expect(cred).toEqual({
924+
type: 'maven_repository',
925+
url: 'https://maven.pkg.github.com/test-org',
926+
username: 'test-actor',
927+
password: 'test-token'
928+
})
929+
})
930+
931+
it('does not create a duplicate credential with no trailing slash', () => {
932+
const existingCred: Credential = {
933+
type: 'maven_repository',
934+
url: 'https://maven.pkg.github.com/TEST-ORG',
935+
username: 'some-other-actor',
936+
password: 'some-other-token'
937+
}
938+
const details = createJobDetails('maven', {[experimentName]: true}, [
939+
existingCred
940+
])
941+
const cred = getPackagesCredential(details, 'test-actor')
942+
expect(cred).toBeNull()
943+
})
944+
945+
it('does not create a duplicate credential with a trailing slash', () => {
946+
const existingCred: Credential = {
947+
type: 'maven_repository',
948+
url: 'https://maven.pkg.github.com/TEST-ORG/',
949+
username: 'some-other-actor',
950+
password: 'some-other-token'
951+
}
952+
const details = createJobDetails('maven', {[experimentName]: true}, [
953+
existingCred
954+
])
955+
const cred = getPackagesCredential(details, 'test-actor')
956+
expect(cred).toBeNull()
957+
})
958+
})
959+
})
960+
961+
describe('when the package manager is npm_and_yarn', () => {
962+
describe('when automatic package auth is enabled', () => {
963+
it('creates a GitHub packages credential', () => {
964+
const details = createJobDetails('npm_and_yarn', {
965+
[experimentName]: true
966+
})
967+
const cred = getPackagesCredential(details, 'test-actor')
968+
expect(cred).toEqual({
969+
type: 'npm_registry',
970+
registry: 'npm.pkg.github.com',
971+
token: 'test-actor:test-token'
972+
})
973+
})
974+
975+
it('does not create a duplicate credential', () => {
976+
const existingCred: Credential = {
977+
type: 'npm_registry',
978+
registry: 'npm.pkg.github.com',
979+
token: 'some-other-actor:some-other-token'
980+
}
981+
const details = createJobDetails(
982+
'npm_and_yarn',
983+
{[experimentName]: true},
984+
[existingCred]
985+
)
986+
const cred = getPackagesCredential(details, 'test-actor')
987+
expect(cred).toBeNull()
988+
})
989+
})
990+
})
991+
992+
describe('when the package manager is nuget', () => {
993+
describe('when automatic package auth is not set', () => {
994+
it('returns null', () => {
995+
const details = createJobDetails('nuget', {})
996+
const cred = getPackagesCredential(details, 'test-actor')
997+
expect(cred).toBeNull()
998+
})
999+
})
1000+
1001+
describe('when automatic package auth is disabled', () => {
1002+
it('returns null', () => {
1003+
const details = createJobDetails('nuget', {[experimentName]: false})
1004+
const cred = getPackagesCredential(details, 'test-actor')
1005+
expect(cred).toBeNull()
1006+
})
1007+
})
1008+
1009+
describe('when GITHUB_TOKEN is not set', () => {
1010+
it('returns null', () => {
1011+
delete process.env.GITHUB_TOKEN
1012+
const details = createJobDetails('nuget', {[experimentName]: true})
1013+
const cred = getPackagesCredential(details, 'test-actor')
1014+
expect(cred).toBeNull()
1015+
})
1016+
})
1017+
1018+
describe('when automatic package auth is enabled', () => {
1019+
it('creates a GitHub packages credential', () => {
1020+
const details = createJobDetails('nuget', {[experimentName]: true})
1021+
const cred = getPackagesCredential(details, 'test-actor')
1022+
expect(cred).toEqual({
1023+
type: 'nuget_feed',
1024+
url: 'https://nuget.pkg.github.com/test-org/index.json',
1025+
username: 'test-actor',
1026+
password: 'test-token'
1027+
})
1028+
})
1029+
1030+
it('creates a GitHub packages credential with alternate experiment name', () => {
1031+
const details = createJobDetails('nuget', {
1032+
[alternateExperimentName]: true
1033+
})
1034+
const cred = getPackagesCredential(details, 'test-actor')
1035+
expect(cred).toEqual({
1036+
type: 'nuget_feed',
1037+
url: 'https://nuget.pkg.github.com/test-org/index.json',
1038+
username: 'test-actor',
1039+
password: 'test-token'
1040+
})
1041+
})
1042+
1043+
it('does not create a duplicate credential', () => {
1044+
const existingCred: Credential = {
1045+
type: 'nuget_feed',
1046+
url: 'https://nuget.pkg.github.com/TEST-ORG/index.json',
1047+
username: 'some-other-actor',
1048+
password: 'some-other-token'
1049+
}
1050+
const details = createJobDetails('nuget', {[experimentName]: true}, [
1051+
existingCred
1052+
])
1053+
const cred = getPackagesCredential(details, 'test-actor')
1054+
expect(cred).toBeNull()
1055+
})
1056+
})
1057+
})
1058+
})

__tests__/updater-builder-integration.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ integration('UpdaterBuilder', () => {
2525
'credentials-metadata': [],
2626
id: '1',
2727
'package-manager': 'npm_and_yarn',
28-
experiments: {}
28+
experiments: {},
29+
source: {repo: 'test-org/test-repo'}
2930
}
3031

3132
beforeAll(async () => {

0 commit comments

Comments
 (0)