Skip to content

Commit 86ee28e

Browse files
authored
Merge pull request #45652 from github/repo-sync
Repo sync
2 parents 6e9b187 + 0a4d351 commit 86ee28e

24 files changed

Lines changed: 122 additions & 63 deletions

File tree

.github/workflows/check-for-spammy-prs.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,13 @@ jobs:
3535
});
3636
3737
const onlyDeletes = files.length > 0 && files.every(f => f.status === 'removed')
38-
const emptyCommit = !files.length
38+
const isEmptyCommit = !files.length
3939
const touchesTooMany = files.length > 10
40+
const totalChanges = files.reduce((sum, f) => sum + f.additions + f.deletions, 0)
41+
const isOneLineAddition = files.every(f => f.status === 'added') && totalChanges <= 1
4042
4143
// Close the PR and add the invalid label
42-
if (onlyDeletes || emptyCommit || touchesTooMany) {
44+
if (onlyDeletes || isEmptyCommit || touchesTooMany || isOneLineAddition) {
4345
await github.rest.issues.update({
4446
owner: owner,
4547
repo: repo,

.github/workflows/sync-openapi.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: Sync OpenAPI schema
22

3-
# **What it does**: Once a day, this workflow syncs the REST, Webhooks, and GitHub Apps automated pipelines with the github/rest-api-description repository, and creates a pull request if there are updates to any of the data files we generate from the OpenAPI.
3+
# **What it does**: Syncs the REST, Webhooks, and GitHub Apps automated pipelines with the github/rest-api-description repository, and creates a pull request if there are updates to any of the data files we generate from the OpenAPI. Runs on a weekday schedule or a `sync-openapi` repository dispatch.
44
# **Why we have it**: So we can automate updates to REST, Webhooks, and GitHub Apps documentation
55
# **Who does it impact**: Anyone making OpenAPI changes in `github/github`, and wanting to get them published on the docs site.
66

@@ -12,6 +12,8 @@ on:
1212
type: string
1313
required: true
1414
default: 'main'
15+
repository_dispatch:
16+
types: [sync-openapi]
1517
schedule:
1618
- cron: '20 16 * * 1-5' # Run Mon-Fri at 16:20 UTC / 8:20 PST
1719

@@ -40,7 +42,7 @@ jobs:
4042
# will be checked out
4143
repository: github/rest-api-description
4244
path: rest-api-description
43-
ref: ${{ inputs.SOURCE_BRANCH }}
45+
ref: ${{ inputs.SOURCE_BRANCH || github.event.client_payload.ref || 'main' }}
4446

4547
- uses: ./.github/actions/node-npm-setup
4648

content/admin/enforcing-policies/enforcing-policies-for-your-enterprise/enforcing-repository-management-policies-in-your-enterprise.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ By default, repository administrators can rename branches that are targeted by e
209209

210210
To keep your repository size manageable and prevent performance issues, you can configure a file size limit for repositories in your enterprise.
211211

212-
By default, when you enforce repository upload limits, people cannot add or update files larger than 100 MB.
212+
By default, people cannot add or update files larger than 100 MB, but you can raise or remove this limit. If you enforce your chosen limit for all repositories on the instance, individual repositories cannot use a different limit.
213213

214214
{% data reusables.enterprise-accounts.access-enterprise %}
215215
{% data reusables.enterprise-accounts.policies-tab %}

content/admin/managing-github-apps-for-your-enterprise/automate-installations.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,13 +228,13 @@ The installation token you just received gives you permission to create a reposi
228228
229229
1. To check the repository was created successfully, go to `https://github.com/orgs/ORG/repositories`, replacing ORG with the name of your organization.
230230
231-
{% note %}
231+
<div class="border rounded-2 p-3">
232232
233233
Was the repository created successfully?
234234
235235
<a href="https://docs.github.io/success-test/yes.html" target="_blank" class="btn btn-outline mt-3 mr-3 no-underline"><span>Yes</span></a> <a href="https://docs.github.io/success-test/no.html" target="_blank" class="btn btn-outline mt-3 mr-3 no-underline"><span>No</span></a>
236236
237-
{% endnote %}
237+
</div>
238238
239239
## 7. Uninstall the apps
240240

content/admin/monitoring-and-managing-your-instance/additional-nodes/configuring-additional-nodes.md

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,58 @@ Logs are stored locally on the stateless nodes. They can be exported from these
159159

160160
You can use the `ghe-cluster-support-bundle` and `ghe-support-bundle` commands to generate and upload cluster or single-node bundles.
161161

162+
## Mitigating single-core softirq saturation
163+
164+
165+
166+
Adding a stateless node to a {% data variables.product.prodname_ghe_server %} high-availability deployment sends all traffic between two nodes over a single WireGuard tunnel. Because every packet for that node pair shares one UDP port, the network card steers it to one receive queue, and one CPU core processes all inbound packets. Under heavy traffic that core reaches 100 percent while the others stay idle, and the node drops packets. {% data variables.product.prodname_ghe_server %} includes the built-in mitigations described below.
167+
168+
### 1. Scale out with more stateless nodes
169+
170+
Each stateless node reaches the primary over its own WireGuard tunnel, so the primary processes each node's traffic on a separate receive queue and CPU core. Spreading workloads across more, smaller stateless nodes lets the load balancer share cross-tunnel load across more of the primary's cores, and this does not rely on tunnel-level hashing. Two nodes roughly halve the per-core receive load, and three cut it to about a third.
171+
172+
{% data variables.product.prodname_ghe_server %} sizes each node's web workers from its memory and caps its own value at 30. Keep `app.github.github-workers` near 30 per node; higher counts cost memory and, during a tunnel stall, add queue depth rather than throughput, because the extra workers block on the primary. For more capacity, add more stateless nodes.
173+
174+
### 2. Multi-tunnel WireGuard (opt-in)
175+
176+
{% data variables.product.prodname_ghe_server %} can spread inter-node traffic across several WireGuard tunnels. Each tunnel uses its own UDP port, so different connections land on different receive queues and different CPU cores share the work. Set the tunnel count to the lowest number of receive queues across your cluster nodes, the "Combined" value of `ethtool -l eth0`.
177+
178+
```shell copy
179+
ghe-config wireguard.num-tunnels 8
180+
ghe-config-apply
181+
```
182+
183+
The default is 1. The maximum is 16; higher values are capped. More tunnels than the interface has receive queues adds no benefit. To revert, remove the setting and apply.
184+
185+
```shell copy
186+
ghe-config --unset wireguard.num-tunnels
187+
ghe-config-apply
188+
```
189+
190+
**Before you enable (one-time):**
191+
192+
* In your external firewall or cloud security group, open the extra tunnel UDP ports between all nodes, including all replicas. Ports count up from 1194, so 8 tunnels use UDP 1194 to 1201. The full range requires UDP 1194 to 1209.
193+
* Enabling multi-tunnel updates the host firewall. Apply it once by rebooting all nodes, or by reloading the firewall with `sudo ufw reload` on each node. Confirm your network security group already restricts inbound access first, as the ufw reload briefly drops and recreates the rules. Later `num-tunnels` changes do not need this step.
194+
195+
### 3. Local git-proxy routing on the primary (automatic)
196+
197+
Git requests that a stateless node would otherwise send back across the tunnel now stay on the primary, where the Git data already lives. This removes a large share of cross-tunnel packets, and needs no action. The primary uses its local Git proxy first and falls back to a remote node only if the local one is unavailable.
198+
199+
### 4. Capacity-based web request weighting (opt-in)
200+
201+
When nodes run different numbers of web workers, {% data variables.product.prodname_ghe_server %} can distribute requests in proportion to each node's worker count instead of evenly. Enable it when worker counts are uneven, for example a primary with 100 workers and a stateless node with 30.
202+
203+
```shell copy
204+
ghe-config app.github.unicorn-weight-by-capacity true
205+
ghe-config-apply
206+
```
207+
208+
The default is off.
209+
210+
### Choosing what to enable
211+
212+
Start by scaling out to more stateless nodes. It is the most complete option, spreads load across more of the primary's cores through the load balancer, and needs no feature flag. If a single core still saturates, enable multi-tunnel WireGuard. Enable capacity-based weighting only when worker counts differ across nodes.
213+
162214
## Known limitations
163215
164216
This feature is not designed for monorepos, but the addition of new stateless nodes may indirectly improve monorepo operations by reducing web and job workloads on the primary node. There are no autoscaling and scaledown features.

content/admin/monitoring-and-managing-your-instance/configuring-high-availability/elasticsearch-cross-cluster-replication.md

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,13 @@ Before you enable CCR, confirm the following.
3737
* Your instance is configured for high availability with at least two appliances (a primary and one or more replicas).
3838
* You have an updated {% data variables.product.prodname_ghe_server %} license that includes the Elasticsearch entitlement required for CCR. Contact {% data variables.contact.contact_enterprise_sales %} or {% data variables.contact.github_support %} to have your enterprise enabled for the new license, then download the updated license file.
3939

40-
{% warning %}
41-
42-
**Warning:** When CCR is enabled, the upgrade preflight check requires a valid CCR-enabled license. If the flag is enabled and the license check fails, the upgrade will not proceed. Make sure your updated license is installed before you enable the feature or upgrade. If you are unsure whether your license includes the Elasticsearch entitlement, contact {% data variables.contact.github_support %}.
43-
44-
{% endwarning %}
40+
> [!WARNING]
41+
> When CCR is enabled, the upgrade preflight check requires a valid CCR-enabled license. If the flag is enabled and the license check fails, the upgrade will not proceed. Make sure your updated license is installed before you enable the feature or upgrade. If you are unsure whether your license includes the Elasticsearch entitlement, contact {% data variables.contact.github_support %}.
4542
4643
## Enabling Elasticsearch Cross-Cluster Replication
4744

48-
{% note %}
49-
50-
**Note:** The migration may take a significant amount of time depending on the size of your instance, because search data is consolidated onto the primary before replication restarts. Plan to enable CCR during a maintenance window, and test the process in a non-production environment first. For more information, see [AUTOTITLE](/admin/upgrading-your-instance).
51-
52-
{% endnote %}
45+
> [!NOTE]
46+
> The migration may take a significant amount of time depending on the size of your instance, because search data is consolidated onto the primary before replication restarts. Plan to enable CCR during a maintenance window, and test the process in a non-production environment first. For more information, see [AUTOTITLE](/admin/upgrading-your-instance).
5347
5448
1. Contact {% data variables.contact.github_support %} and request access to the new HA search architecture. {% data variables.product.company_short %} will enable your enterprise so that you can download the required CCR-enabled license.
5549
1. Download your updated license and upload it to your instance. For more information, see [AUTOTITLE](/billing/how-tos/manage-server-licenses/download-your-license).
@@ -81,11 +75,8 @@ After a failover with CCR enabled, the promoted appliance becomes the new leader
8175

8276
### Disabling Elasticsearch Cross-Cluster Replication
8377

84-
{% warning %}
85-
86-
**Warning:** Do not disable CCR on a production instance without guidance from {% data variables.contact.github_support %}. Disabling CCR is not a routine self-service operation. Turning the feature off can trigger removal of replica Elasticsearch data as part of returning to the previous mode.
87-
88-
{% endwarning %}
78+
> [!WARNING]
79+
> Do not disable CCR on a production instance without guidance from {% data variables.contact.github_support %}. Disabling CCR is not a routine self-service operation. Turning the feature off can trigger removal of replica Elasticsearch data as part of returning to the previous mode.
8980
9081
If you need to return to the previous search architecture, contact {% data variables.contact.github_support %} before making any changes. {% data variables.product.company_short %} will help you confirm that your license, replication state, and upgrade path are handled safely.
9182

content/billing/reference/product-and-sku-names.md

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,16 +87,22 @@ For **SkuPricing** budgets or to query usage by SKU, use one of the following va
8787

8888
### {% data variables.product.prodname_copilot %} SKUs
8989

90-
* `copilot_ai_credits` - Copilot {% data variables.product.prodname_ai_credits_short %}
90+
* `coding_agent_ai_credit` - Copilot Cloud Agent
91+
* `copilot_ai_credit` - {% data variables.product.prodname_copilot_short %} {% data variables.product.prodname_ai_credits_short %}
9192
* `copilot_enterprise` - Copilot Enterprise
9293
* `copilot_for_business` - Copilot for Business
9394
* `copilot_standalone` - Copilot standalone
9495

9596
### {% data variables.product.prodname_GH_advanced_security %} SKUs
9697

97-
* `ghas_code_security_licenses` - GHAS code security licenses
98-
* `ghas_licenses` - GHAS licenses
99-
* `ghas_secret_protection_licenses` - GHAS secret protection licenses
98+
* `ghas_code_security_licenses` - Code Security
99+
* `ghas_licenses` - Advanced Security
100+
* `ghas_secret_protection_licenses` - Secret Protection
101+
102+
### {% data variables.product.prodname_code_quality %} SKUs
103+
104+
* `code_quality_licenses` - Code Quality Licenses
105+
* `code_quality_ai_credit` - Code Quality {% data variables.product.prodname_ai_credits_short %}
100106

101107
### Cloud and local sandboxes for {% data variables.product.prodname_copilot %} SKUs
102108

@@ -110,7 +116,7 @@ For **SkuPricing** budgets or to query usage by SKU, use one of the following va
110116
* `git_lfs_bandwidth` - Git LFS bandwidth
111117
* `git_lfs_storage` - Git LFS storage
112118
* `models_inference` - Models inference
113-
* `packages_bandwidth` - Packages bandwidth
119+
* `packages_bandwidth` - Packages data transfer
114120
* `packages_storage` - Packages storage
115121
* `spark_ai_credits` - Spark {% data variables.product.prodname_ai_credits_short %}
116122

content/billing/tutorials/control-costs-at-scale.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ gh api \
262262
-H "X-GitHub-Api-Version: {{ defaultRestApiVersion }}" \
263263
/enterprises/ENTERPRISE/settings/billing/budgets \
264264
-f budget_type='SkuPricing' \
265-
-f budget_product_sku='copilot_ai_credits' \
265+
-f budget_product_sku='copilot_ai_credit' \
266266
-f budget_scope='cost_center' \
267267
-f budget_entity_name='COST_CENTER_ID' \
268268
-F budget_amount=1000.0 \
@@ -276,7 +276,7 @@ The response confirms the budget was created and returns its configuration. Noti
276276
{
277277
"id": "budget-uuid-here",
278278
"budget_type": "SkuPricing",
279-
"budget_product_sku": "copilot_ai_credits",
279+
"budget_product_sku": "copilot_ai_credit",
280280
"budget_scope": "cost_center",
281281
"budget_entity_name": "3312fdf2-5950-4f64-913d-e734124059c9",
282282
"budget_amount": 1000.0,

content/code-security/how-tos/manage-security-alerts/remediate-alerts-at-scale/creating-managing-security-campaigns.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,13 @@ You choose the alerts that you want to include in the campaign by using either:
5959

6060
The security campaign is created and the campaign overview page is displayed.
6161

62-
{% note %}
62+
<div class="border rounded-2 p-3">
6363

6464
Did you successfully create a security campaign for your organization?
6565

6666
<a href="https://docs.github.io/success-test/yes.html" target="_blank" class="btn btn-outline mt-3 mr-3 no-underline"><span>Yes</span></a> <a href="https://docs.github.io/success-test/no.html" target="_blank" class="btn btn-outline mt-3 mr-3 no-underline"><span>No</span></a>
6767

68-
{% endnote %}
68+
</div>
6969

7070
### Examples of useful filters
7171

content/code-security/how-tos/secure-at-scale/configure-organization-security/configure-specific-tools/estimate-price.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,13 @@ You need to have generated a secret risk assessment for your organization. See [
4141
* The **per-committer rate** (for example, $19 per active committer).
4242
1. To proceed with enabling {% data variables.product.prodname_secret_protection %}, click **Review and enable**.
4343

44-
{% note %}
44+
<div class="border rounded-2 p-3">
4545

4646
Did you successfully use the {% data variables.secret-scanning.pricing-calculator %} to estimate the cost of using {% data variables.product.prodname_secret_protection %} features on your organization?
4747

4848
<a href="https://docs.github.io/success-test/yes.html" target="_blank" class="btn btn-outline mt-3 mr-3 no-underline"><span>Yes</span></a> <a href="https://docs.github.io/success-test/no.html" target="_blank" class="btn btn-outline mt-3 mr-3 no-underline"><span>No</span></a>
4949

50-
{% endnote %}
50+
</div>
5151

5252
## Understanding your results
5353

0 commit comments

Comments
 (0)