ci: pin github action to specific hash (#1799)

This commit is contained in:
oreparaz
2025-03-26 21:02:14 +01:00
committed by GitHub
parent 2eb2462e5e
commit 49c5ec9b2b
13 changed files with 58 additions and 58 deletions

View File

@@ -40,7 +40,7 @@ jobs:
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # pin@v4
- name: Update version in Cargo.toml - name: Update version in Cargo.toml
if: ${{ inputs.version != '' }} if: ${{ inputs.version != '' }}
@@ -49,7 +49,7 @@ jobs:
rm -f Cargo.toml.bak rm -f Cargo.toml.bak
- name: Setup Rust - name: Setup Rust
uses: dtolnay/rust-toolchain@stable uses: dtolnay/rust-toolchain@38b70195107dddab2c7bbd522bcf763bac00963b # pin@stable
with: with:
toolchain: stable toolchain: stable
target: ${{ matrix.architecture }}-${{ matrix.target-suffix }} target: ${{ matrix.architecture }}-${{ matrix.target-suffix }}
@@ -81,7 +81,7 @@ jobs:
echo "ARTIFACT=target/${TARGET}/release/goose-${TARGET}.tar.bz2" >> $GITHUB_ENV echo "ARTIFACT=target/${TARGET}/release/goose-${TARGET}.tar.bz2" >> $GITHUB_ENV
- name: Upload CLI artifact - name: Upload CLI artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # pin@v4
with: with:
name: goose-${{ matrix.architecture }}-${{ matrix.target-suffix }} name: goose-${{ matrix.architecture }}-${{ matrix.target-suffix }}
path: ${{ env.ARTIFACT }} path: ${{ env.ARTIFACT }}

View File

@@ -76,7 +76,7 @@ jobs:
echo "All required signing secrets are present." echo "All required signing secrets are present."
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
# Update versions before build # Update versions before build
- name: Update versions - name: Update versions
@@ -91,7 +91,7 @@ jobs:
npm version ${{ inputs.version }} --no-git-tag-version --allow-same-version npm version ${{ inputs.version }} --no-git-tag-version --allow-same-version
- name: Setup Rust - name: Setup Rust
uses: dtolnay/rust-toolchain@stable uses: dtolnay/rust-toolchain@38b70195107dddab2c7bbd522bcf763bac00963b # pin@stable
with: with:
toolchain: stable toolchain: stable
targets: x86_64-apple-darwin targets: x86_64-apple-darwin
@@ -112,7 +112,7 @@ jobs:
df -h df -h
- name: Cache Cargo registry - name: Cache Cargo registry
uses: actions/cache@v3 uses: actions/cache@2f8e54208210a422b2efd51efaa6bd6d7ca8920f # pin@v3
with: with:
path: ~/.cargo/registry path: ~/.cargo/registry
key: ${{ runner.os }}-intel-cargo-registry-${{ hashFiles('**/Cargo.lock') }} key: ${{ runner.os }}-intel-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
@@ -120,7 +120,7 @@ jobs:
${{ runner.os }}-intel-cargo-registry- ${{ runner.os }}-intel-cargo-registry-
- name: Cache Cargo index - name: Cache Cargo index
uses: actions/cache@v3 uses: actions/cache@2f8e54208210a422b2efd51efaa6bd6d7ca8920f # pin@v3
with: with:
path: ~/.cargo/index path: ~/.cargo/index
key: ${{ runner.os }}-intel-cargo-index key: ${{ runner.os }}-intel-cargo-index
@@ -128,7 +128,7 @@ jobs:
${{ runner.os }}-intel-cargo-index ${{ runner.os }}-intel-cargo-index
- name: Cache Cargo build - name: Cache Cargo build
uses: actions/cache@v3 uses: actions/cache@2f8e54208210a422b2efd51efaa6bd6d7ca8920f # pin@v3
with: with:
path: target path: target
key: ${{ runner.os }}-intel-cargo-build-${{ hashFiles('**/Cargo.lock') }} key: ${{ runner.os }}-intel-cargo-build-${{ hashFiles('**/Cargo.lock') }}
@@ -165,7 +165,7 @@ jobs:
CERTIFICATE_PASSWORD: ${{ secrets.CERTIFICATE_PASSWORD }} CERTIFICATE_PASSWORD: ${{ secrets.CERTIFICATE_PASSWORD }}
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v2 uses: actions/setup-node@7c12f8017d5436eb855f1ed4399f037a36fbd9e8 # pin@v2
with: with:
node-version: 'lts/*' node-version: 'lts/*'
@@ -231,7 +231,7 @@ jobs:
df -h df -h
- name: Upload Desktop artifact - name: Upload Desktop artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # pin@v4
with: with:
name: Goose-darwin-x64 name: Goose-darwin-x64
path: ui/desktop/out/Goose-darwin-x64/Goose_intel_mac.zip path: ui/desktop/out/Goose-darwin-x64/Goose_intel_mac.zip

View File

@@ -26,11 +26,11 @@ jobs:
steps: steps:
# 1) Check out source # 1) Check out source
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v3 uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744
# 2) Set up Rust # 2) Set up Rust
- name: Set up Rust - name: Set up Rust
uses: dtolnay/rust-toolchain@stable uses: dtolnay/rust-toolchain@38b70195107dddab2c7bbd522bcf763bac00963b
# If you need a specific version, you could do: # If you need a specific version, you could do:
# or uses: actions/setup-rust@v1 # or uses: actions/setup-rust@v1
# with: # with:
@@ -38,13 +38,13 @@ jobs:
# 3) Set up Node.js # 3) Set up Node.js
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@1a4442cacd436585916779262731d5b162bc6ec7 # pin@v3
with: with:
node-version: 16 node-version: 16
# 4) Cache dependencies (optional, can add more paths if needed) # 4) Cache dependencies (optional, can add more paths if needed)
- name: Cache node_modules - name: Cache node_modules
uses: actions/cache@v3 uses: actions/cache@2f8e54208210a422b2efd51efaa6bd6d7ca8920f # pin@v3
with: with:
path: | path: |
node_modules node_modules
@@ -151,7 +151,7 @@ jobs:
# 11) Upload the final Windows build # 11) Upload the final Windows build
- name: Upload Windows build artifacts - name: Upload Windows build artifacts
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # pin@v4
with: with:
name: desktop-windows-dist name: desktop-windows-dist
path: ui/desktop/out/Goose-win32-x64/ path: ui/desktop/out/Goose-win32-x64/

View File

@@ -76,7 +76,7 @@ jobs:
echo "All required signing secrets are present." echo "All required signing secrets are present."
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
# Update versions before build # Update versions before build
- name: Update versions - name: Update versions
@@ -106,12 +106,12 @@ jobs:
df -h df -h
- name: Setup Rust - name: Setup Rust
uses: dtolnay/rust-toolchain@stable uses: dtolnay/rust-toolchain@38b70195107dddab2c7bbd522bcf763bac00963b # pin@stable
with: with:
toolchain: stable toolchain: stable
- name: Cache Cargo registry - name: Cache Cargo registry
uses: actions/cache@v3 uses: actions/cache@2f8e54208210a422b2efd51efaa6bd6d7ca8920f # pin@v3
with: with:
path: ~/.cargo/registry path: ~/.cargo/registry
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
@@ -119,7 +119,7 @@ jobs:
${{ runner.os }}-cargo-registry- ${{ runner.os }}-cargo-registry-
- name: Cache Cargo index - name: Cache Cargo index
uses: actions/cache@v3 uses: actions/cache@2f8e54208210a422b2efd51efaa6bd6d7ca8920f # pin@v3
with: with:
path: ~/.cargo/index path: ~/.cargo/index
key: ${{ runner.os }}-cargo-index key: ${{ runner.os }}-cargo-index
@@ -127,7 +127,7 @@ jobs:
${{ runner.os }}-cargo-index ${{ runner.os }}-cargo-index
- name: Cache Cargo build - name: Cache Cargo build
uses: actions/cache@v3 uses: actions/cache@2f8e54208210a422b2efd51efaa6bd6d7ca8920f # pin@v3
with: with:
path: target path: target
key: ${{ runner.os }}-cargo-build-${{ hashFiles('**/Cargo.lock') }} key: ${{ runner.os }}-cargo-build-${{ hashFiles('**/Cargo.lock') }}
@@ -163,7 +163,7 @@ jobs:
CERTIFICATE_PASSWORD: ${{ secrets.CERTIFICATE_PASSWORD }} CERTIFICATE_PASSWORD: ${{ secrets.CERTIFICATE_PASSWORD }}
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v2 uses: actions/setup-node@7c12f8017d5436eb855f1ed4399f037a36fbd9e8 # pin@v2
with: with:
node-version: 'lts/*' node-version: 'lts/*'
@@ -222,7 +222,7 @@ jobs:
df -h df -h
- name: Upload Desktop artifact - name: Upload Desktop artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # pin@v4
with: with:
name: Goose-darwin-arm64 name: Goose-darwin-arm64
path: ui/desktop/out/Goose-darwin-arm64/Goose.zip path: ui/desktop/out/Goose-darwin-arm64/Goose.zip

View File

@@ -26,7 +26,7 @@ jobs:
version: ${{ steps.set-version.outputs.version }} version: ${{ steps.set-version.outputs.version }}
steps: steps:
# checkout code so we can read the Cargo.toml # checkout code so we can read the Cargo.toml
- uses: actions/checkout@v4 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # pin@v4
- name: Generate a canary version - name: Generate a canary version
id: set-version id: set-version
run: | run: |
@@ -53,8 +53,8 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [build-cli] needs: [build-cli]
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # pin@v4
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # pin@v4
with: with:
name: download_cli.sh name: download_cli.sh
path: download_cli.sh path: download_cli.sh
@@ -87,13 +87,13 @@ jobs:
steps: steps:
- name: Download all artifacts - name: Download all artifacts
uses: actions/download-artifact@v4 uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # pin@v4
with: with:
merge-multiple: true merge-multiple: true
# Create/update the canary release # Create/update the canary release
- name: Release canary - name: Release canary
uses: ncipollo/release-action@v1 uses: ncipollo/release-action@440c8c1cb0ed28b9f43e4d1d670870f059653174 # pin@v1
with: with:
tag: canary tag: canary
name: Canary name: Canary

View File

@@ -19,10 +19,10 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout Code - name: Checkout Code
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # pin@v4
- name: Setup Rust - name: Setup Rust
uses: dtolnay/rust-toolchain@stable uses: dtolnay/rust-toolchain@38b70195107dddab2c7bbd522bcf763bac00963b # pin@stable
with: with:
toolchain: stable toolchain: stable
@@ -56,7 +56,7 @@ jobs:
df -h df -h
- name: Checkout Code - name: Checkout Code
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # pin@v4
- name: Install Dependencies - name: Install Dependencies
run: | run: |
@@ -64,12 +64,12 @@ jobs:
sudo apt install -y libdbus-1-dev gnome-keyring libxcb1-dev sudo apt install -y libdbus-1-dev gnome-keyring libxcb1-dev
- name: Setup Rust - name: Setup Rust
uses: dtolnay/rust-toolchain@stable uses: dtolnay/rust-toolchain@38b70195107dddab2c7bbd522bcf763bac00963b # pin@stable
with: with:
toolchain: stable toolchain: stable
- name: Cache Cargo Registry - name: Cache Cargo Registry
uses: actions/cache@v3 uses: actions/cache@2f8e54208210a422b2efd51efaa6bd6d7ca8920f # pin@v3
with: with:
path: ~/.cargo/registry path: ~/.cargo/registry
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
@@ -77,7 +77,7 @@ jobs:
${{ runner.os }}-cargo-registry- ${{ runner.os }}-cargo-registry-
- name: Cache Cargo Index - name: Cache Cargo Index
uses: actions/cache@v3 uses: actions/cache@2f8e54208210a422b2efd51efaa6bd6d7ca8920f # pin@v3
with: with:
path: ~/.cargo/index path: ~/.cargo/index
key: ${{ runner.os }}-cargo-index key: ${{ runner.os }}-cargo-index
@@ -85,7 +85,7 @@ jobs:
${{ runner.os }}-cargo-index ${{ runner.os }}-cargo-index
- name: Cache Cargo Build - name: Cache Cargo Build
uses: actions/cache@v3 uses: actions/cache@2f8e54208210a422b2efd51efaa6bd6d7ca8920f # pin@v3
with: with:
path: target path: target
key: ${{ runner.os }}-cargo-build-${{ hashFiles('**/Cargo.lock') }} key: ${{ runner.os }}-cargo-build-${{ hashFiles('**/Cargo.lock') }}
@@ -131,10 +131,10 @@ jobs:
runs-on: macos-latest runs-on: macos-latest
steps: steps:
- name: Checkout Code - name: Checkout Code
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # pin@v4
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v2 uses: actions/setup-node@7c12f8017d5436eb855f1ed4399f037a36fbd9e8 # pin@v2
with: with:
node-version: "lts/*" node-version: "lts/*"

View File

@@ -17,15 +17,15 @@ jobs:
steps: steps:
- name: Checkout the branch - name: Checkout the branch
uses: actions/checkout@v3 uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # pin@v3
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@1a4442cacd436585916779262731d5b162bc6ec7 # pin@v3
with: with:
node-version: 20 node-version: 20
- name: Cache Node.js modules (documentation) - name: Cache Node.js modules (documentation)
uses: actions/cache@v3 uses: actions/cache@2f8e54208210a422b2efd51efaa6bd6d7ca8920f # pin@v3
with: with:
path: ./documentation/node_modules path: ./documentation/node_modules
key: ${{ runner.os }}-documentation-${{ hashFiles('./documentation/package-lock.json') }} key: ${{ runner.os }}-documentation-${{ hashFiles('./documentation/package-lock.json') }}
@@ -44,7 +44,7 @@ jobs:
- name: Deploy to /gh-pages - name: Deploy to /gh-pages
if: github.event_name == 'push' && github.ref == 'refs/heads/main' if: github.event_name == 'push' && github.ref == 'refs/heads/main'
uses: peaceiris/actions-gh-pages@v3 uses: peaceiris/actions-gh-pages@373f7f263a76c20808c831209c920827a82a2847 # pin@v3
with: with:
github_token: ${{ secrets.GITHUB_TOKEN }} github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: documentation/build publish_dir: documentation/build

View File

@@ -32,7 +32,7 @@ jobs:
pr_number: ${{ steps.command.outputs.issue_number || github.event.inputs.pr_number }} pr_number: ${{ steps.command.outputs.issue_number || github.event.inputs.pr_number }}
steps: steps:
- if: ${{ github.event_name == 'issue_comment' }} - if: ${{ github.event_name == 'issue_comment' }}
uses: github/command@v1.3.0 uses: github/command@319d5236cc34ed2cb72a47c058a363db0b628ebe # pin@v1.3.0
id: command id: command
with: with:
command: ".bundle-intel" command: ".bundle-intel"
@@ -63,13 +63,13 @@ jobs:
steps: steps:
- name: Download Intel artifact - name: Download Intel artifact
uses: actions/download-artifact@v4 uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # pin@v4
with: with:
name: Goose-darwin-x64 name: Goose-darwin-x64
path: intel-dist path: intel-dist
- name: Comment on PR with Intel download link - name: Comment on PR with Intel download link
uses: peter-evans/create-or-update-comment@v4 uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # pin@v4
with: with:
issue-number: ${{ needs.trigger-on-command.outputs.pr_number }} issue-number: ${{ needs.trigger-on-command.outputs.pr_number }}
body: | body: |

View File

@@ -32,7 +32,7 @@ jobs:
pr_number: ${{ steps.command.outputs.issue_number || github.event.inputs.pr_number }} pr_number: ${{ steps.command.outputs.issue_number || github.event.inputs.pr_number }}
steps: steps:
- if: ${{ github.event_name == 'issue_comment' }} - if: ${{ github.event_name == 'issue_comment' }}
uses: github/command@v1.3.0 uses: github/command@319d5236cc34ed2cb72a47c058a363db0b628ebe # pin@v1.3.0
id: command id: command
with: with:
command: ".bundle-windows" command: ".bundle-windows"
@@ -60,13 +60,13 @@ jobs:
steps: steps:
- name: Download Windows artifact - name: Download Windows artifact
uses: actions/download-artifact@v4 uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # pin@v4
with: with:
name: desktop-windows-dist name: desktop-windows-dist
path: windows-dist path: windows-dist
- name: Comment on PR with Windows download link - name: Comment on PR with Windows download link
uses: peter-evans/create-or-update-comment@v4 uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # pin@v4
with: with:
issue-number: ${{ needs.trigger-on-command.outputs.pr_number }} issue-number: ${{ needs.trigger-on-command.outputs.pr_number }}
body: | body: |

View File

@@ -32,7 +32,7 @@ jobs:
pr_number: ${{ steps.command.outputs.issue_number || github.event.inputs.pr_number }} pr_number: ${{ steps.command.outputs.issue_number || github.event.inputs.pr_number }}
steps: steps:
- if: ${{ github.event_name == 'issue_comment' }} - if: ${{ github.event_name == 'issue_comment' }}
uses: github/command@v1.3.0 uses: github/command@319d5236cc34ed2cb72a47c058a363db0b628ebe # pin@v1.3.0
id: command id: command
with: with:
command: ".bundle" command: ".bundle"
@@ -63,13 +63,13 @@ jobs:
steps: steps:
- name: Download ARM64 artifact - name: Download ARM64 artifact
uses: actions/download-artifact@v4 uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # pin@v4
with: with:
name: Goose-darwin-arm64 name: Goose-darwin-arm64
path: arm64-dist path: arm64-dist
- name: Comment on PR with ARM64 download link - name: Comment on PR with ARM64 download link
uses: peter-evans/create-or-update-comment@v4 uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # pin@v4
with: with:
issue-number: ${{ needs.trigger-on-command.outputs.pr_number }} issue-number: ${{ needs.trigger-on-command.outputs.pr_number }}
body: | body: |

View File

@@ -17,11 +17,11 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout the branch - name: Checkout the branch
uses: actions/checkout@v3 uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # pin@v3
- name: Setup Node.js - name: Setup Node.js
if: github.event.action != 'closed' if: github.event.action != 'closed'
uses: actions/setup-node@v3 uses: actions/setup-node@1a4442cacd436585916779262731d5b162bc6ec7 # pin@v3
with: with:
node-version: 20 node-version: 20
@@ -38,7 +38,7 @@ jobs:
npm run build npm run build
- name: Deploy preview - name: Deploy preview
uses: rossjrw/pr-preview-action@v1 uses: rossjrw/pr-preview-action@df22037db54ab6ee34d3c1e2b8810ac040a530c6 # pin@v1
if: ${{ github.event.pull_request.head.repo.full_name == 'block/goose' }} if: ${{ github.event.pull_request.head.repo.full_name == 'block/goose' }}
with: with:
source-dir: documentation/build source-dir: documentation/build

View File

@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout Code - name: Checkout Code
uses: actions/checkout@v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # pin@v4
- name: Check PR Author - name: Check PR Author
run: | run: |
# Get PR author # Get PR author

View File

@@ -26,8 +26,8 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [build-cli] needs: [build-cli]
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # pin@v4
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # pin@v4
with: with:
name: download_cli.sh name: download_cli.sh
path: download_cli.sh path: download_cli.sh
@@ -84,13 +84,13 @@ jobs:
contents: write contents: write
steps: steps:
- name: Download all artifacts - name: Download all artifacts
uses: actions/download-artifact@v4 uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # pin@v4
with: with:
merge-multiple: true merge-multiple: true
# Create/update the versioned release # Create/update the versioned release
- name: Release versioned - name: Release versioned
uses: ncipollo/release-action@v1 uses: ncipollo/release-action@440c8c1cb0ed28b9f43e4d1d670870f059653174 # pin@v1
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
artifacts: | artifacts: |
@@ -103,7 +103,7 @@ jobs:
# Create/update the stable release # Create/update the stable release
- name: Release stable - name: Release stable
uses: ncipollo/release-action@v1 uses: ncipollo/release-action@440c8c1cb0ed28b9f43e4d1d670870f059653174 # pin@v1
with: with:
tag: stable tag: stable
name: Stable name: Stable