| name | github-actions-2025 |
| description | GitHub Actions 2025 features including 1 vCPU runners, immutable releases, and Node24 migration |
GitHub Actions 2025 Features
1 vCPU Linux Runners (October 2025 - Public Preview)
What: New lightweight runners optimized for automation tasks with lower cost.
Specs:
- 1 vCPU
- 5 GB RAM
- 15-minute job limit
- Optimized for short-running tasks
When to Use 1 vCPU Runners
Ideal for:
- Issue triage automation
- Label management
- PR comment automation
- Status checks
- Lightweight scripts
- Git operations (checkout, tag, commit)
- Notification tasks
NOT suitable for:
- Build operations
- Test suites
- Complex CI/CD pipelines
- Resource-intensive operations
Usage
name: Lightweight Automation
on:
issues:
types: [opened, labeled]
jobs:
triage:
runs-on: ubuntu-latest-1-core
timeout-minutes: 10
steps:
- name: Triage Issue
run: |
echo "Triaging issue..."
gh issue edit ${{ github.event.issue.number }} --add-label "needs-review"
Cost Savings Example
jobs:
label:
runs-on: ubuntu-latest
steps:
- name: Add label
run: gh pr edit ${{ github.event.number }} --add-label "reviewed"
jobs:
label:
runs-on: ubuntu-latest-1-core
timeout-minutes: 5
steps:
- name: Add label
run: gh pr edit ${{ github.event.number }} --add-label "reviewed"
Immutable Releases (August 2025)
What: Releases can now be marked immutable - assets and Git tags cannot be changed or deleted once released.
Benefits:
- Supply chain security
- Audit compliance
- Prevent tampering
- Trust in release artifacts
Create Immutable Release
gh release create v1.0.0 \
dist/*.zip \
--title "Version 1.0.0" \
--notes-file CHANGELOG.md \
--immutable
gh release view v1.0.0 --json isImmutable
GitHub Actions Workflow
name: Create Immutable Release
on:
push:
tags:
- 'v*'
jobs:
release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build artifacts
run: npm run build
- name: Create Immutable Release
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const tag = context.ref.replace('refs/tags/', '');
await github.rest.repos.createRelease({
owner: context.repo.owner,
repo: context.repo.repo,
tag_name: tag,
name: `Release ${tag}`,
body:
Immutable Release Policy
name: Enforce Immutable Releases
on:
release:
types: [created]
jobs:
enforce-immutability:
runs-on: ubuntu-latest
if: "!github.event.release.immutable && startsWith(github.event.release.tag_name, 'v')"
steps:
- name: Fail if not immutable
run: |
echo "ERROR: Production releases must be immutable"
exit 1
Node24 Migration (September 2025)
What: GitHub Actions migrating from Node20 to Node24 in fall 2025.
Timeline:
- September 2025: Node24 support added
- October 2025: Deprecation notices for Node20
- November 2025: Node20 phase-out begins
- December 2025: Full migration to Node24
Update Your Actions
Check Node version in actions:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/setup-node@v3
with:
node-version: '20'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/setup-node@v4
with:
node-version: '24'
Runner Version Compatibility
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Verify Node version
run: node --version
Custom Actions Migration
If you maintain custom actions:
runs:
using: 'node24'
main: 'index.js'
npm install @actions/core@latest
npm install @actions/github@latest
node --version
npm test
Actions Environment Variables (May 2025)
What: Actions environments now available for all plans (public and private repos).
Environment Protection Rules
name: Deploy to Production
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
environment:
name: production
url: https://app.example.com
steps:
- name: Deploy
run: |
echo "Deploying to ${{ vars.DEPLOY_URL }}"
# Deployment steps...
Environment configuration:
- Settings → Environments → production
- Add protection rules:
- Required reviewers
- Wait timer
- Deployment branches (only main)
Allowed Actions Policy Updates (August 2025)
What: Enhanced governance with explicit blocking and SHA pinning.
Block Specific Actions
allowed-actions:
verified-only: true
blocked-actions:
- 'untrusted/action@*'
- 'deprecated-org/*'
require-sha-pinning: true
SHA Pinning for Security
- uses: actions/checkout@v4
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
Generate SHA-Pinned Actions
gh api repos/actions/checkout/commits/v4.1.1 --jq '.sha'
npx pin-github-action actions/checkout@v4
Copilot-Triggered Workflows (April 2025)
What: Workflows triggered by Copilot-authored events now require explicit approval.
Configure Copilot Workflow Approval
name: Copilot PR Automation
on:
pull_request:
types: [opened]
jobs:
copilot-review:
runs-on: ubuntu-latest
if: github.event.pull_request.user.login != 'github-copilot[bot]'
steps:
- name: Auto-review
run: gh pr review --approve
Manual approval required for Copilot PRs (same mechanism as fork PRs).
Artifact Storage Architecture (February 2025)
What: Artifacts moved to new architecture on February 1, 2025.
Breaking changes:
actions/upload-artifact@v1-v2 retired March 1, 2025
- Must use
actions/upload-artifact@v4+
Migration
- uses: actions/upload-artifact@v2
with:
name: build-artifacts
path: dist/
- uses: actions/upload-artifact@v4
with:
name: build-artifacts
path: dist/
retention-days: 30
Windows Server 2019 Retirement (June 2025)
What: windows-2019 runner image fully retired June 30, 2025.
Migration
jobs:
build:
runs-on: windows-2019
jobs:
build:
runs-on: windows-2022
Meta API for Self-Hosted Runners (May 2025)
What: New actions_inbound section in meta API for network configuration.
curl https://api.github.com/meta | jq '.actions_inbound'
{
"domains": [
"*.actions.githubusercontent.com",
"*.pkg.github.com"
],
"ip_ranges": [
"140.82.112.0/20",
"143.55.64.0/20"
]
}
Best Practices for 2025
1. Use Appropriate Runners
jobs:
label-management:
runs-on: ubuntu-latest-1-core
timeout-minutes: 5
build:
runs-on: ubuntu-latest
2. Immutable Releases for Production
- name: Create Release
run: gh release create $TAG --immutable
3. SHA Pinning for Security
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
- uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8
4. Update to Node24
- uses: actions/setup-node@v4
with:
node-version: '24'
5. Environment Protection
jobs:
deploy:
environment: production
Troubleshooting
1 vCPU runner timeout:
jobs:
task:
runs-on: ubuntu-latest-1-core
timeout-minutes: 10
Node24 compatibility issues:
nvm install 24
nvm use 24
npm test
Artifact upload failures:
- uses: actions/upload-artifact@v4
Resources