mirror of
				https://github.com/actions/checkout.git
				synced 2025-11-04 01:33:35 +00:00 
			
		
		
		
	Improve checkout performance on Windows runners by upgrading @actions/github dependency
Re: https://github.com/actions/checkout/issues/1186 @dscho discovered that the checkout action could stall for a considerable amount of time on Windows runners waiting for PowerShell invocations made from 'windows-release' npm package to complete. Then I studied the dependency chain to figure out where 'windows-release' was imported: '@actions/checkout'@main <- '@actions/github'@2.2.0 <- '@octokit/endpoint'@6.0.1 <- '@octokit/graphql'@4.3.1 <- '@octokit/request'@5.4.2 <- '@octokit/rest'@16.43.1 <- 'universal-user-agent'@4.0.1 <- 'os-name'@3.1.0 <- 'windows-release'@3.1.0 'universal-user-agent' package dropped its dependency on 'os-name' in https://github.com/gr2m/universal-user-agent/releases/tag/v6.0.0 . '@actions/github' v3 removed dependency on '@octokit/rest'@16.43.1 and allows users to move away from the old 'universal-user-agent' v4. (https://github.com/actions/toolkit/pull/453) This pull request attempts to update the version of '@actions/github' used in the checkout action to avoid importing 'windows-release'. Based on testing in my own repositories, I can see an improvement in reduced wait time between entering the checkout action and git actually starts to do useful work.
This commit is contained in:
		
							parent
							
								
									8f4b7f8486
								
							
						
					
					
						commit
						a3c4ed97a0
					
				
							
								
								
									
										24768
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										24768
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										872
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										872
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -30,7 +30,7 @@
 | 
				
			|||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "@actions/core": "^1.10.0",
 | 
					    "@actions/core": "^1.10.0",
 | 
				
			||||||
    "@actions/exec": "^1.0.1",
 | 
					    "@actions/exec": "^1.0.1",
 | 
				
			||||||
    "@actions/github": "^2.2.0",
 | 
					    "@actions/github": "^5.0.0",
 | 
				
			||||||
    "@actions/io": "^1.1.3",
 | 
					    "@actions/io": "^1.1.3",
 | 
				
			||||||
    "@actions/tool-cache": "^1.1.2",
 | 
					    "@actions/tool-cache": "^1.1.2",
 | 
				
			||||||
    "uuid": "^3.3.3"
 | 
					    "uuid": "^3.3.3"
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +1,12 @@
 | 
				
			|||||||
import * as assert from 'assert'
 | 
					import * as assert from 'assert'
 | 
				
			||||||
import * as core from '@actions/core'
 | 
					import * as core from '@actions/core'
 | 
				
			||||||
import * as fs from 'fs'
 | 
					import * as fs from 'fs'
 | 
				
			||||||
 | 
					import * as github from '@actions/github'
 | 
				
			||||||
import * as io from '@actions/io'
 | 
					import * as io from '@actions/io'
 | 
				
			||||||
import * as path from 'path'
 | 
					import * as path from 'path'
 | 
				
			||||||
import * as retryHelper from './retry-helper'
 | 
					import * as retryHelper from './retry-helper'
 | 
				
			||||||
import * as toolCache from '@actions/tool-cache'
 | 
					import * as toolCache from '@actions/tool-cache'
 | 
				
			||||||
import {default as uuid} from 'uuid/v4'
 | 
					import {default as uuid} from 'uuid/v4'
 | 
				
			||||||
import {getOctokit, Octokit} from './octokit-provider'
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const IS_WINDOWS = process.platform === 'win32'
 | 
					const IS_WINDOWS = process.platform === 'win32'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -84,11 +84,11 @@ export async function getDefaultBranch(
 | 
				
			|||||||
): Promise<string> {
 | 
					): Promise<string> {
 | 
				
			||||||
  return await retryHelper.execute(async () => {
 | 
					  return await retryHelper.execute(async () => {
 | 
				
			||||||
    core.info('Retrieving the default branch name')
 | 
					    core.info('Retrieving the default branch name')
 | 
				
			||||||
    const octokit = getOctokit(authToken, {baseUrl: baseUrl})
 | 
					    const octokit = github.getOctokit(authToken, {baseUrl: baseUrl})
 | 
				
			||||||
    let result: string
 | 
					    let result: string
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      // Get the default branch from the repo info
 | 
					      // Get the default branch from the repo info
 | 
				
			||||||
      const response = await octokit.repos.get({owner, repo})
 | 
					      const response = await octokit.rest.repos.get({owner, repo})
 | 
				
			||||||
      result = response.data.default_branch
 | 
					      result = response.data.default_branch
 | 
				
			||||||
      assert.ok(result, 'default_branch cannot be empty')
 | 
					      assert.ok(result, 'default_branch cannot be empty')
 | 
				
			||||||
    } catch (err) {
 | 
					    } catch (err) {
 | 
				
			||||||
@ -125,19 +125,14 @@ async function downloadArchive(
 | 
				
			|||||||
  commit: string,
 | 
					  commit: string,
 | 
				
			||||||
  baseUrl?: string
 | 
					  baseUrl?: string
 | 
				
			||||||
): Promise<Buffer> {
 | 
					): Promise<Buffer> {
 | 
				
			||||||
  const octokit = getOctokit(authToken, {baseUrl: baseUrl})
 | 
					  const octokit = github.getOctokit(authToken, {baseUrl: baseUrl})
 | 
				
			||||||
  const params: Octokit.ReposGetArchiveLinkParams = {
 | 
					  const download = IS_WINDOWS
 | 
				
			||||||
 | 
					    ? octokit.rest.repos.downloadZipballArchive
 | 
				
			||||||
 | 
					    : octokit.rest.repos.downloadTarballArchive
 | 
				
			||||||
 | 
					  const response = await download({
 | 
				
			||||||
    owner: owner,
 | 
					    owner: owner,
 | 
				
			||||||
    repo: repo,
 | 
					    repo: repo,
 | 
				
			||||||
    archive_format: IS_WINDOWS ? 'zipball' : 'tarball',
 | 
					 | 
				
			||||||
    ref: commit || ref
 | 
					    ref: commit || ref
 | 
				
			||||||
  }
 | 
					  })
 | 
				
			||||||
  const response = await octokit.repos.getArchiveLink(params)
 | 
					  return Buffer.from(response.data as ArrayBuffer) // response.data is ArrayBuffer
 | 
				
			||||||
  if (response.status != 200) {
 | 
					 | 
				
			||||||
    throw new Error(
 | 
					 | 
				
			||||||
      `Unexpected response from GitHub API. Status: ${response.status}, Data: ${response.data}`
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return Buffer.from(response.data) // response.data is ArrayBuffer
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,23 +0,0 @@
 | 
				
			|||||||
import * as github from '@actions/github'
 | 
					 | 
				
			||||||
import {Octokit} from '@octokit/rest'
 | 
					 | 
				
			||||||
import {getServerApiUrl} from './url-helper'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Centralize all Octokit references by re-exporting
 | 
					 | 
				
			||||||
export {Octokit} from '@octokit/rest'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export type OctokitOptions = {
 | 
					 | 
				
			||||||
  baseUrl?: string
 | 
					 | 
				
			||||||
  userAgent?: string
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export function getOctokit(authToken: string, opts: OctokitOptions) {
 | 
					 | 
				
			||||||
  const options: Octokit.Options = {
 | 
					 | 
				
			||||||
    baseUrl: getServerApiUrl(opts.baseUrl)
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (opts.userAgent) {
 | 
					 | 
				
			||||||
    options.userAgent = opts.userAgent
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return new github.GitHub(authToken, options)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,7 +1,6 @@
 | 
				
			|||||||
import {IGitCommandManager} from './git-command-manager'
 | 
					import {IGitCommandManager} from './git-command-manager'
 | 
				
			||||||
import * as core from '@actions/core'
 | 
					import * as core from '@actions/core'
 | 
				
			||||||
import * as github from '@actions/github'
 | 
					import * as github from '@actions/github'
 | 
				
			||||||
import {getOctokit} from './octokit-provider'
 | 
					 | 
				
			||||||
import {isGhes} from './url-helper'
 | 
					import {isGhes} from './url-helper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const tagsRefSpec = '+refs/tags/*:refs/tags/*'
 | 
					export const tagsRefSpec = '+refs/tags/*:refs/tags/*'
 | 
				
			||||||
@ -245,7 +244,7 @@ export async function checkCommitInfo(
 | 
				
			|||||||
      core.debug(
 | 
					      core.debug(
 | 
				
			||||||
        `Expected head sha ${expectedHeadSha}; actual head sha ${actualHeadSha}`
 | 
					        `Expected head sha ${expectedHeadSha}; actual head sha ${actualHeadSha}`
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
      const octokit = getOctokit(token, {
 | 
					      const octokit = github.getOctokit(token, {
 | 
				
			||||||
        baseUrl: baseUrl,
 | 
					        baseUrl: baseUrl,
 | 
				
			||||||
        userAgent: `actions-checkout-tracepoint/1.0 (code=STALE_MERGE;owner=${repositoryOwner};repo=${repositoryName};pr=${fromPayload(
 | 
					        userAgent: `actions-checkout-tracepoint/1.0 (code=STALE_MERGE;owner=${repositoryOwner};repo=${repositoryName};pr=${fromPayload(
 | 
				
			||||||
          'number'
 | 
					          'number'
 | 
				
			||||||
@ -253,7 +252,10 @@ export async function checkCommitInfo(
 | 
				
			|||||||
          process.env['GITHUB_RUN_ID']
 | 
					          process.env['GITHUB_RUN_ID']
 | 
				
			||||||
        };expected_head_sha=${expectedHeadSha};actual_head_sha=${actualHeadSha})`
 | 
					        };expected_head_sha=${expectedHeadSha};actual_head_sha=${actualHeadSha})`
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
      await octokit.repos.get({owner: repositoryOwner, repo: repositoryName})
 | 
					      await octokit.rest.repos.get({
 | 
				
			||||||
 | 
					        owner: repositoryOwner,
 | 
				
			||||||
 | 
					        repo: repositoryName
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  } catch (err) {
 | 
					  } catch (err) {
 | 
				
			||||||
    core.debug(
 | 
					    core.debug(
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user