set insteadOf url for org-id (#621)
This commit is contained in:
		@@ -37,7 +37,7 @@ class GitAuthHelper {
 | 
			
		||||
  private readonly tokenConfigValue: string
 | 
			
		||||
  private readonly tokenPlaceholderConfigValue: string
 | 
			
		||||
  private readonly insteadOfKey: string
 | 
			
		||||
  private readonly insteadOfValue: string
 | 
			
		||||
  private readonly insteadOfValues: string[] = []
 | 
			
		||||
  private sshCommand = ''
 | 
			
		||||
  private sshKeyPath = ''
 | 
			
		||||
  private sshKnownHostsPath = ''
 | 
			
		||||
@@ -45,7 +45,7 @@ class GitAuthHelper {
 | 
			
		||||
 | 
			
		||||
  constructor(
 | 
			
		||||
    gitCommandManager: IGitCommandManager,
 | 
			
		||||
    gitSourceSettings?: IGitSourceSettings
 | 
			
		||||
    gitSourceSettings: IGitSourceSettings | undefined
 | 
			
		||||
  ) {
 | 
			
		||||
    this.git = gitCommandManager
 | 
			
		||||
    this.settings = gitSourceSettings || (({} as unknown) as IGitSourceSettings)
 | 
			
		||||
@@ -63,7 +63,12 @@ class GitAuthHelper {
 | 
			
		||||
 | 
			
		||||
    // Instead of SSH URL
 | 
			
		||||
    this.insteadOfKey = `url.${serverUrl.origin}/.insteadOf` // "origin" is SCHEME://HOSTNAME[:PORT]
 | 
			
		||||
    this.insteadOfValue = `git@${serverUrl.hostname}:`
 | 
			
		||||
    this.insteadOfValues.push(`git@${serverUrl.hostname}:`)
 | 
			
		||||
    if (this.settings.workflowOrganizationId) {
 | 
			
		||||
      this.insteadOfValues.push(
 | 
			
		||||
        `org-${this.settings.workflowOrganizationId}@github.com:`
 | 
			
		||||
      )
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async configureAuth(): Promise<void> {
 | 
			
		||||
@@ -118,7 +123,9 @@ class GitAuthHelper {
 | 
			
		||||
      // Configure HTTPS instead of SSH
 | 
			
		||||
      await this.git.tryConfigUnset(this.insteadOfKey, true)
 | 
			
		||||
      if (!this.settings.sshKey) {
 | 
			
		||||
        await this.git.config(this.insteadOfKey, this.insteadOfValue, true)
 | 
			
		||||
        for (const insteadOfValue of this.insteadOfValues) {
 | 
			
		||||
          await this.git.config(this.insteadOfKey, insteadOfValue, true, true)
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    } catch (err) {
 | 
			
		||||
      // Unset in case somehow written to the real global config
 | 
			
		||||
@@ -159,10 +166,12 @@ class GitAuthHelper {
 | 
			
		||||
        )
 | 
			
		||||
      } else {
 | 
			
		||||
        // Configure HTTPS instead of SSH
 | 
			
		||||
        await this.git.submoduleForeach(
 | 
			
		||||
          `git config --local '${this.insteadOfKey}' '${this.insteadOfValue}'`,
 | 
			
		||||
          this.settings.nestedSubmodules
 | 
			
		||||
        )
 | 
			
		||||
        for (const insteadOfValue of this.insteadOfValues) {
 | 
			
		||||
          await this.git.submoduleForeach(
 | 
			
		||||
            `git config --local --add '${this.insteadOfKey}' '${insteadOfValue}'`,
 | 
			
		||||
            this.settings.nestedSubmodules
 | 
			
		||||
          )
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,8 @@ export interface IGitCommandManager {
 | 
			
		||||
  config(
 | 
			
		||||
    configKey: string,
 | 
			
		||||
    configValue: string,
 | 
			
		||||
    globalConfig?: boolean
 | 
			
		||||
    globalConfig?: boolean,
 | 
			
		||||
    add?: boolean
 | 
			
		||||
  ): Promise<void>
 | 
			
		||||
  configExists(configKey: string, globalConfig?: boolean): Promise<boolean>
 | 
			
		||||
  fetch(refSpec: string[], fetchDepth?: number): Promise<void>
 | 
			
		||||
@@ -140,14 +141,15 @@ class GitCommandManager {
 | 
			
		||||
  async config(
 | 
			
		||||
    configKey: string,
 | 
			
		||||
    configValue: string,
 | 
			
		||||
    globalConfig?: boolean
 | 
			
		||||
    globalConfig?: boolean,
 | 
			
		||||
    add?: boolean
 | 
			
		||||
  ): Promise<void> {
 | 
			
		||||
    await this.execGit([
 | 
			
		||||
      'config',
 | 
			
		||||
      globalConfig ? '--global' : '--local',
 | 
			
		||||
      configKey,
 | 
			
		||||
      configValue
 | 
			
		||||
    ])
 | 
			
		||||
    const args: string[] = ['config', globalConfig ? '--global' : '--local']
 | 
			
		||||
    if (add) {
 | 
			
		||||
      args.push('--add')
 | 
			
		||||
    }
 | 
			
		||||
    args.push(...[configKey, configValue])
 | 
			
		||||
    await this.execGit(args)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async configExists(
 | 
			
		||||
 
 | 
			
		||||
@@ -73,4 +73,9 @@ export interface IGitSourceSettings {
 | 
			
		||||
   * Indicates whether to persist the credentials on disk to enable scripting authenticated git commands
 | 
			
		||||
   */
 | 
			
		||||
  persistCredentials: boolean
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Organization ID for the currently running workflow (used for auth settings)
 | 
			
		||||
   */
 | 
			
		||||
  workflowOrganizationId: number | undefined
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,9 +2,10 @@ import * as core from '@actions/core'
 | 
			
		||||
import * as fsHelper from './fs-helper'
 | 
			
		||||
import * as github from '@actions/github'
 | 
			
		||||
import * as path from 'path'
 | 
			
		||||
import * as workflowContextHelper from './workflow-context-helper'
 | 
			
		||||
import {IGitSourceSettings} from './git-source-settings'
 | 
			
		||||
 | 
			
		||||
export function getInputs(): IGitSourceSettings {
 | 
			
		||||
export async function getInputs(): Promise<IGitSourceSettings> {
 | 
			
		||||
  const result = ({} as unknown) as IGitSourceSettings
 | 
			
		||||
 | 
			
		||||
  // GitHub workspace
 | 
			
		||||
@@ -118,5 +119,8 @@ export function getInputs(): IGitSourceSettings {
 | 
			
		||||
  result.persistCredentials =
 | 
			
		||||
    (core.getInput('persist-credentials') || 'false').toUpperCase() === 'TRUE'
 | 
			
		||||
 | 
			
		||||
  // Workflow organization ID
 | 
			
		||||
  result.workflowOrganizationId = await workflowContextHelper.getOrganizationId()
 | 
			
		||||
 | 
			
		||||
  return result
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ import * as stateHelper from './state-helper'
 | 
			
		||||
 | 
			
		||||
async function run(): Promise<void> {
 | 
			
		||||
  try {
 | 
			
		||||
    const sourceSettings = inputHelper.getInputs()
 | 
			
		||||
    const sourceSettings = await inputHelper.getInputs()
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
      // Register problem matcher
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										30
									
								
								src/workflow-context-helper.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								src/workflow-context-helper.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
import * as core from '@actions/core'
 | 
			
		||||
import * as fs from 'fs'
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Gets the organization ID of the running workflow or undefined if the value cannot be loaded from the GITHUB_EVENT_PATH
 | 
			
		||||
 */
 | 
			
		||||
export async function getOrganizationId(): Promise<number | undefined> {
 | 
			
		||||
  try {
 | 
			
		||||
    const eventPath = process.env.GITHUB_EVENT_PATH
 | 
			
		||||
    if (!eventPath) {
 | 
			
		||||
      core.debug(`GITHUB_EVENT_PATH is not defined`)
 | 
			
		||||
      return
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const content = await fs.promises.readFile(eventPath, {encoding: 'utf8'})
 | 
			
		||||
    const event = JSON.parse(content)
 | 
			
		||||
    const id = event?.repository?.owner?.id
 | 
			
		||||
    if (typeof id !== 'number') {
 | 
			
		||||
      core.debug('Repository owner ID not found within GITHUB event info')
 | 
			
		||||
      return
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return id as number
 | 
			
		||||
  } catch (err) {
 | 
			
		||||
    core.debug(
 | 
			
		||||
      `Unable to load organization ID from GITHUB_EVENT_PATH: ${(err as any)
 | 
			
		||||
        .message || err}`
 | 
			
		||||
    )
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user