@@ -2,6 +2,7 @@ import * as core from '@actions/core'
22import { Context } from '@actions/github/lib/context'
33import {
44 ApiClient ,
5+ Credential ,
56 JobDetails ,
67 CredentialFetchingError ,
78 JobDetailsFetchingError
@@ -11,7 +12,7 @@ import {Updater} from '../src/updater'
1112import { ImageService , MetricReporter } from '../src/image-service'
1213import { updaterImageName } from '../src/docker-tags'
1314import * as inputs from '../src/inputs'
14- import { run , credentialsFromEnv } from '../src/main'
15+ import { run , credentialsFromEnv , getPackagesCredential } from '../src/main'
1516
1617import { 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+ } )
0 commit comments