Skip to content

Commit a0dc1f7

Browse files
authored
Merge pull request #41549 from github/repo-sync
Repo sync
2 parents 83fd9a4 + 88a17c8 commit a0dc1f7

File tree

62 files changed

+620
-475
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+620
-475
lines changed

CHANGELOG.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,23 @@
11
# Docs changelog
22

3+
**25 November 2025**
4+
5+
We've added details of files that are excluded from Copilot code reviews.
6+
7+
See [About GitHub Copilot code review](https://docs.github.com/copilot/concepts/agents/code-review#excluded-files).
8+
9+
<hr>
10+
11+
**24 November 2025**
12+
13+
We've added a new tutorial on burning down technical debt in a project:
14+
15+
[Using GitHub Copilot to reduce technical debt](https://docs.github.com/en/copilot/tutorials/reduce-technical-debt)
16+
17+
The addition of this tutorial was prompted by a presentation by Brittany Ellich at this year's GitHub Universe conference: [Tackling your tech debt with Copilot coding agent](https://www.youtube.com/watch?v=LafpndhNC_E), and is based on a GitHub community post by Akash Sharma: [Stop Letting Technical Debt Slow You Down](https://github.com/orgs/community/discussions/178975).
18+
19+
<hr>
20+
321
**13 November 2025**
422

523
We've published a new tutorial on [using custom instructions for Copilot code review](https://docs.github.com/copilot/tutorials/use-custom-instructions). In this tutorial you'll learn how to write effective custom instructions that help Copilot provide more relevant and actionable code reviews.

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
# ---------------------------------------------------------------
99
# To update the sha:
1010
# https://github.com/github/gh-base-image/pkgs/container/gh-base-image%2Fgh-base-noble
11-
FROM ghcr.io/github/gh-base-image/gh-base-noble:20251114-221740-gd084d271e AS base
11+
FROM ghcr.io/github/gh-base-image/gh-base-noble:20251119-090131-gb27dc275c AS base
1212

1313
# Install curl for Node install and determining the early access branch
1414
# Install git for cloning docs-early-access & translations repos
-37 KB
Binary file not shown.

content/actions/how-tos/manage-runners/larger-runners/use-custom-images.md

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -89,24 +89,6 @@ jobs:
8989
# Add any steps to download and setup any dependencies here
9090
```
9191

92-
### Conditionals
93-
94-
The `snapshot` keyword supports conditional execution using the `if` keyword around the snapshot mapping. You can use conditions to control when an image snapshot is created. For example, the following job skips image creation for tag builds.
95-
96-
```yaml
97-
jobs:
98-
build:
99-
runs-on: my-image-generation-runner
100-
snapshot:
101-
if: {% raw %}${{ ! startsWith(github.ref, 'refs/tags/') }}{% endraw %}
102-
image-name: my-custom-image
103-
version: 2.*
104-
steps:
105-
# Add any steps to download and setup any dependencies here
106-
```
107-
108-
For more information about the `if` keyword, see [AUTOTITLE](/actions/writing-workflows/choosing-when-your-workflow-runs/using-conditions-to-control-job-execution).
109-
11092
## Versioning
11193

11294
When you generate custom images, {% data variables.product.github %} automatically assigns version numbers to help you manage updates and track image history.

content/admin/enforcing-policies/enforcing-policies-for-your-enterprise/enforcing-policies-for-code-security-and-analysis-for-your-enterprise.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ Disallowing {% data variables.product.prodname_GH_sp_cs_and_cq_or_as %} for an o
5151
{% data reusables.enterprise-accounts.advanced-security-organization-policy-drop-down %}
5252
{% data reusables.enterprise-accounts.advanced-security-individual-organization-policy-drop-down %}
5353

54+
> [!NOTE]
55+
> If {% data variables.product.prodname_actions %} is not available for an organization, {% data variables.product.prodname_code_scanning %} and {% data variables.product.prodname_code_quality %} will be unable to run even if they are made available with this policy. See [AUTOTITLE](/admin/enforcing-policies/enforcing-policies-for-your-enterprise/enforcing-policies-for-github-actions-in-your-enterprise#policies).
56+
5457
{% ifversion ghec %}
5558

5659
## Enforcing a policy for visibility of dependency insights

content/admin/enforcing-policies/enforcing-policies-for-your-enterprise/enforcing-policies-for-github-actions-in-your-enterprise.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ Enterprise policies control the options that are available to enterprise members
3131

3232
If you don't enforce enterprise policies, organization owners{% ifversion custom-org-roles %} and users with the "Manage organization Actions policies" permission{% endif %} have full control over {% data variables.product.prodname_actions %} for their organizations.
3333

34+
> [!NOTE] {% data variables.product.prodname_actions %} must be enabled for repositories in an organization for the {% data variables.product.prodname_codeql %} {% data variables.product.prodname_code_scanning %} default setup and {% data variables.product.prodname_code_quality %} workflows to run. However, the {% data variables.product.prodname_codeql %} default setup for {% data variables.product.prodname_code_scanning %} is not affected by other {% data variables.product.prodname_actions %} policies (such as restricting access to public actions or reusable workflows).
35+
3436
## Enforcing policies
3537

3638
{% data reusables.enterprise-accounts.access-enterprise %}
@@ -48,7 +50,14 @@ In the "Policies" section, you can control which organizations within your enter
4850
* Enable {% data variables.product.prodname_actions %} for specific organizations
4951
* Disable {% data variables.product.prodname_actions %} for all organizations
5052

51-
You can also limit the use of public actions {% ifversion actions-workflow-policy %}and reusable workflows{% endif %}, with the following options:
53+
> [!NOTE]
54+
> If you disable {% data variables.product.prodname_actions %}, or do not enable the feature for one or more organizations, this blocks affected organizations from using {% data variables.product.prodname_code_scanning %} and {% data variables.product.prodname_code_quality %} analysis.
55+
56+
### Controlling access to public actions{% ifversion actions-workflow-policy %} and reusable workflows{% endif %}
57+
58+
Enterprises often want to limit access to only a well-tested group of public actions {% ifversion actions-workflow-policy %}and reusable workflows{% endif %} as part of their supply chain governance. The policies available in {% data variables.product.github %} allow you to control access without blocking the dynamic workflows used by {% data variables.product.prodname_code_scanning %} and {% data variables.product.prodname_code_quality %}.
59+
60+
You can enforce strict controls without defining exceptions or additional configuration for {% data variables.product.prodname_code_scanning %} and {% data variables.product.prodname_code_quality %}, with the following options:
5261

5362
* **Allow all actions {% ifversion actions-workflow-policy %}and reusable workflows{% endif %}:** Any action {% ifversion actions-workflow-policy %}or reusable workflow{% endif %} can be used, regardless of who authored it or where it is defined.
5463
* **Allow enterprise actions {% ifversion actions-workflow-policy %}and reusable workflows{% endif %}:** Only actions {% ifversion actions-workflow-policy %}and reusable workflows{% endif %} defined in a repository within the enterprise can be used. {% ifversion ghec %}Blocks all access to actions authored by {% data variables.product.prodname_dotcom %}, such as the [`actions/checkout`](https://github.com/actions/checkout) action.{% endif %}

content/admin/enforcing-policies/enforcing-policy-with-pre-receive-hooks/about-pre-receive-hooks.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,26 @@ Due to risk of failure and performance impact for all users of your instance, we
4444
> [!NOTE]
4545
> To avoid rejection of a push due to a timeout, all combined pre-receive hooks should run in under five seconds.
4646
47+
## Pre-receive hook timeouts
48+
49+
Pre-receive hooks in {% data variables.product.prodname_ghe_server %} have a fixed timeout budget of 5 seconds (shared across all hooks). This is intentional design to prevent resource exhaustion from long-running hooks and to prevent runaway scripts from blocking repository operations indefinitely.
50+
51+
All pre-receive hooks for a repository share a **cumulative timeout budget**:
52+
- If hook A takes 3 seconds, hook B gets 2 seconds remaining (from 5 second default)
53+
- If hook A times out at 5 seconds, hook B never executes
54+
55+
> [!IMPORTANT]
56+
> Pre-receive hook timeouts are handled differently from exit codes:
57+
> - **Exit codes**: Enforcement configuration is honored (non-enforced hooks don't block pushes)
58+
> - **Timeouts**: Push may fail regardless of enforcement configuration
59+
60+
### Timeout behavior
61+
62+
Scenario | Enforcement = Enabled | Enforcement = Disabled/Testing
63+
----------|----------------------|--------------------------------
64+
Exit code ≠ 0 | Push rejected | Push continues (warning only)
65+
Timeout exceeded | Push rejected | Warning + push may still fail
66+
4767
{% ifversion ghes > 3.16 %}
4868

4969
{% data reusables.repositories.push-rule-and-prereceive-hooks %}

content/apps/creating-github-apps/authenticating-with-a-github-app/generating-a-json-web-token-jwt-for-a-github-app.md

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Your JWT must be signed using the `RS256` algorithm and must contain the followi
2020
|---|---|---|
2121
|`iat`| Issued At | The time that the JWT was created. To protect against clock drift, we recommend that you set this 60 seconds in the past and ensure that your server's date and time is set accurately (for example, by using the Network Time Protocol). |
2222
|`exp`| Expires At | The expiration time of the JWT, after which it can't be used to request an installation token. The time must be no more than 10 minutes into the future. |
23-
|`iss`| Issuer | The client ID or application ID of your {% data variables.product.prodname_github_app %}. This value is used to find the right public key to verify the signature of the JWT. You can find your app's IDs on the settings page for your {% data variables.product.prodname_github_app %}. Use of the client ID is recommended. For more information about navigating to the settings page for your {% data variables.product.prodname_github_app %}, see [AUTOTITLE](/apps/maintaining-github-apps/modifying-a-github-app-registration#navigating-to-your-github-app-settings).|
23+
|`iss`| Issuer | The {% ifversion client-id-for-app %}client ID or {% endif %}application ID of your {% data variables.product.prodname_github_app %}. This value is used to find the right public key to verify the signature of the JWT. You can find your app's ID{% ifversion client-id-for-app %}s{% endif %} on the settings page for your {% data variables.product.prodname_github_app %}.{% ifversion client-id-for-app %} Use of the client ID is recommended.{% endif %} For more information about navigating to the settings page for your {% data variables.product.prodname_github_app %}, see [AUTOTITLE](/apps/maintaining-github-apps/modifying-a-github-app-registration#navigating-to-your-github-app-settings).|
2424
|`alg`| Message authentication code algorithm | This should be `RS256` since your JWT must be signed using the `RS256` algorithm. |
2525

2626
To use a JWT, pass it in the `Authorization` header of an API request. For example:
@@ -47,7 +47,7 @@ Most programming languages have a package that can generate a JWT. In all cases,
4747
> [!NOTE]
4848
> You must run `gem install jwt` to install the `jwt` package in order to use this script.
4949
50-
In the following example, replace `YOUR_PATH_TO_PEM` with the file path where your private key is stored. Replace `YOUR_CLIENT_ID` with the ID of your app. Make sure to enclose the values for `YOUR_PATH_TO_PEM` and `YOUR_CLIENT_ID` in double quotes.
50+
In the following example, replace `YOUR_PATH_TO_PEM` with the file path where your private key is stored. Replace {% ifversion client-id-for-app %}`YOUR_CLIENT_ID`{% else %}`YOUR_APP_ID`{% endif %} with the ID of your app. Make sure to enclose the values for `YOUR_PATH_TO_PEM` and {% ifversion client-id-for-app %}`YOUR_CLIENT_ID`{% else %}`YOUR_APP_ID`{% endif %} in double quotes.
5151

5252
```ruby
5353
require 'openssl'
@@ -63,10 +63,11 @@ payload = {
6363
iat: Time.now.to_i - 60,
6464
# JWT expiration time (10 minute maximum)
6565
exp: Time.now.to_i + (10 * 60),
66-
66+
{% ifversion client-id-for-app %}
6767
# {% data variables.product.prodname_github_app %}'s client ID
68-
iss: "YOUR_CLIENT_ID"
69-
68+
iss: "YOUR_CLIENT_ID"{% else %}
69+
# {% data variables.product.prodname_github_app %}'s app ID
70+
iss: "YOUR_APP_ID"{% endif %}
7071
}
7172

7273
jwt = JWT.encode(payload, private_key, "RS256")
@@ -92,12 +93,19 @@ if len(sys.argv) > 1:
9293
else:
9394
pem = input("Enter path of private PEM file: ")
9495

96+
{% ifversion client-id-for-app %}
9597
# Get the Client ID
9698
if len(sys.argv) > 2:
9799
client_id = sys.argv[2]
98100
else:
99101
client_id = input("Enter your Client ID: ")
100-
102+
{% else %}
103+
# Get the App ID
104+
if len(sys.argv) > 2:
105+
app_id = sys.argv[2]
106+
else:
107+
app_id = input("Enter your APP ID: ")
108+
{% endif %}
101109

102110
# Open PEM
103111
with open(pem, 'rb') as pem_file:
@@ -108,9 +116,11 @@ payload = {
108116
'iat': int(time.time()),
109117
# JWT expiration time (10 minutes maximum)
110118
'exp': int(time.time()) + 600,
111-
119+
{% ifversion client-id-for-app %}
112120
# {% data variables.product.prodname_github_app %}'s client ID
113-
'iss': client_id
121+
'iss': client_id{% else %}
122+
# {% data variables.product.prodname_github_app %}'s app ID
123+
'iss': app_id{% endif %}
114124

115125
}
116126

@@ -125,14 +135,16 @@ This script will prompt you for the file path where your private key is stored a
125135
### Example: Using Bash to generate a JWT
126136

127137
> [!NOTE]
128-
> You must pass your Client ID and the file path where your private key is stored as arguments when running this script.
138+
> You must pass your {% ifversion client-id-for-app %}Client ID{% else %}App ID{% endif %} and the file path where your private key is stored as arguments when running this script.
129139

130140
```bash copy
131141
#!/usr/bin/env bash
132142

133-
set -o pipefail
143+
{% ifversion client-id-for-app %}
134144
client_id=$1 # Client ID as first argument
135-
145+
{% else %}
146+
app_id=$1 # App ID as first argument
147+
{% endif %}
136148
pem=$( cat $2 ) # file path of the private key as second argument
137149

138150
now=$(date +%s)
@@ -151,7 +163,7 @@ header=$( echo -n "${header_json}" | b64enc )
151163
payload_json="{
152164
\"iat\":${iat},
153165
\"exp\":${exp},
154-
\"iss\":\"${client_id}\"
166+
{% ifversion client-id-for-app %}\"iss\":\"${client_id}\"{% else %}\"iss\":\"${app_id}\"{% endif %}
155167
}"
156168
# Payload encode
157169
payload=$( echo -n "${payload_json}" | b64enc )
@@ -170,13 +182,16 @@ printf '%s\n' "JWT: $JWT"
170182

171183
### Example: Using PowerShell to generate a JWT
172184

173-
In the following example, replace `YOUR_PATH_TO_PEM` with the file path where your private key is stored. Replace `YOUR_CLIENT_ID` with the ID of your app. Make sure to enclose the values for `YOUR_PATH_TO_PEM` in double quotes.
185+
In the following example, replace `YOUR_PATH_TO_PEM` with the file path where your private key is stored. Replace {% ifversion client-id-for-app %}`YOUR_CLIENT_ID`{% else %}`YOUR_APP_ID`{% endif %} with the ID of your app. Make sure to enclose the values for `YOUR_PATH_TO_PEM` in double quotes.
174186

175187
```powershell copy
176188
#!/usr/bin/env pwsh
177189

190+
{% ifversion client-id-for-app %}
178191
$client_id = YOUR_CLIENT_ID
179-
192+
{% else %}
193+
$app_id = YOUR_APP_ID
194+
{% endif %}
180195
$private_key_path = "YOUR_PATH_TO_PEM"
181196

182197
$header = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes((ConvertTo-Json -InputObject @{
@@ -187,7 +202,7 @@ $header = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes((Conve
187202
$payload = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes((ConvertTo-Json -InputObject @{
188203
iat = [System.DateTimeOffset]::UtcNow.AddSeconds(-10).ToUnixTimeSeconds()
189204
exp = [System.DateTimeOffset]::UtcNow.AddMinutes(10).ToUnixTimeSeconds()
190-
iss = $client_id
205+
{% ifversion client-id-for-app %}iss = $client_id{% else %}iss = $app_id{% endif %}
191206
}))).TrimEnd('=').Replace('+', '-').Replace('/', '_');
192207

193208
$rsa = [System.Security.Cryptography.RSA]::Create()

content/billing/concepts/cost-centers.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,4 @@ For more details, see [AUTOTITLE](/billing/reference/cost-center-allocation).
3535
* The maximum number of resources per cost center is 10,000.
3636
* A maximum of 50 resources can be added to or removed from a cost center at a time.
3737
* Azure subscriptions can only be added to or removed from cost centers through the UI.
38+
* Outside collaborators can only be added to cost centers via the cost center API. For more information, see [AUTOTITLE](/billing/tutorials/control-costs-at-scale#add-resources-to-the-cost-center).

content/code-security/code-quality/concepts/about-code-quality.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ With {% data variables.product.prodname_code_quality_short %}, you can:
4242

4343
{% data reusables.code-quality.codeql-supported-languages %}
4444

45-
Code quality problems in other languages are detected by AI analysis alone. For more information on analysis, see [AUTOTITLE](/code-security/code-quality/responsible-use/code-quality).
45+
{% data variables.product.prodname_code_quality_short %} also performs AI-powered analysis with results displayed separately on the "**{% data variables.code-quality.recent_suggestions %}**" repository dashboard. Unlike the rule-based {% data variables.product.prodname_codeql %} analysis that scans the entire codebase and pull requests, this AI-powered analysis only examines files recently pushed to the default branch and may identify issues in languages beyond those listed above. For more information, see [AUTOTITLE](/code-security/code-quality/responsible-use/code-quality).
4646

4747
## Understanding where {% data variables.product.prodname_code_quality_short %} findings appear after enablement
4848

0 commit comments

Comments
 (0)