ci: Build nightly more frequently (#53800)
This updates the nightly workflow to run hourly as opposed to once daily. Notably, it also - changes the poll duration for the auto updater - we now poll 4 times an hour on the Nightly channel and continue with the old rate for all other channels - moves the pre-checks to the linux runners, since we have more resources available there - only ever allow one concurrent nightly run Release Notes: - N/A
This commit is contained in:
1 parent
131fecce9d
commit
40668eee14
11 files changed
+200
-188
No files matched your search
@@ -122,10 +122,10 @@ jobs:
|
|||||||
git commit -am "Autofix"
|
git commit -am "Autofix"
|
||||||
git push
|
git push
|
||||||
env:
|
env:
|
||||||
GIT_COMMITTER_NAME: Zed Zippy
|
GIT_AUTHOR_NAME: zed-zippy[bot]
|
||||||
GIT_COMMITTER_EMAIL: 234243425+zed-zippy[bot]@users.noreply.github.com
|
|
||||||
GIT_AUTHOR_NAME: Zed Zippy
|
|
||||||
GIT_AUTHOR_EMAIL: 234243425+zed-zippy[bot]@users.noreply.github.com
|
GIT_AUTHOR_EMAIL: 234243425+zed-zippy[bot]@users.noreply.github.com
|
||||||
|
GIT_COMMITTER_NAME: zed-zippy[bot]
|
||||||
|
GIT_COMMITTER_EMAIL: 234243425+zed-zippy[bot]@users.noreply.github.com
|
||||||
GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }}
|
GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }}
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ inputs.pr_number }}
|
group: ${{ github.workflow }}-${{ inputs.pr_number }}
|
||||||
|
|||||||
@@ -45,9 +45,9 @@ jobs:
|
|||||||
COMMIT: ${{ inputs.commit }}
|
COMMIT: ${{ inputs.commit }}
|
||||||
CHANNEL: ${{ inputs.channel }}
|
CHANNEL: ${{ inputs.channel }}
|
||||||
GIT_AUTHOR_NAME: zed-zippy[bot]
|
GIT_AUTHOR_NAME: zed-zippy[bot]
|
||||||
GIT_AUTHOR_EMAIL: <234243425+zed-zippy[bot]@users.noreply.github.com>
|
GIT_AUTHOR_EMAIL: 234243425+zed-zippy[bot]@users.noreply.github.com
|
||||||
GIT_COMMITTER_NAME: zed-zippy[bot]
|
GIT_COMMITTER_NAME: zed-zippy[bot]
|
||||||
GIT_COMMITTER_EMAIL: <234243425+zed-zippy[bot]@users.noreply.github.com>
|
GIT_COMMITTER_EMAIL: 234243425+zed-zippy[bot]@users.noreply.github.com
|
||||||
GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }}
|
GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }}
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
|
|||||||
@@ -220,10 +220,6 @@ jobs:
|
|||||||
clean: false
|
clean: false
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
token: ${{ steps.generate-token.outputs.token }}
|
token: ${{ steps.generate-token.outputs.token }}
|
||||||
- name: extension_workflow_rollout::create_rollout_tag::configure_git
|
|
||||||
run: |
|
|
||||||
git config user.name "zed-zippy[bot]"
|
|
||||||
git config user.email "234243425+zed-zippy[bot]@users.noreply.github.com"
|
|
||||||
- name: extension_workflow_rollout::create_rollout_tag::update_rollout_tag
|
- name: extension_workflow_rollout::create_rollout_tag::update_rollout_tag
|
||||||
run: |
|
run: |
|
||||||
if git rev-parse "extension-workflows" >/dev/null 2>&1; then
|
if git rev-parse "extension-workflows" >/dev/null 2>&1; then
|
||||||
@@ -234,6 +230,11 @@ jobs:
|
|||||||
echo "Creating new tag 'extension-workflows' at $(git rev-parse --short HEAD)"
|
echo "Creating new tag 'extension-workflows' at $(git rev-parse --short HEAD)"
|
||||||
git tag "extension-workflows"
|
git tag "extension-workflows"
|
||||||
git push origin "extension-workflows"
|
git push origin "extension-workflows"
|
||||||
|
env:
|
||||||
|
GIT_AUTHOR_NAME: zed-zippy[bot]
|
||||||
|
GIT_AUTHOR_EMAIL: 234243425+zed-zippy[bot]@users.noreply.github.com
|
||||||
|
GIT_COMMITTER_NAME: zed-zippy[bot]
|
||||||
|
GIT_COMMITTER_EMAIL: 234243425+zed-zippy[bot]@users.noreply.github.com
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
|
|||||||
@@ -5,29 +5,40 @@ env:
|
|||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
RUST_BACKTRACE: '1'
|
RUST_BACKTRACE: '1'
|
||||||
on:
|
on:
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- nightly
|
|
||||||
schedule:
|
schedule:
|
||||||
- cron: 0 7 * * *
|
- cron: 0 */4 * * *
|
||||||
|
workflow_dispatch: {}
|
||||||
jobs:
|
jobs:
|
||||||
check_style:
|
check_nightly_tag:
|
||||||
if: (github.repository_owner == 'zed-industries' || github.repository_owner == 'zed-extensions')
|
if: (github.repository_owner == 'zed-industries' || github.repository_owner == 'zed-extensions')
|
||||||
runs-on: namespace-profile-mac-large
|
runs-on: namespace-profile-2x4-ubuntu-2404
|
||||||
steps:
|
steps:
|
||||||
- name: steps::checkout_repo
|
- name: steps::checkout_repo
|
||||||
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd
|
||||||
with:
|
with:
|
||||||
clean: false
|
clean: false
|
||||||
fetch-depth: 0
|
fetch-tags: true
|
||||||
- name: steps::cargo_fmt
|
- id: check
|
||||||
run: cargo fmt --all -- --check
|
name: release_nightly::check_nightly_tag
|
||||||
- name: ./script/clippy
|
run: |
|
||||||
run: ./script/clippy
|
NIGHTLY_SHA=$(git rev-parse "nightly" 2>/dev/null || echo "")
|
||||||
timeout-minutes: 60
|
if [ "$NIGHTLY_SHA" = "$GITHUB_SHA" ]; then
|
||||||
run_tests_windows:
|
echo "Nightly tag already points to current commit. Skipping."
|
||||||
if: (github.repository_owner == 'zed-industries' || github.repository_owner == 'zed-extensions')
|
echo "skip=true" >> "$GITHUB_OUTPUT"
|
||||||
runs-on: self-32vcpu-windows-2022
|
else
|
||||||
|
echo "skip=false" >> "$GITHUB_OUTPUT"
|
||||||
|
fi
|
||||||
|
outputs:
|
||||||
|
skip: ${{ steps.check.outputs.skip }}
|
||||||
|
timeout-minutes: 5
|
||||||
|
run_tests_linux:
|
||||||
|
needs:
|
||||||
|
- check_nightly_tag
|
||||||
|
if: (github.repository_owner == 'zed-industries' || github.repository_owner == 'zed-extensions') && needs.check_nightly_tag.outputs.skip != 'true'
|
||||||
|
runs-on: namespace-profile-16x32-ubuntu-2204
|
||||||
|
env:
|
||||||
|
CC: clang
|
||||||
|
CXX: clang++
|
||||||
steps:
|
steps:
|
||||||
- name: steps::checkout_repo
|
- name: steps::checkout_repo
|
||||||
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd
|
||||||
@@ -35,19 +46,27 @@ jobs:
|
|||||||
clean: false
|
clean: false
|
||||||
- name: steps::setup_cargo_config
|
- name: steps::setup_cargo_config
|
||||||
run: |
|
run: |
|
||||||
New-Item -ItemType Directory -Path "./../.cargo" -Force
|
mkdir -p ./../.cargo
|
||||||
Copy-Item -Path "./.cargo/ci-config.toml" -Destination "./../.cargo/config.toml"
|
cp ./.cargo/ci-config.toml ./../.cargo/config.toml
|
||||||
shell: pwsh
|
- name: steps::cache_rust_dependencies_namespace
|
||||||
|
uses: namespacelabs/nscloud-cache-action@a90bb5d4b27522ce881c6e98eebd7d7e6d1653f9
|
||||||
|
with:
|
||||||
|
cache: rust
|
||||||
|
path: ~/.rustup
|
||||||
|
- name: steps::setup_linux
|
||||||
|
run: ./script/linux
|
||||||
|
- name: steps::download_wasi_sdk
|
||||||
|
run: ./script/download-wasi-sdk
|
||||||
- name: steps::setup_node
|
- name: steps::setup_node
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
|
||||||
with:
|
with:
|
||||||
node-version: '20'
|
node-version: '20'
|
||||||
|
- name: steps::cargo_install_nextest
|
||||||
|
uses: taiki-e/install-action@921e2c9f7148d7ba14cd819f417db338f63e733c
|
||||||
- name: steps::clear_target_dir_if_large
|
- name: steps::clear_target_dir_if_large
|
||||||
run: ./script/clear-target-dir-if-larger-than.ps1 350 200
|
run: ./script/clear-target-dir-if-larger-than 350 200
|
||||||
shell: pwsh
|
|
||||||
- name: steps::setup_sccache
|
- name: steps::setup_sccache
|
||||||
run: ./script/setup-sccache.ps1
|
run: ./script/setup-sccache
|
||||||
shell: pwsh
|
|
||||||
env:
|
env:
|
||||||
R2_ACCOUNT_ID: ${{ secrets.R2_ACCOUNT_ID }}
|
R2_ACCOUNT_ID: ${{ secrets.R2_ACCOUNT_ID }}
|
||||||
R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
|
R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
|
||||||
@@ -55,49 +74,24 @@ jobs:
|
|||||||
SCCACHE_BUCKET: sccache-zed
|
SCCACHE_BUCKET: sccache-zed
|
||||||
- name: steps::cargo_nextest
|
- name: steps::cargo_nextest
|
||||||
run: cargo nextest run --workspace --no-fail-fast --no-tests=warn
|
run: cargo nextest run --workspace --no-fail-fast --no-tests=warn
|
||||||
shell: pwsh
|
|
||||||
- name: steps::show_sccache_stats
|
- name: steps::show_sccache_stats
|
||||||
run: if ($env:RUSTC_WRAPPER) { & $env:RUSTC_WRAPPER --show-stats }; exit 0
|
run: sccache --show-stats || true
|
||||||
shell: pwsh
|
|
||||||
- name: steps::cleanup_cargo_config
|
- name: steps::cleanup_cargo_config
|
||||||
if: always()
|
if: always()
|
||||||
run: |
|
run: |
|
||||||
Remove-Item -Recurse -Path "./../.cargo" -Force -ErrorAction SilentlyContinue
|
rm -rf ./../.cargo
|
||||||
shell: pwsh
|
|
||||||
timeout-minutes: 60
|
|
||||||
clippy_windows:
|
|
||||||
if: (github.repository_owner == 'zed-industries' || github.repository_owner == 'zed-extensions')
|
|
||||||
runs-on: self-32vcpu-windows-2022
|
|
||||||
steps:
|
|
||||||
- name: steps::checkout_repo
|
|
||||||
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd
|
|
||||||
with:
|
|
||||||
clean: false
|
|
||||||
- name: steps::setup_cargo_config
|
|
||||||
run: |
|
|
||||||
New-Item -ItemType Directory -Path "./../.cargo" -Force
|
|
||||||
Copy-Item -Path "./.cargo/ci-config.toml" -Destination "./../.cargo/config.toml"
|
|
||||||
shell: pwsh
|
|
||||||
- name: steps::setup_sccache
|
|
||||||
run: ./script/setup-sccache.ps1
|
|
||||||
shell: pwsh
|
|
||||||
env:
|
|
||||||
R2_ACCOUNT_ID: ${{ secrets.R2_ACCOUNT_ID }}
|
|
||||||
R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
|
|
||||||
R2_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}
|
|
||||||
SCCACHE_BUCKET: sccache-zed
|
|
||||||
- name: steps::clippy
|
|
||||||
run: ./script/clippy.ps1
|
|
||||||
shell: pwsh
|
|
||||||
- name: steps::show_sccache_stats
|
|
||||||
run: if ($env:RUSTC_WRAPPER) { & $env:RUSTC_WRAPPER --show-stats }; exit 0
|
|
||||||
shell: pwsh
|
|
||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
|
services:
|
||||||
|
postgres:
|
||||||
|
image: postgres:15
|
||||||
|
env:
|
||||||
|
POSTGRES_HOST_AUTH_METHOD: trust
|
||||||
|
ports:
|
||||||
|
- 5432:5432
|
||||||
|
options: --health-cmd pg_isready --health-interval 500ms --health-timeout 5s --health-retries 10
|
||||||
bundle_linux_aarch64:
|
bundle_linux_aarch64:
|
||||||
needs:
|
needs:
|
||||||
- check_style
|
- run_tests_linux
|
||||||
- run_tests_windows
|
|
||||||
- clippy_windows
|
|
||||||
runs-on: namespace-profile-8x32-ubuntu-2004-arm-m4
|
runs-on: namespace-profile-8x32-ubuntu-2004-arm-m4
|
||||||
env:
|
env:
|
||||||
CARGO_INCREMENTAL: 0
|
CARGO_INCREMENTAL: 0
|
||||||
@@ -141,9 +135,7 @@ jobs:
|
|||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
bundle_linux_x86_64:
|
bundle_linux_x86_64:
|
||||||
needs:
|
needs:
|
||||||
- check_style
|
- run_tests_linux
|
||||||
- run_tests_windows
|
|
||||||
- clippy_windows
|
|
||||||
runs-on: namespace-profile-32x64-ubuntu-2004
|
runs-on: namespace-profile-32x64-ubuntu-2004
|
||||||
env:
|
env:
|
||||||
CARGO_INCREMENTAL: 0
|
CARGO_INCREMENTAL: 0
|
||||||
@@ -187,9 +179,7 @@ jobs:
|
|||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
bundle_mac_aarch64:
|
bundle_mac_aarch64:
|
||||||
needs:
|
needs:
|
||||||
- check_style
|
- run_tests_linux
|
||||||
- run_tests_windows
|
|
||||||
- clippy_windows
|
|
||||||
runs-on: namespace-profile-mac-large
|
runs-on: namespace-profile-mac-large
|
||||||
env:
|
env:
|
||||||
CARGO_INCREMENTAL: 0
|
CARGO_INCREMENTAL: 0
|
||||||
@@ -238,9 +228,7 @@ jobs:
|
|||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
bundle_mac_x86_64:
|
bundle_mac_x86_64:
|
||||||
needs:
|
needs:
|
||||||
- check_style
|
- run_tests_linux
|
||||||
- run_tests_windows
|
|
||||||
- clippy_windows
|
|
||||||
runs-on: namespace-profile-mac-large
|
runs-on: namespace-profile-mac-large
|
||||||
env:
|
env:
|
||||||
CARGO_INCREMENTAL: 0
|
CARGO_INCREMENTAL: 0
|
||||||
@@ -289,9 +277,7 @@ jobs:
|
|||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
bundle_windows_aarch64:
|
bundle_windows_aarch64:
|
||||||
needs:
|
needs:
|
||||||
- check_style
|
- run_tests_linux
|
||||||
- run_tests_windows
|
|
||||||
- clippy_windows
|
|
||||||
runs-on: self-32vcpu-windows-2022
|
runs-on: self-32vcpu-windows-2022
|
||||||
env:
|
env:
|
||||||
CARGO_INCREMENTAL: 0
|
CARGO_INCREMENTAL: 0
|
||||||
@@ -342,9 +328,7 @@ jobs:
|
|||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
bundle_windows_x86_64:
|
bundle_windows_x86_64:
|
||||||
needs:
|
needs:
|
||||||
- check_style
|
- run_tests_linux
|
||||||
- run_tests_windows
|
|
||||||
- clippy_windows
|
|
||||||
runs-on: self-32vcpu-windows-2022
|
runs-on: self-32vcpu-windows-2022
|
||||||
env:
|
env:
|
||||||
CARGO_INCREMENTAL: 0
|
CARGO_INCREMENTAL: 0
|
||||||
@@ -395,8 +379,7 @@ jobs:
|
|||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
build_nix_linux_x86_64:
|
build_nix_linux_x86_64:
|
||||||
needs:
|
needs:
|
||||||
- check_style
|
- run_tests_linux
|
||||||
- run_tests_windows
|
|
||||||
if: (github.repository_owner == 'zed-industries' || github.repository_owner == 'zed-extensions')
|
if: (github.repository_owner == 'zed-industries' || github.repository_owner == 'zed-extensions')
|
||||||
runs-on: namespace-profile-32x64-ubuntu-2004
|
runs-on: namespace-profile-32x64-ubuntu-2004
|
||||||
env:
|
env:
|
||||||
@@ -429,8 +412,7 @@ jobs:
|
|||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
build_nix_mac_aarch64:
|
build_nix_mac_aarch64:
|
||||||
needs:
|
needs:
|
||||||
- check_style
|
- run_tests_linux
|
||||||
- run_tests_windows
|
|
||||||
if: (github.repository_owner == 'zed-industries' || github.repository_owner == 'zed-extensions')
|
if: (github.repository_owner == 'zed-industries' || github.repository_owner == 'zed-extensions')
|
||||||
runs-on: namespace-profile-mac-large
|
runs-on: namespace-profile-mac-large
|
||||||
env:
|
env:
|
||||||
@@ -487,11 +469,18 @@ jobs:
|
|||||||
if: (github.repository_owner == 'zed-industries' || github.repository_owner == 'zed-extensions')
|
if: (github.repository_owner == 'zed-industries' || github.repository_owner == 'zed-extensions')
|
||||||
runs-on: namespace-profile-4x8-ubuntu-2204
|
runs-on: namespace-profile-4x8-ubuntu-2204
|
||||||
steps:
|
steps:
|
||||||
|
- id: generate-token
|
||||||
|
name: steps::authenticate_as_zippy
|
||||||
|
uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859
|
||||||
|
with:
|
||||||
|
app-id: ${{ secrets.ZED_ZIPPY_APP_ID }}
|
||||||
|
private-key: ${{ secrets.ZED_ZIPPY_APP_PRIVATE_KEY }}
|
||||||
|
permission-contents: write
|
||||||
- name: steps::checkout_repo
|
- name: steps::checkout_repo
|
||||||
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd
|
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd
|
||||||
with:
|
with:
|
||||||
clean: false
|
clean: false
|
||||||
fetch-depth: 0
|
fetch-tags: true
|
||||||
- name: release::download_workflow_artifacts
|
- name: release::download_workflow_artifacts
|
||||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
|
||||||
with:
|
with:
|
||||||
@@ -519,16 +508,18 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
DIGITALOCEAN_SPACES_ACCESS_KEY: ${{ secrets.DIGITALOCEAN_SPACES_ACCESS_KEY }}
|
DIGITALOCEAN_SPACES_ACCESS_KEY: ${{ secrets.DIGITALOCEAN_SPACES_ACCESS_KEY }}
|
||||||
DIGITALOCEAN_SPACES_SECRET_KEY: ${{ secrets.DIGITALOCEAN_SPACES_SECRET_KEY }}
|
DIGITALOCEAN_SPACES_SECRET_KEY: ${{ secrets.DIGITALOCEAN_SPACES_SECRET_KEY }}
|
||||||
- name: release_nightly::update_nightly_tag_job::update_nightly_tag
|
- name: steps::update_tag
|
||||||
run: |
|
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b
|
||||||
if [ "$(git rev-parse nightly)" = "$(git rev-parse HEAD)" ]; then
|
with:
|
||||||
echo "Nightly tag already points to current commit. Skipping tagging."
|
script: |
|
||||||
exit 0
|
github.rest.git.updateRef({
|
||||||
fi
|
owner: context.repo.owner,
|
||||||
git config user.name github-actions
|
repo: context.repo.repo,
|
||||||
git config user.email github-actions@github.com
|
ref: 'tags/nightly',
|
||||||
git tag -f nightly
|
sha: context.sha,
|
||||||
git push origin nightly --force
|
force: true
|
||||||
|
})
|
||||||
|
github-token: ${{ steps.generate-token.outputs.token }}
|
||||||
- name: release::create_sentry_release
|
- name: release::create_sentry_release
|
||||||
uses: getsentry/action-release@526942b68292201ac6bbb99b9a0747d4abee354c
|
uses: getsentry/action-release@526942b68292201ac6bbb99b9a0747d4abee354c
|
||||||
with:
|
with:
|
||||||
@@ -554,6 +545,9 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_WORKFLOW_FAILURES }}
|
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_WORKFLOW_FAILURES }}
|
||||||
SLACK_MESSAGE: '❌ ${{ github.workflow }} failed: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}'
|
SLACK_MESSAGE: '❌ ${{ github.workflow }} failed: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}'
|
||||||
|
concurrency:
|
||||||
|
group: release-nightly
|
||||||
|
cancel-in-progress: true
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
shell: bash -euxo pipefail {0}
|
shell: bash -euxo pipefail {0}
|
||||||
@@ -42,6 +42,7 @@ impl std::fmt::Display for MissingDependencyError {
|
|||||||
|
|
||||||
impl std::error::Error for MissingDependencyError {}
|
impl std::error::Error for MissingDependencyError {}
|
||||||
const POLL_INTERVAL: Duration = Duration::from_secs(60 * 60);
|
const POLL_INTERVAL: Duration = Duration::from_secs(60 * 60);
|
||||||
|
const NIGHTLY_POLL_INTERVAL: Duration = Duration::from_secs(15 * 60);
|
||||||
const REMOTE_SERVER_CACHE_LIMIT: usize = 5;
|
const REMOTE_SERVER_CACHE_LIMIT: usize = 5;
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
@@ -419,6 +420,12 @@ impl AutoUpdater {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn start_polling(&self, cx: &mut Context<Self>) -> Task<Result<()>> {
|
pub fn start_polling(&self, cx: &mut Context<Self>) -> Task<Result<()>> {
|
||||||
|
let poll_interval =
|
||||||
|
ReleaseChannel::try_global(cx).map_or(POLL_INTERVAL, |channel| match channel {
|
||||||
|
ReleaseChannel::Nightly => NIGHTLY_POLL_INTERVAL,
|
||||||
|
_ => POLL_INTERVAL,
|
||||||
|
});
|
||||||
|
|
||||||
cx.spawn(async move |this, cx| {
|
cx.spawn(async move |this, cx| {
|
||||||
if cfg!(target_os = "windows") {
|
if cfg!(target_os = "windows") {
|
||||||
use util::ResultExt;
|
use util::ResultExt;
|
||||||
@@ -431,7 +438,7 @@ impl AutoUpdater {
|
|||||||
|
|
||||||
loop {
|
loop {
|
||||||
this.update(cx, |this, cx| this.poll(UpdateCheckType::Automatic, cx))?;
|
this.update(cx, |this, cx| this.poll(UpdateCheckType::Automatic, cx))?;
|
||||||
cx.background_executor().timer(POLL_INTERVAL).await;
|
cx.background_executor().timer(poll_interval).await;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-3
@@ -2,6 +2,4 @@
|
|||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
git fetch origin main:tags/nightly -f
|
gh workflow run release_nightly.yml
|
||||||
git log --oneline -1 nightly
|
|
||||||
git push -f origin nightly
|
|
||||||
@@ -4,7 +4,7 @@ use crate::tasks::workflows::{
|
|||||||
runners,
|
runners,
|
||||||
steps::{
|
steps::{
|
||||||
self, DownloadArtifactStep, FluentBuilder, IfNoFilesFound, NamedJob, RepositoryTarget,
|
self, DownloadArtifactStep, FluentBuilder, IfNoFilesFound, NamedJob, RepositoryTarget,
|
||||||
TokenPermissions, UploadArtifactStep, named, use_clang,
|
TokenPermissions, UploadArtifactStep, ZippyGitIdentity, named, use_clang,
|
||||||
},
|
},
|
||||||
vars::{self, StepOutput, WorkflowInput},
|
vars::{self, StepOutput, WorkflowInput},
|
||||||
};
|
};
|
||||||
@@ -129,16 +129,7 @@ fn commit_changes(pr_number: &WorkflowInput, autofix_job: &NamedJob) -> NamedJob
|
|||||||
git commit -am "Autofix"
|
git commit -am "Autofix"
|
||||||
git push
|
git push
|
||||||
"#})
|
"#})
|
||||||
.add_env(("GIT_COMMITTER_NAME", "Zed Zippy"))
|
.with_zippy_git_identity()
|
||||||
.add_env((
|
|
||||||
"GIT_COMMITTER_EMAIL",
|
|
||||||
"234243425+zed-zippy[bot]@users.noreply.github.com",
|
|
||||||
))
|
|
||||||
.add_env(("GIT_AUTHOR_NAME", "Zed Zippy"))
|
|
||||||
.add_env((
|
|
||||||
"GIT_AUTHOR_EMAIL",
|
|
||||||
"234243425+zed-zippy[bot]@users.noreply.github.com",
|
|
||||||
))
|
|
||||||
.add_env(("GITHUB_TOKEN", token))
|
.add_env(("GITHUB_TOKEN", token))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ use gh_workflow::*;
|
|||||||
|
|
||||||
use crate::tasks::workflows::{
|
use crate::tasks::workflows::{
|
||||||
runners,
|
runners,
|
||||||
steps::{self, NamedJob, RepositoryTarget, TokenPermissions, named},
|
steps::{self, NamedJob, RepositoryTarget, TokenPermissions, ZippyGitIdentity, named},
|
||||||
vars::{StepOutput, WorkflowInput},
|
vars::{StepOutput, WorkflowInput},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -39,16 +39,7 @@ fn run_cherry_pick(
|
|||||||
.add_env(("BRANCH", branch.to_string()))
|
.add_env(("BRANCH", branch.to_string()))
|
||||||
.add_env(("COMMIT", commit.to_string()))
|
.add_env(("COMMIT", commit.to_string()))
|
||||||
.add_env(("CHANNEL", channel.to_string()))
|
.add_env(("CHANNEL", channel.to_string()))
|
||||||
.add_env(("GIT_AUTHOR_NAME", "zed-zippy[bot]"))
|
.with_zippy_git_identity()
|
||||||
.add_env((
|
|
||||||
"GIT_AUTHOR_EMAIL",
|
|
||||||
"<234243425+zed-zippy[bot]@users.noreply.github.com>",
|
|
||||||
))
|
|
||||||
.add_env(("GIT_COMMITTER_NAME", "zed-zippy[bot]"))
|
|
||||||
.add_env((
|
|
||||||
"GIT_COMMITTER_EMAIL",
|
|
||||||
"<234243425+zed-zippy[bot]@users.noreply.github.com>",
|
|
||||||
))
|
|
||||||
.add_env(("GITHUB_TOKEN", token))
|
.add_env(("GITHUB_TOKEN", token))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,8 @@ use crate::tasks::workflows::vars::JobOutput;
|
|||||||
use crate::tasks::workflows::{
|
use crate::tasks::workflows::{
|
||||||
runners,
|
runners,
|
||||||
steps::{
|
steps::{
|
||||||
self, DEFAULT_REPOSITORY_OWNER_GUARD, NamedJob, RepositoryTarget, generate_token, named,
|
self, DEFAULT_REPOSITORY_OWNER_GUARD, NamedJob, RepositoryTarget, ZippyGitIdentity,
|
||||||
|
generate_token, named,
|
||||||
},
|
},
|
||||||
vars::{self, StepOutput, WorkflowInput},
|
vars::{self, StepOutput, WorkflowInput},
|
||||||
};
|
};
|
||||||
@@ -348,13 +349,6 @@ fn create_rollout_tag(rollout_job: &NamedJob, filter_repos_input: &WorkflowInput
|
|||||||
"#})
|
"#})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn configure_git() -> Step<Run> {
|
|
||||||
named::bash(indoc! {r#"
|
|
||||||
git config user.name "zed-zippy[bot]"
|
|
||||||
git config user.email "234243425+zed-zippy[bot]@users.noreply.github.com"
|
|
||||||
"#})
|
|
||||||
}
|
|
||||||
|
|
||||||
let (authenticate, token) =
|
let (authenticate, token) =
|
||||||
generate_token(vars::ZED_ZIPPY_APP_ID, vars::ZED_ZIPPY_APP_PRIVATE_KEY)
|
generate_token(vars::ZED_ZIPPY_APP_ID, vars::ZED_ZIPPY_APP_PRIVATE_KEY)
|
||||||
.for_repository(RepositoryTarget::current())
|
.for_repository(RepositoryTarget::current())
|
||||||
@@ -371,8 +365,7 @@ fn create_rollout_tag(rollout_job: &NamedJob, filter_repos_input: &WorkflowInput
|
|||||||
.timeout_minutes(1u32)
|
.timeout_minutes(1u32)
|
||||||
.add_step(authenticate)
|
.add_step(authenticate)
|
||||||
.add_step(checkout_zed_repo(&token))
|
.add_step(checkout_zed_repo(&token))
|
||||||
.add_step(configure_git())
|
.add_step(update_rollout_tag().with_zippy_git_identity());
|
||||||
.add_step(update_rollout_tag());
|
|
||||||
|
|
||||||
named::job(job)
|
named::job(job)
|
||||||
}
|
}
|
||||||
@@ -5,9 +5,12 @@ use crate::tasks::workflows::{
|
|||||||
prep_release_artifacts,
|
prep_release_artifacts,
|
||||||
},
|
},
|
||||||
run_bundling::{bundle_linux, bundle_mac, bundle_windows},
|
run_bundling::{bundle_linux, bundle_mac, bundle_windows},
|
||||||
run_tests::{clippy, run_platform_tests_no_filter},
|
run_tests::run_platform_tests_no_filter,
|
||||||
runners::{Arch, Platform, ReleaseChannel},
|
runners::{Arch, Platform, ReleaseChannel},
|
||||||
steps::{CommonJobConditions, FluentBuilder, NamedJob},
|
steps::{
|
||||||
|
CommonJobConditions, DEFAULT_REPOSITORY_OWNER_GUARD, FluentBuilder, GitRef, NamedJob,
|
||||||
|
RefSha, RepositoryTarget, TokenPermissions,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::{runners, steps, steps::named, vars};
|
use super::{runners, steps, steps::named, vars};
|
||||||
@@ -15,48 +18,46 @@ use gh_workflow::*;
|
|||||||
|
|
||||||
/// Generates the release_nightly.yml workflow
|
/// Generates the release_nightly.yml workflow
|
||||||
pub fn release_nightly() -> Workflow {
|
pub fn release_nightly() -> Workflow {
|
||||||
let style = check_style();
|
let (check_tag, skip) = check_nightly_tag();
|
||||||
// run only on windows as that's our fastest platform right now.
|
let mut tests = run_platform_tests_no_filter(Platform::Linux);
|
||||||
let tests = run_platform_tests_no_filter(Platform::Windows);
|
tests.job = tests
|
||||||
let clippy_job = clippy(Platform::Windows, None);
|
.job
|
||||||
let nightly = Some(ReleaseChannel::Nightly);
|
.needs([check_tag.name.clone()])
|
||||||
|
.cond(Expression::new(format!(
|
||||||
|
"{DEFAULT_REPOSITORY_OWNER_GUARD} && {} != 'true'",
|
||||||
|
skip.expr()
|
||||||
|
)));
|
||||||
|
|
||||||
|
const NIGHTLY: Option<ReleaseChannel> = Some(ReleaseChannel::Nightly);
|
||||||
|
|
||||||
let bundle = ReleaseBundleJobs {
|
let bundle = ReleaseBundleJobs {
|
||||||
linux_aarch64: bundle_linux(Arch::AARCH64, nightly, &[&style, &tests, &clippy_job]),
|
linux_aarch64: bundle_linux(Arch::AARCH64, NIGHTLY, &[&tests]),
|
||||||
linux_x86_64: bundle_linux(Arch::X86_64, nightly, &[&style, &tests, &clippy_job]),
|
linux_x86_64: bundle_linux(Arch::X86_64, NIGHTLY, &[&tests]),
|
||||||
mac_aarch64: bundle_mac(Arch::AARCH64, nightly, &[&style, &tests, &clippy_job]),
|
mac_aarch64: bundle_mac(Arch::AARCH64, NIGHTLY, &[&tests]),
|
||||||
mac_x86_64: bundle_mac(Arch::X86_64, nightly, &[&style, &tests, &clippy_job]),
|
mac_x86_64: bundle_mac(Arch::X86_64, NIGHTLY, &[&tests]),
|
||||||
windows_aarch64: bundle_windows(Arch::AARCH64, nightly, &[&style, &tests, &clippy_job]),
|
windows_aarch64: bundle_windows(Arch::AARCH64, NIGHTLY, &[&tests]),
|
||||||
windows_x86_64: bundle_windows(Arch::X86_64, nightly, &[&style, &tests, &clippy_job]),
|
windows_x86_64: bundle_windows(Arch::X86_64, NIGHTLY, &[&tests]),
|
||||||
};
|
};
|
||||||
|
|
||||||
let nix_linux_x86 = build_nix(
|
let nix_linux_x86 = build_nix(Platform::Linux, Arch::X86_64, "default", None, &[&tests]);
|
||||||
Platform::Linux,
|
let nix_mac_arm = build_nix(Platform::Mac, Arch::AARCH64, "default", None, &[&tests]);
|
||||||
Arch::X86_64,
|
|
||||||
"default",
|
|
||||||
None,
|
|
||||||
&[&style, &tests],
|
|
||||||
);
|
|
||||||
let nix_mac_arm = build_nix(
|
|
||||||
Platform::Mac,
|
|
||||||
Arch::AARCH64,
|
|
||||||
"default",
|
|
||||||
None,
|
|
||||||
&[&style, &tests],
|
|
||||||
);
|
|
||||||
let update_nightly_tag = update_nightly_tag_job(&bundle);
|
let update_nightly_tag = update_nightly_tag_job(&bundle);
|
||||||
let notify_on_failure = notify_on_failure(&bundle.jobs());
|
let notify_on_failure = notify_on_failure(&bundle.jobs());
|
||||||
|
|
||||||
named::workflow()
|
named::workflow()
|
||||||
.on(Event::default()
|
.on(Event::default()
|
||||||
// Fire every day at 7:00am UTC (Roughly before EU workday and after US workday)
|
// Fire 6 times a day
|
||||||
.schedule([Schedule::new("0 7 * * *")])
|
.schedule([Schedule::new("0 */4 * * *")])
|
||||||
.push(Push::default().add_tag("nightly")))
|
.workflow_dispatch(WorkflowDispatch::default()))
|
||||||
|
.concurrency(
|
||||||
|
Concurrency::default()
|
||||||
|
.group("release-nightly")
|
||||||
|
.cancel_in_progress(true),
|
||||||
|
)
|
||||||
.add_env(("CARGO_TERM_COLOR", "always"))
|
.add_env(("CARGO_TERM_COLOR", "always"))
|
||||||
.add_env(("RUST_BACKTRACE", "1"))
|
.add_env(("RUST_BACKTRACE", "1"))
|
||||||
.add_job(style.name, style.job)
|
.add_job(check_tag.name, check_tag.job)
|
||||||
.add_job(tests.name, tests.job)
|
.add_job(tests.name, tests.job)
|
||||||
.add_job(clippy_job.name, clippy_job.job)
|
|
||||||
.map(|mut workflow| {
|
.map(|mut workflow| {
|
||||||
for job in bundle.into_jobs() {
|
for job in bundle.into_jobs() {
|
||||||
workflow = workflow.add_job(job.name, job.job);
|
workflow = workflow.add_job(job.name, job.job);
|
||||||
@@ -69,14 +70,30 @@ pub fn release_nightly() -> Workflow {
|
|||||||
.add_job(notify_on_failure.name, notify_on_failure.job)
|
.add_job(notify_on_failure.name, notify_on_failure.job)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_style() -> NamedJob {
|
fn check_nightly_tag() -> (NamedJob, vars::JobOutput) {
|
||||||
let job = release_job(&[])
|
let step = named::bash(indoc::indoc! {r#"
|
||||||
.runs_on(runners::MAC_DEFAULT)
|
NIGHTLY_SHA=$(git rev-parse "nightly" 2>/dev/null || echo "")
|
||||||
.add_step(steps::checkout_repo().with_full_history())
|
if [ "$NIGHTLY_SHA" = "$GITHUB_SHA" ]; then
|
||||||
.add_step(steps::cargo_fmt())
|
echo "Nightly tag already points to current commit. Skipping."
|
||||||
.add_step(steps::script("./script/clippy"));
|
echo "skip=true" >> "$GITHUB_OUTPUT"
|
||||||
|
else
|
||||||
|
echo "skip=false" >> "$GITHUB_OUTPUT"
|
||||||
|
fi
|
||||||
|
"#})
|
||||||
|
.id("check");
|
||||||
|
|
||||||
named::job(job)
|
let skip_output = vars::StepOutput::new(&step, "skip");
|
||||||
|
|
||||||
|
let job = release_job(&[])
|
||||||
|
.runs_on(runners::LINUX_SMALL)
|
||||||
|
.timeout_minutes(5u32)
|
||||||
|
.outputs([("skip".to_owned(), skip_output.to_string())])
|
||||||
|
.add_step(steps::checkout_repo().with_fetch_tags())
|
||||||
|
.add_step(step);
|
||||||
|
|
||||||
|
let job = named::job(job);
|
||||||
|
let skip = skip_output.as_job_output(&job);
|
||||||
|
(job, skip)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn release_job(deps: &[&NamedJob]) -> Job {
|
fn release_job(deps: &[&NamedJob]) -> Job {
|
||||||
@@ -91,24 +108,17 @@ fn release_job(deps: &[&NamedJob]) -> Job {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn update_nightly_tag_job(bundle: &ReleaseBundleJobs) -> NamedJob {
|
fn update_nightly_tag_job(bundle: &ReleaseBundleJobs) -> NamedJob {
|
||||||
fn update_nightly_tag() -> Step<Run> {
|
let (authenticate, token) = steps::authenticate_as_zippy()
|
||||||
named::bash(indoc::indoc! {r#"
|
.for_repository(RepositoryTarget::current())
|
||||||
if [ "$(git rev-parse nightly)" = "$(git rev-parse HEAD)" ]; then
|
.with_permissions([(TokenPermissions::Contents, Level::Write)])
|
||||||
echo "Nightly tag already points to current commit. Skipping tagging."
|
.into();
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
git config user.name github-actions
|
|
||||||
git config user.email github-actions@github.com
|
|
||||||
git tag -f nightly
|
|
||||||
git push origin nightly --force
|
|
||||||
"#})
|
|
||||||
}
|
|
||||||
|
|
||||||
NamedJob {
|
NamedJob {
|
||||||
name: "update_nightly_tag".to_owned(),
|
name: "update_nightly_tag".to_owned(),
|
||||||
job: steps::release_job(&bundle.jobs())
|
job: steps::release_job(&bundle.jobs())
|
||||||
.runs_on(runners::LINUX_MEDIUM)
|
.runs_on(runners::LINUX_MEDIUM)
|
||||||
.add_step(steps::checkout_repo().with_full_history())
|
.add_step(authenticate)
|
||||||
|
.add_step(steps::checkout_repo().with_fetch_tags())
|
||||||
.add_step(download_workflow_artifacts())
|
.add_step(download_workflow_artifacts())
|
||||||
.add_step(steps::script("ls -lR ./artifacts"))
|
.add_step(steps::script("ls -lR ./artifacts"))
|
||||||
.add_step(prep_release_artifacts())
|
.add_step(prep_release_artifacts())
|
||||||
@@ -123,7 +133,12 @@ fn update_nightly_tag_job(bundle: &ReleaseBundleJobs) -> NamedJob {
|
|||||||
vars::DIGITALOCEAN_SPACES_SECRET_KEY,
|
vars::DIGITALOCEAN_SPACES_SECRET_KEY,
|
||||||
)),
|
)),
|
||||||
)
|
)
|
||||||
.add_step(update_nightly_tag())
|
.add_step(steps::update_ref(
|
||||||
|
GitRef::tag("nightly"),
|
||||||
|
RefSha::Context,
|
||||||
|
&token,
|
||||||
|
true,
|
||||||
|
))
|
||||||
.add_step(create_sentry_release()),
|
.add_step(create_sentry_release()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -63,6 +63,7 @@ enum FetchDepth {
|
|||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub(crate) struct CheckoutStep {
|
pub(crate) struct CheckoutStep {
|
||||||
fetch_depth: FetchDepth,
|
fetch_depth: FetchDepth,
|
||||||
|
fetch_tags: bool,
|
||||||
name: Option<String>,
|
name: Option<String>,
|
||||||
token: Option<String>,
|
token: Option<String>,
|
||||||
path: Option<String>,
|
path: Option<String>,
|
||||||
@@ -110,6 +111,11 @@ impl CheckoutStep {
|
|||||||
self.ref_ = Some(ref_.to_string());
|
self.ref_ = Some(ref_.to_string());
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn with_fetch_tags(mut self) -> Self {
|
||||||
|
self.fetch_tags = true;
|
||||||
|
self
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<CheckoutStep> for Step<Use> {
|
impl From<CheckoutStep> for Step<Use> {
|
||||||
@@ -132,6 +138,7 @@ impl From<CheckoutStep> for Step<Use> {
|
|||||||
.when_some(value.repository, |step, repository| {
|
.when_some(value.repository, |step, repository| {
|
||||||
step.add_with(("repository", repository))
|
step.add_with(("repository", repository))
|
||||||
})
|
})
|
||||||
|
.when(value.fetch_tags, |step| step.add_with(("fetch-tags", true)))
|
||||||
.when_some(value.ref_, |step, ref_| step.add_with(("ref", ref_)))
|
.when_some(value.ref_, |step, ref_| step.add_with(("ref", ref_)))
|
||||||
.when_some(value.token, |step, token| step.add_with(("token", token)))
|
.when_some(value.token, |step, token| step.add_with(("token", token)))
|
||||||
}
|
}
|
||||||
@@ -524,6 +531,22 @@ pub mod named {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ZED_ZIPPY_GIT_USER_NAME: &str = "zed-zippy[bot]";
|
||||||
|
const ZED_ZIPPY_GIT_USER_EMAIL: &str = "234243425+zed-zippy[bot]@users.noreply.github.com";
|
||||||
|
|
||||||
|
pub(crate) trait ZippyGitIdentity {
|
||||||
|
fn with_zippy_git_identity(self) -> Self;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ZippyGitIdentity for Step<Run> {
|
||||||
|
fn with_zippy_git_identity(self) -> Self {
|
||||||
|
self.add_env(("GIT_AUTHOR_NAME", ZED_ZIPPY_GIT_USER_NAME))
|
||||||
|
.add_env(("GIT_AUTHOR_EMAIL", ZED_ZIPPY_GIT_USER_EMAIL))
|
||||||
|
.add_env(("GIT_COMMITTER_NAME", ZED_ZIPPY_GIT_USER_NAME))
|
||||||
|
.add_env(("GIT_COMMITTER_EMAIL", ZED_ZIPPY_GIT_USER_EMAIL))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const GITHUB_SCRIPT_SHA: &str = "f28e40c7f34bde8b3046d885e986cb6290c5673b"; // v7
|
const GITHUB_SCRIPT_SHA: &str = "f28e40c7f34bde8b3046d885e986cb6290c5673b"; // v7
|
||||||
const UPLOAD_ARTIFACT_SHA: &str = "043fb46d1a93c77aae656e7c1c64a875d1fc6a0a"; // v7.0.1
|
const UPLOAD_ARTIFACT_SHA: &str = "043fb46d1a93c77aae656e7c1c64a875d1fc6a0a"; // v7.0.1
|
||||||
const DOWNLOAD_ARTIFACT_SHA: &str = "3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c"; // v8.0.1
|
const DOWNLOAD_ARTIFACT_SHA: &str = "3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c"; // v8.0.1
|
||||||
@@ -1019,10 +1042,9 @@ pub(crate) fn create_ref(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unused)]
|
|
||||||
pub(crate) fn update_ref(
|
pub(crate) fn update_ref(
|
||||||
git_ref: GitRef,
|
git_ref: GitRef,
|
||||||
sha: impl ToString,
|
sha: impl Into<RefSha>,
|
||||||
token: &StepOutput,
|
token: &StepOutput,
|
||||||
force: bool,
|
force: bool,
|
||||||
) -> impl Into<Step<Use>> {
|
) -> impl Into<Step<Use>> {
|
||||||
|
|||||||
Reference in new issue
Block a user