Skip to content

Repo sync #39356

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Jul 17, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,11 @@ redirect_from:

{% data reusables.actions.enterprise-github-hosted-runners %}

## About workflow triggers
## Prerequisites

{% data reusables.actions.about-triggers %}
To learn more about workflows and triggering workflows, see [AUTOTITLE](/actions/concepts/workflows-and-actions/workflows).

Workflow triggers are defined with the `on` key. For more information, see [AUTOTITLE](/actions/using-workflows/workflow-syntax-for-github-actions#on).

The following steps occur to trigger a workflow run:

1. An event occurs on your repository. The event has an associated commit SHA and Git ref.
1. {% data variables.product.github %} searches the `.github/workflows` directory in the root of your repository for workflow files that are present in the associated commit SHA or Git ref of the event.
1. A workflow run is triggered for any workflows that have `on:` values that match the triggering event. Some events also require the workflow file to be present on the default branch of the repository in order to run.

Each workflow run will use the version of the workflow that is present in the associated commit SHA or Git ref of the event. When a workflow runs, {% data variables.product.github %} sets the `GITHUB_SHA` (commit SHA) and `GITHUB_REF` (Git ref) environment variables in the runner environment. For more information, see [AUTOTITLE](/actions/learn-github-actions/variables).

### Triggering a workflow from a workflow
## Triggering a workflow from a workflow

{% data reusables.actions.actions-do-not-trigger-workflows %} For more information, see [AUTOTITLE](/actions/security-guides/automatic-token-authentication).

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ redirect_from:

>[!NOTE]
> * MCP support is generally available (GA) in {% data variables.copilot.copilot_chat_short %} for {% data variables.product.prodname_vscode %}.
> * MCP support for Copilot in {% data variables.product.prodname_vs %}, JetBrains, Eclipse, and Xcode is in {% data variables.release-phases.public_preview %} and is subject to change.
> * The [AUTOTITLE](/free-pro-team@latest/site-policy/github-terms/github-pre-release-license-terms) apply to your use of this product.
> * MCP support for {% data variables.product.prodname_copilot_short %} in {% data variables.product.prodname_vs %}, JetBrains, Eclipse, and Xcode is in {% data variables.release-phases.public_preview %} and is subject to change.
> * The [AUTOTITLE](/free-pro-team@latest/site-policy/github-terms/github-pre-release-license-terms) apply only to {% data variables.product.prodname_copilot_short %} in IDEs where MCP support is still in preview. GA terms apply when using MCP for {% data variables.product.prodname_copilot_short %} in {% data variables.product.prodname_vscode %}.
{% vscode %}

Expand Down
8 changes: 7 additions & 1 deletion data/release-notes/enterprise-server/3-14/0.yml
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,10 @@ sections:
- |
When using a JSON Web Token (JWT) to authenticate or request an installation token, developers of GitHub Apps can use the app's client ID for the JWT's `iss` claim. The application ID remains valid, but is considered deprecated.

changes:
- |
The API endpoint for setting and removing organization membership for a user (`PUT /orgs/{org}/memberships/{username}` and `DELETE /orgs/{org}/memberships/{username}`) requires `admin:org` permissions for classic tokens. Previously, the changes were allowed with the `read:org, repo` permissions. [Updated: 2025-07-16]

known_issues:
- |
Complete SCIM payloads are written to the audit log, including SCIM attributes that are not required or supported per [API docs](/rest/enterprise-admin/scim?apiVersion=2022-11-28#supported-scim-user-attributes). Customers using Okta with SCIM may notice that a placeholder password attribute is among the data passed to audit logs in its current configuration. This placeholder data is associated with Okta’s password synchronization feature that is not expected or required by GitHub. See [okta-scim](https://developer.okta.com/docs/api/openapi/okta-scim/guides/scim-20/#create-the-user) for more information.
Expand Down Expand Up @@ -244,5 +248,7 @@ sections:
These release notes previously did not include a note for the deprecation of team discussions.
- |
These release notes previously indicated as a known issue that on GitHub Enterprise Server 3.14.0, repositories originally imported using `ghe-migrator` will not correctly track Advanced Security contributions.

The fix for this problem was already included in GitHub Enterprise Server [3.12](/admin/release-notes#3.12.0-bugs). [Updated: 2025-04-11]
- |
The release notes previously did not include a note for the change in permissions required for managing user organization membership. [Updated: 2025-07-16]
10 changes: 10 additions & 0 deletions data/reusables/actions/about-triggers.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,13 @@ Workflow triggers are events that cause a workflow to run. These events can be:
* Manual

For example, you can configure your workflow to run when a push is made to the default branch of your repository, when a release is created, or when an issue is opened.

Workflow triggers are defined with the `on` key. For more information, see [AUTOTITLE](/actions/using-workflows/workflow-syntax-for-github-actions#on).

The following steps occur to trigger a workflow run:

1. An event occurs on your repository. The event has an associated commit SHA and Git ref.
1. {% data variables.product.github %} searches the `.github/workflows` directory in the root of your repository for workflow files that are present in the associated commit SHA or Git ref of the event.
1. A workflow run is triggered for any workflows that have `on:` values that match the triggering event. Some events also require the workflow file to be present on the default branch of the repository in order to run.

Each workflow run will use the version of the workflow that is present in the associated commit SHA or Git ref of the event. When a workflow runs, {% data variables.product.github %} sets the `GITHUB_SHA` (commit SHA) and `GITHUB_REF` (Git ref) environment variables in the runner environment. For more information, see [AUTOTITLE](/actions/learn-github-actions/variables).
1 change: 1 addition & 0 deletions data/reusables/contributing/content-linter-rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
| GHD042 | liquid-tag-whitespace | Liquid tags should start and end with one whitespace. Liquid tag arguments should be separated by only one whitespace. | error | liquid, format |
| GHD043 | link-quotation | Internal link titles must not be surrounded by quotations | error | links, url |
| GHD044 | octicon-aria-labels | Octicons should always have an aria-label attribute even if aria-hidden. | warning | accessibility, octicons |
| GHD046 | outdated-release-phase-terminology | Outdated release phase terminology should be replaced with current GitHub terminology | warning | terminology, consistency, release-phases |
| GHD048 | british-english-quotes | Periods and commas should be placed inside quotation marks (American English style) | warning | punctuation, quotes, style, consistency |
| GHD050 | multiple-emphasis-patterns | Do not use more than one emphasis/strong, italics, or uppercase for a string | warning | formatting, emphasis, style |
| GHD049 | note-warning-formatting | Note and warning tags should be formatted according to style guide | warning | formatting, callouts, notes, warnings, style |
2 changes: 1 addition & 1 deletion data/reusables/repositories/ruleset-beta-note.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
> [!NOTE]
> {% ifversion ghes > 3.16 %}Only changes made to a ruleset after you have upgraded to {% data variables.product.prodname_ghe_server %} 3.17.0, or a later version, are included in the ruleset history.{% elsif fpt or ghec %}Only changes made to a ruleset after the {% data variables.release-phases.public_preview %} release, on October 11, 2023, are included in the ruleset history.{% endif %}
> {% ifversion ghes > 3.16 %}Only changes made to a ruleset after you have upgraded to {% data variables.product.prodname_ghe_server %} 3.17.0, or a later version, are included in the ruleset history.{% endif %}
2 changes: 2 additions & 0 deletions data/reusables/repositories/ruleset-history-conceptual.md
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
Ruleset history lists events triggered by changes that affect your rulesets within the last 180 days.

You can view all the changes to a ruleset and revert back to a specific iteration. You can also download a JSON file containing the ruleset's configuration at a specific iteration. The bypass list of a ruleset is excluded from the exported JSON file.
86 changes: 50 additions & 36 deletions src/content-linter/lib/linting-rules/index.js
Original file line number Diff line number Diff line change
@@ -1,42 +1,55 @@
import searchReplace from 'markdownlint-rule-search-replace'
import markdownlintGitHub from '@github/markdownlint-github'

import { codeFenceLineLength } from './code-fence-line-length'
import { imageAltTextEndPunctuation } from './image-alt-text-end-punctuation'
import { imageFileKebabCase } from './image-file-kebab-case'
import { incorrectAltTextLength } from './image-alt-text-length'
import { internalLinksNoLang } from './internal-links-no-lang'
import { internalLinksSlash } from './internal-links-slash'
import { imageAltTextExcludeStartWords } from './image-alt-text-exclude-start-words'
import { listFirstWordCapitalization } from './list-first-word-capitalization'
import { linkPunctuation } from './link-punctuation'
import { earlyAccessReferences, frontmatterEarlyAccessReferences } from './early-access-references'
import { frontmatterHiddenDocs } from './frontmatter-hidden-docs'
import { frontmatterVideoTranscripts } from './frontmatter-video-transcripts'
import { yamlScheduledJobs } from './yaml-scheduled-jobs'
import { internalLinksOldVersion } from './internal-links-old-version'
import { hardcodedDataVariable } from './hardcoded-data-variable'
import { githubOwnedActionReferences } from './github-owned-action-references'
import { liquidQuotedConditionalArg } from './liquid-quoted-conditional-arg'
import { liquidDataReferencesDefined, liquidDataTagFormat } from './liquid-data-tags'
import { frontmatterSchema } from './frontmatter-schema'
import { codeAnnotations } from './code-annotations'
import { codeAnnotationCommentSpacing } from './code-annotation-comment-spacing'
import { frontmatterLiquidSyntax, liquidSyntax } from './liquid-syntax'
import { liquidIfTags, liquidIfVersionTags } from './liquid-versioning'
import { raiReusableUsage } from './rai-reusable-usage'
import { imageNoGif } from './image-no-gif'
import { expiredContent, expiringSoon } from './expired-content'
import { tableLiquidVersioning } from './table-liquid-versioning'
import { tableColumnIntegrity } from './table-column-integrity'
import { thirdPartyActionPinning } from './third-party-action-pinning'
import { liquidTagWhitespace } from './liquid-tag-whitespace'
import { linkQuotation } from './link-quotation'
import { octiconAriaLabels } from './octicon-aria-labels'
import { liquidIfversionVersions } from './liquid-ifversion-versions'
import { britishEnglishQuotes } from './british-english-quotes'
import { multipleEmphasisPatterns } from './multiple-emphasis-patterns'
import { noteWarningFormatting } from './note-warning-formatting'
import { codeFenceLineLength } from '@/content-linter/lib/linting-rules/code-fence-line-length'
import { imageAltTextEndPunctuation } from '@/content-linter/lib/linting-rules/image-alt-text-end-punctuation'
import { imageFileKebabCase } from '@/content-linter/lib/linting-rules/image-file-kebab-case'
import { incorrectAltTextLength } from '@/content-linter/lib/linting-rules/image-alt-text-length'
import { internalLinksNoLang } from '@/content-linter/lib/linting-rules/internal-links-no-lang'
import { internalLinksSlash } from '@/content-linter/lib/linting-rules/internal-links-slash'
import { imageAltTextExcludeStartWords } from '@/content-linter/lib/linting-rules/image-alt-text-exclude-start-words'
import { listFirstWordCapitalization } from '@/content-linter/lib/linting-rules/list-first-word-capitalization'
import { linkPunctuation } from '@/content-linter/lib/linting-rules/link-punctuation'
import {
earlyAccessReferences,
frontmatterEarlyAccessReferences,
} from '@/content-linter/lib/linting-rules/early-access-references'
import { frontmatterHiddenDocs } from '@/content-linter/lib/linting-rules/frontmatter-hidden-docs'
import { frontmatterVideoTranscripts } from '@/content-linter/lib/linting-rules/frontmatter-video-transcripts'
import { yamlScheduledJobs } from '@/content-linter/lib/linting-rules/yaml-scheduled-jobs'
import { internalLinksOldVersion } from '@/content-linter/lib/linting-rules/internal-links-old-version'
import { hardcodedDataVariable } from '@/content-linter/lib/linting-rules/hardcoded-data-variable'
import { githubOwnedActionReferences } from '@/content-linter/lib/linting-rules/github-owned-action-references'
import { liquidQuotedConditionalArg } from '@/content-linter/lib/linting-rules/liquid-quoted-conditional-arg'
import {
liquidDataReferencesDefined,
liquidDataTagFormat,
} from '@/content-linter/lib/linting-rules/liquid-data-tags'
import { frontmatterSchema } from '@/content-linter/lib/linting-rules/frontmatter-schema'
import { codeAnnotations } from '@/content-linter/lib/linting-rules/code-annotations'
import { codeAnnotationCommentSpacing } from '@/content-linter/lib/linting-rules/code-annotation-comment-spacing'
import {
frontmatterLiquidSyntax,
liquidSyntax,
} from '@/content-linter/lib/linting-rules/liquid-syntax'
import {
liquidIfTags,
liquidIfVersionTags,
} from '@/content-linter/lib/linting-rules/liquid-versioning'
import { raiReusableUsage } from '@/content-linter/lib/linting-rules/rai-reusable-usage'
import { imageNoGif } from '@/content-linter/lib/linting-rules/image-no-gif'
import { expiredContent, expiringSoon } from '@/content-linter/lib/linting-rules/expired-content'
import { tableLiquidVersioning } from '@/content-linter/lib/linting-rules/table-liquid-versioning'
import { tableColumnIntegrity } from '@/content-linter/lib/linting-rules/table-column-integrity'
import { thirdPartyActionPinning } from '@/content-linter/lib/linting-rules/third-party-action-pinning'
import { liquidTagWhitespace } from '@/content-linter/lib/linting-rules/liquid-tag-whitespace'
import { linkQuotation } from '@/content-linter/lib/linting-rules/link-quotation'
import { octiconAriaLabels } from '@/content-linter/lib/linting-rules/octicon-aria-labels'
import { liquidIfversionVersions } from '@/content-linter/lib/linting-rules/liquid-ifversion-versions'
import { outdatedReleasePhaseTerminology } from '@/content-linter/lib/linting-rules/outdated-release-phase-terminology'
import { britishEnglishQuotes } from '@/content-linter/lib/linting-rules/british-english-quotes'
import { multipleEmphasisPatterns } from '@/content-linter/lib/linting-rules/multiple-emphasis-patterns'
import { noteWarningFormatting } from '@/content-linter/lib/linting-rules/note-warning-formatting'

const noDefaultAltText = markdownlintGitHub.find((elem) =>
elem.names.includes('no-default-alt-text'),
Expand Down Expand Up @@ -88,6 +101,7 @@ export const gitHubDocsMarkdownlint = {
liquidTagWhitespace,
linkQuotation,
octiconAriaLabels,
outdatedReleasePhaseTerminology,
britishEnglishQuotes,
multipleEmphasisPatterns,
noteWarningFormatting,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
import { addError, ellipsify } from 'markdownlint-rule-helpers'

import { getRange } from '@/content-linter/lib/helpers/utils'
import frontmatter from '@/frame/lib/read-frontmatter'

// Mapping of outdated terms to their new replacements
// Order matters - longer phrases must come first to avoid partial matches
const TERMINOLOGY_REPLACEMENTS = [
// Beta variations → public preview (longer phrases first)
['limited public beta', 'public preview'],
['public beta', 'public preview'],
['private beta', 'private preview'],
['beta', 'public preview'],

// Alpha → private preview
['alpha', 'private preview'],

// Deprecated variations → closing down
['deprecation', 'closing down'],
['deprecated', 'closing down'],

// Sunset → retired
['sunset', 'retired'],
]

// Precompile RegExp objects for better performance
const COMPILED_REGEXES = TERMINOLOGY_REPLACEMENTS.map(([outdatedTerm, replacement]) => ({
regex: new RegExp(`(?<!\\w|-|_)${outdatedTerm.replace(/\s+/g, '\\s+')}(?!\\w|-|_)`, 'gi'),
outdatedTerm,
replacement,
}))

/**
* Find all non-overlapping matches of outdated terminology in a line
* @param {string} line - The line of text to search
* @returns {Array} Array of match objects with start, end, text, replacement, and outdatedTerm
*/
function findOutdatedTerminologyMatches(line) {
const foundMatches = []

// Check each outdated term (in order - longest first)
for (const { regex, outdatedTerm, replacement } of COMPILED_REGEXES) {
// Reset regex state for each line
regex.lastIndex = 0
let match

while ((match = regex.exec(line)) !== null) {
// Check if this match overlaps with any existing matches
const overlaps = foundMatches.some(
(existing) =>
(match.index >= existing.start && match.index < existing.end) ||
(match.index + match[0].length > existing.start &&
match.index + match[0].length <= existing.end) ||
(match.index <= existing.start && match.index + match[0].length >= existing.end),
)

if (!overlaps) {
foundMatches.push({
start: match.index,
end: match.index + match[0].length,
text: match[0],
replacement: replacement,
outdatedTerm: outdatedTerm,
})
}
}
}

// Sort matches by position for consistent ordering
return foundMatches.sort((a, b) => a.start - b.start)
}

export const outdatedReleasePhaseTerminology = {
names: ['GHD046', 'outdated-release-phase-terminology'],
description:
'Outdated release phase terminology should be replaced with current GitHub terminology',
tags: ['terminology', 'consistency', 'release-phases'],
severity: 'error',
function: (params, onError) => {
// Skip autogenerated files
const frontmatterString = params.frontMatterLines.join('\n')
const fm = frontmatter(frontmatterString).data
if (fm && fm.autogenerated) return

// Check all lines for outdated terminology
for (let i = 0; i < params.lines.length; i++) {
const line = params.lines[i]
const lineNumber = i + 1

// Find all matches on this line
const foundMatches = findOutdatedTerminologyMatches(line)

// Report all found matches
for (const matchInfo of foundMatches) {
const range = getRange(line, matchInfo.text)
const errorMessage = `Replace outdated terminology "${matchInfo.text}" with "${matchInfo.replacement}"`

// Provide a fix suggestion
const fixInfo = {
editColumn: matchInfo.start + 1,
deleteCount: matchInfo.text.length,
insertText: matchInfo.replacement,
}

addError(onError, lineNumber, errorMessage, ellipsify(line), range, fixInfo)
}
}
},
}
6 changes: 6 additions & 0 deletions src/content-linter/style/github-docs.js
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,12 @@ const githubDocsConfig = {
'partial-markdown-files': true,
'yml-files': true,
},
'outdated-release-phase-terminology': {
// GHD046
severity: 'warning',
'partial-markdown-files': true,
'yml-files': true,
},
'table-column-integrity': {
// GHD047
severity: 'warning',
Expand Down
Loading
Loading