From 5dd71bce32b7d020c8afdf1ec7a07aff9c7910b0 Mon Sep 17 00:00:00 2001 From: Bohdan Zhuravel Date: Sat, 15 Nov 2025 22:53:55 +0200 Subject: [PATCH 1/6] [PR-25811] Self-hosted CI --- .circleci/config.yml | 36 ---------------------------- .github/workflows/ci.yml | 52 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 36 deletions(-) delete mode 100644 .circleci/config.yml create mode 100644 .github/workflows/ci.yml diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 612943230..000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,36 +0,0 @@ -version: 2.1 - -executors: - default: - docker: - - auth: - username: $DOCKERHUB_USERNAME - password: $DOCKERHUB_ACCESS_TOKEN - image: cimg/python:3.12 - environment: - ENVIRONMENT: production - -orbs: - python: circleci/python@3.3 - -jobs: - build: - executor: default - working_directory: ~/project/sphinx - - steps: - - checkout: - path: ~/project - - - python/install-packages - - - run: - name: Build documentation - command: uv run sphinx-build -nW -b dirhtml -d build/doctrees ../source build/html - -workflows: - workflow: - jobs: - - build: - context: - - org-global diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..659089044 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,52 @@ +name: CI + +on: + pull_request: + types: + - opened + - synchronize + push: + branches: + - master + - staging-* + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/master' && !startsWith(github.ref, 'refs/heads/staging-') }} + +jobs: + build: + runs-on: runs-on=${{ github.run_id }}/cpu=1+32/ram=2+32/family=m8+c8+r8+i8+m7+c7+r7+t4/image=ubuntu22-full-arm64/spot=lowest-price/extras=s3-cache + + env: + ENVIRONMENT: production + + steps: + - uses: runs-on/action@v2 + with: + # See https://github.com/runs-on/action#options + metrics: cpu,memory + show_costs: summary + show_env: false + + - name: Checkout code + uses: actions/checkout@v5 + + - name: Setup Python + uses: actions/setup-python@v6 + with: + python-version: '3.12' + + - name: Install uv + uses: astral-sh/setup-uv@v7 + with: + enable-cache: true + + - name: Install dependencies + working-directory: sphinx + run: uv sync + + - name: Build documentation + working-directory: sphinx + run: uv run sphinx-build -nW -b dirhtml -d build/doctrees ../source build/html From 8851b05d4a8c4387a3436d31e0c5081b7895f8eb Mon Sep 17 00:00:00 2001 From: "sergii.kostiuk" Date: Mon, 17 Nov 2025 23:01:33 +0200 Subject: [PATCH 2/6] Update CI workflow to simplify staging branch pattern --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 659089044..b231dede5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,7 +8,7 @@ on: push: branches: - master - - staging-* + - staging* workflow_dispatch: concurrency: From 0da1941b37a4d519cc9c97eeeb6992235024277f Mon Sep 17 00:00:00 2001 From: "sergii.kostiuk" Date: Mon, 17 Nov 2025 23:54:32 +0200 Subject: [PATCH 3/6] add gh actions check --- deploy/Jenkinsfile | 6 +- deploy/deploy.sh | 20 +-- deploy/lib/circleci_common.sh | 152 ------------------- deploy/lib/github_actions_common.sh | 223 ++++++++++++++++++++++++++++ 4 files changed, 236 insertions(+), 165 deletions(-) delete mode 100644 deploy/lib/circleci_common.sh create mode 100644 deploy/lib/github_actions_common.sh diff --git a/deploy/Jenkinsfile b/deploy/Jenkinsfile index 6eff8a2bd..e1eeea792 100644 --- a/deploy/Jenkinsfile +++ b/deploy/Jenkinsfile @@ -5,7 +5,7 @@ pipeline { label "staging" } environment { - CIRCLE_CI_TOKEN = credentials('CIRCLE_CI_TOKEN') + GITHUB_ACC = credentials('talkable-bot-deploy-token') JENKINS_BUILD_USER_ID = "" LOCAL_PORT="8080" SLACK_CHANNEL = "deploy" @@ -13,12 +13,12 @@ pipeline { SLACK_FOOTER = "Executed on: *${NODE_NAME}*" } triggers { - pollSCM('* 10-17 * * 1,2,3,4') + pollSCM('* * * * *') // Polls SCM every minute } parameters { choice(name: "DEPLOY_COMMAND", choices: ["deploy", "ci_status"], - description: "DEPLOY - Start the default deployment\nCI_STATUS - Check the CircleCI build status") + description: "DEPLOY - Start the default deployment\nCI_STATUS - Check the GitHub Actions build status") } options { buildDiscarder(logRotator(numToKeepStr: '15', daysToKeepStr: '14')) diff --git a/deploy/deploy.sh b/deploy/deploy.sh index cd2bb88f4..440d4877f 100755 --- a/deploy/deploy.sh +++ b/deploy/deploy.sh @@ -8,14 +8,14 @@ printenv | sort TIMEFRAME_SECONDS=240 PROJECT_ROOT="talkable-docs" SUBPROJECT="docs" -# CircleCI API v2 configuration -CIRCLE_CI_API_BASE="https://circleci.com/api/v2" -CIRCLE_CI_PROJECT_SLUG="gh/talkable/${PROJECT_ROOT}" -CIRCLE_CI_WEB_URL="https://app.circleci.com/pipelines/github/talkable/${PROJECT_ROOT}?branch=${BRANCH_NAME}" +# GitHub Actions configuration +GITHUB_API_BASE="https://api.github.com" +GITHUB_REPOSITORY="talkable/${PROJECT_ROOT}" +GITHUB_ACTIONS_WEB_URL="https://github.com/talkable/${PROJECT_ROOT}/actions?query=branch%3A${BRANCH_NAME}" -# Source shared CircleCI functions +# Source shared GitHub Actions functions SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -source "${SCRIPT_DIR}/lib/circleci_common.sh" +source "${SCRIPT_DIR}/lib/github_actions_common.sh" TASK=$1 @@ -24,14 +24,14 @@ print_help() { clear echo 'Available Commands:' echo ' deploy - deploy current version of talkable-docs' - echo ' ci | cistatus | status - check CircleCI build status' + echo ' ci | cistatus | status - check GitHub Actions build status' echo 'Example:' echo ' deploy.sh deploy' echo ' deploy.sh ci_status' exit 0 } -# CircleCI status function is now sourced from lib/circleci_common.sh +# GitHub Actions status function is now sourced from lib/github_actions_common.sh remote_ssh_exec() { ssh -o StrictHostKeyChecking=no -i "$SSH_KEY" "$SSH_USER@$HOST_ENV" "$@" @@ -62,12 +62,12 @@ EOF case $TASK in ci | ci_status | ci_only | status) - circleci_status + gh_status deploy_check ;; deploy) echo "Starting deployment..." - circleci_status + gh_status deploy_docs deploy_check ;; diff --git a/deploy/lib/circleci_common.sh b/deploy/lib/circleci_common.sh deleted file mode 100644 index 40f4e8b89..000000000 --- a/deploy/lib/circleci_common.sh +++ /dev/null @@ -1,152 +0,0 @@ -#!/usr/bin/env bash -set -e -# CircleCI Common Functions Library -# Simplified for talkable-docs single-job workflow - -# Ensure required variables are set -: "${CIRCLE_CI_API_BASE:=https://circleci.com/api/v2}" -# CIRCLE_CI_TOKEN should be set in environment - -# Get build status for a specific commit -# Returns the status of the "build" job -get_build_status() { - local commit=$1 - - # Get recent pipelines and find the one for our commit - local response=$(curl -s -H "Circle-Token: $CIRCLE_CI_TOKEN" \ - "${CIRCLE_CI_API_BASE}/project/${CIRCLE_CI_PROJECT_SLUG}/pipeline?branch=${BRANCH_NAME}") - - # Extract pipeline ID for the specific commit - local pipeline_id=$(echo "$response" | jq -r --arg commit "$commit" \ - '.items[] | select(.vcs.revision == $commit) | .id' | head -n 1) - - if [[ -z "$pipeline_id" || "$pipeline_id" == "null" ]]; then - echo "no_pipeline" - return - fi - - # Get workflows for pipeline (we only have one workflow) - local workflows_response=$(curl -s -H "Circle-Token: $CIRCLE_CI_TOKEN" \ - "${CIRCLE_CI_API_BASE}/pipeline/${pipeline_id}/workflow") - - # Get the first (and only) workflow ID - local workflow_id=$(echo "$workflows_response" | jq -r '.items[0].id') - - if [[ -z "$workflow_id" || "$workflow_id" == "null" ]]; then - echo "no_workflow" - return - fi - - # Get jobs for workflow (we only have one "build" job) - local jobs_response=$(curl -s -H "Circle-Token: $CIRCLE_CI_TOKEN" \ - "${CIRCLE_CI_API_BASE}/workflow/${workflow_id}/job") - - # Get the build job status - local build_status=$(echo "$jobs_response" | jq -r '.items[] | select(.name == "build") | .status') - - echo "$build_status" -} - -# Get pipeline number for display/linking -get_pipeline_number() { - local commit=$1 - - local response=$(curl -s -H "Circle-Token: $CIRCLE_CI_TOKEN" \ - "${CIRCLE_CI_API_BASE}/project/${CIRCLE_CI_PROJECT_SLUG}/pipeline?branch=${BRANCH_NAME}") - - echo "$response" | jq -r --arg commit "$commit" \ - '.items[] | select(.vcs.revision == $commit) | .number' | head -n 1 -} - -# Monitor CircleCI build status -circleci_status() { - local start_time=$SECONDS - local short_commit="${GIT_COMMIT:0:7}" - - echo "==========================================================================" - echo "Starting CircleCI build monitoring for commit: ${short_commit}" - echo "==========================================================================" - - while true; do - echo "" - echo "Checking build status at $(date)..." - - # Get build status - local build_status=$(get_build_status "$GIT_COMMIT") - local pipeline_number=$(get_pipeline_number "$GIT_COMMIT") - - # Check if pipeline exists - if [[ "$build_status" == "no_pipeline" ]]; then - echo "⚠️ No CircleCI pipeline found for commit ${short_commit}" - echo "Check CircleCI: ${CIRCLE_CI_WEB_URL}" - exit 1 - fi - - if [[ "$build_status" == "no_workflow" ]]; then - echo "⚠️ No workflow found in pipeline for commit ${short_commit}" - echo "Check CircleCI: ${CIRCLE_CI_WEB_URL}" - exit 1 - fi - - # Create direct pipeline URL - local pipeline_url="https://app.circleci.com/pipelines/github/${CIRCLE_CI_PROJECT_SLUG#gh/}/${pipeline_number}" - echo "Pipeline: #${pipeline_number} (${pipeline_url})" - - # Check build status - case "$build_status" in - "success") - echo "✅ Build: passed successfully" - echo "" - echo "==========================================================================" - echo "🎉 The sphinx build has succeeded!" - echo "Total elapsed time: $(((SECONDS - start_time) / 60)) minutes" - echo "==========================================================================" - break - ;; - "failed") - echo "❌ Build: failed" - echo "" - echo "==========================================================================" - echo "The sphinx build has failed on CircleCI." - echo "Check CircleCI: ${pipeline_url}" - echo "==========================================================================" - exit 1 - ;; - "canceled") - echo "✗ Build: was cancelled" - echo "" - echo "==========================================================================" - echo "The sphinx build was cancelled on CircleCI." - echo "Check CircleCI: ${pipeline_url}" - echo "==========================================================================" - exit 1 - ;; - "running") - echo "⏳ Build: is still running..." - ;; - "queued") - echo "⏳ Build: is queued..." - ;; - "not_running") - echo "⏳ Build: waiting for available agent..." - ;; - *) - echo "❓ Build: status is ${build_status}" - ;; - esac - - # Check timeout - if [[ $SECONDS -gt $TIMEFRAME_SECONDS ]]; then - echo "" - echo "==========================================================================" - echo "⏰ Build timeout after $((TIMEFRAME_SECONDS / 60)) minutes" - echo "Check CircleCI: ${pipeline_url}" - echo "==========================================================================" - exit 228 - fi - - echo "Elapsed: $(((SECONDS - start_time) / 60))m / Timeout: $((TIMEFRAME_SECONDS / 60))m" - echo "Next check in 8 seconds..." - sleep 8 - done -} diff --git a/deploy/lib/github_actions_common.sh b/deploy/lib/github_actions_common.sh new file mode 100644 index 000000000..0d047bfab --- /dev/null +++ b/deploy/lib/github_actions_common.sh @@ -0,0 +1,223 @@ +#!/usr/bin/env bash +set -eo pipefail + +# GitHub Actions Common Functions Library +# Adapted for talkable-docs repository +# Checks overall workflow status for a specific commit + +# Ensure required variables are set +: "${GITHUB_API_BASE:=https://api.github.com}" +: "${GITHUB_REPOSITORY:=talkable/talkable-docs}" +: "${GITHUB_ACC_USR:?GITHUB_ACC_USR must be set}" +: "${GITHUB_ACC_PSW:?GITHUB_ACC_PSW must be set}" +: "${BRANCH_NAME:?BRANCH_NAME must be set}" +: "${GIT_COMMIT:?GIT_COMMIT must be set}" + +# Constants +CHECK_INTERVAL=8 +EXIT_CODE_TIMEOUT=228 +MAX_NOT_FOUND_ATTEMPTS=5 + +# Get workflow run information for a commit +get_workflow_run() { + local commit=$1 + local short_commit="${commit:0:7}" + local response http_code run_id workflow_run + + echo "Searching for workflow run with commit: ${short_commit}" >&2 + + response=$(curl -s -w "\n%{http_code}" -u "${GITHUB_ACC_USR}:${GITHUB_ACC_PSW}" \ + "${GITHUB_API_BASE}/repos/${GITHUB_REPOSITORY}/actions/runs?branch=${BRANCH_NAME}&per_page=20&head_sha=${commit}") + + http_code=$(echo "$response" | tail -n1) + response=$(echo "$response" | sed '$d') + + if [[ "$http_code" != "200" ]]; then + echo "ERROR: GitHub API returned HTTP $http_code" >&2 + case "$http_code" in + 401) echo " → Check GITHUB_ACC_USR and GITHUB_ACC_PSW credentials" >&2 ;; + 403) echo " → API rate limit exceeded or access denied" >&2 ;; + 404) echo " → Repository not found or no access" >&2 ;; + esac + return 1 + fi + + if ! echo "$response" | jq empty 2>/dev/null; then + echo "ERROR: Invalid JSON response from GitHub API" >&2 + return 1 + fi + + run_id=$(echo "$response" | jq -r --arg commit "$commit" \ + '[.workflow_runs[]? | select(.head_sha == $commit)] | sort_by(.created_at) | reverse | .[0].id // empty') + + if [[ -z "$run_id" || "$run_id" == "null" ]]; then + echo "No workflow run found for commit ${short_commit}" >&2 + return 1 + fi + + workflow_run=$(curl -s -w "\n%{http_code}" -u "${GITHUB_ACC_USR}:${GITHUB_ACC_PSW}" \ + "${GITHUB_API_BASE}/repos/${GITHUB_REPOSITORY}/actions/runs/${run_id}") + + http_code=$(echo "$workflow_run" | tail -n1) + workflow_run=$(echo "$workflow_run" | sed '$d') + + if [[ "$http_code" != "200" ]]; then + echo "ERROR: GitHub API returned HTTP $http_code when fetching workflow run" >&2 + return 1 + fi + + if ! echo "$workflow_run" | jq empty 2>/dev/null; then + echo "ERROR: Invalid JSON response from workflow run API" >&2 + return 1 + fi + + echo "$workflow_run" +} + +# Check overall workflow status +# Returns: 0=success/pending, 1=failure +check_workflow_status() { + local workflow_run=$1 + local run_id run_number status conclusion run_url short_commit + + run_id=$(echo "$workflow_run" | jq -r '.id') + run_number=$(echo "$workflow_run" | jq -r '.run_number') + status=$(echo "$workflow_run" | jq -r '.status // "unknown"') + conclusion=$(echo "$workflow_run" | jq -r '.conclusion // "null"') + run_url="https://github.com/${GITHUB_REPOSITORY}/actions/runs/${run_id}" + short_commit="${GIT_COMMIT:0:7}" + + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "GitHub Actions Workflow Run #${run_number}" + echo "URL: ${run_url}" + echo "Commit: ${short_commit} (${GIT_COMMIT})" + echo "Status: ${status}, Conclusion: ${conclusion}" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + + if [[ "$status" == "completed" ]]; then + case "$conclusion" in + "success"|"neutral") + echo "✅ Workflow: SUCCESS" + return 0 + ;; + *) + echo "✗ Workflow: FAILED (${conclusion})" + return 1 + ;; + esac + else + echo "⏳ Workflow: IN PROGRESS (${status})" + return 0 + fi +} + +# Early check - fails fast if workflow already failed +gh_check() { + local workflow_run result short_commit="${GIT_COMMIT:0:7}" + + echo "════════════════════════════════════════════════════════════════" + echo "GitHub Actions Check (Early)" + echo "Commit: ${short_commit}" + echo "════════════════════════════════════════════════════════════════" + + workflow_run=$(get_workflow_run "$GIT_COMMIT") || { + echo "⚠️ Workflow not found yet - may still be triggering" + echo "Pipeline will continue. Status will be checked later." + echo "════════════════════════════════════════════════════════════════" + return 0 + } + + check_workflow_status "$workflow_run" + result=$? + + echo "════════════════════════════════════════════════════════════════" + + if [[ $result -eq 0 ]]; then + echo "✅ Workflow passed or still running - continuing" + return 0 + else + echo "❌ Workflow has failed - stopping deployment" + return 1 + fi +} + +# Continuous monitoring - waits for workflow to complete +gh_status() { + local workflow_run result + local short_commit="${GIT_COMMIT:0:7}" + local start_time=$SECONDS + local check_count=0 + local not_found_count=0 + local elapsed_minutes elapsed_secs + + echo "════════════════════════════════════════════════════════════════" + echo "GitHub Actions Status Monitor" + echo "Commit: ${short_commit}" + echo "Timeout: $((TIMEFRAME_SECONDS / 60)) minutes" + echo "════════════════════════════════════════════════════════════════" + + while true; do + check_count=$((check_count + 1)) + elapsed_minutes=$(((SECONDS - start_time) / 60)) + elapsed_secs=$(((SECONDS - start_time) % 60)) + + echo "" + echo "Check #${check_count} (elapsed: ${elapsed_minutes}m ${elapsed_secs}s)" + + if [[ $SECONDS -gt $TIMEFRAME_SECONDS ]]; then + echo "⏰ Build timed out waiting for workflow to complete." + exit $EXIT_CODE_TIMEOUT + fi + + workflow_run=$(get_workflow_run "$GIT_COMMIT") || { + ((not_found_count++)) + + if [[ $not_found_count -ge $MAX_NOT_FOUND_ATTEMPTS ]]; then + echo "❌ Cannot find workflow after $not_found_count attempts" + echo " Check if workflow was triggered for this commit" + exit 1 + fi + + echo "⚠️ Workflow not found (attempt $not_found_count/$MAX_NOT_FOUND_ATTEMPTS)" + echo "Retrying in ${CHECK_INTERVAL} seconds..." + sleep $CHECK_INTERVAL + continue + } + + not_found_count=0 + + check_workflow_status "$workflow_run" + result=$? + + if [[ $result -eq 0 ]]; then + local status=$(echo "$workflow_run" | jq -r '.status') + if [[ "$status" == "completed" ]]; then + echo "" + echo "════════════════════════════════════════════════════════════════" + echo "✅ Workflow has passed on GitHub Actions." + echo "Total time: ${elapsed_minutes} minutes" + echo "════════════════════════════════════════════════════════════════" + return 0 + else + echo "" + echo "Waiting for workflow to complete. Checking again in ${CHECK_INTERVAL} seconds..." + echo "Elapsed: ${elapsed_minutes}m / Timeout: $((TIMEFRAME_SECONDS / 60))m" + sleep $CHECK_INTERVAL + fi + else + echo "" + echo "════════════════════════════════════════════════════════════════" + echo "❌ Workflow has failed on GitHub Actions." + echo "════════════════════════════════════════════════════════════════" + exit 1 + fi + done +} + +# If script is run directly (not sourced), run both checks +if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then + echo "Running in standalone mode" + gh_check + gh_status +fi + From 5b27af177ff13110ea7bb297ad4909442de1ff11 Mon Sep 17 00:00:00 2001 From: "sergii.kostiuk" Date: Mon, 17 Nov 2025 23:59:45 +0200 Subject: [PATCH 4/6] Update CI workflow to specify exact staging branch and remove early workflow check function --- .github/workflows/ci.yml | 2 +- deploy/lib/github_actions_common.sh | 38 ----------------------------- 2 files changed, 1 insertion(+), 39 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b231dede5..9768b2cd0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,7 +8,7 @@ on: push: branches: - master - - staging* + - staging workflow_dispatch: concurrency: diff --git a/deploy/lib/github_actions_common.sh b/deploy/lib/github_actions_common.sh index 0d047bfab..18bbe186c 100644 --- a/deploy/lib/github_actions_common.sh +++ b/deploy/lib/github_actions_common.sh @@ -111,36 +111,6 @@ check_workflow_status() { fi } -# Early check - fails fast if workflow already failed -gh_check() { - local workflow_run result short_commit="${GIT_COMMIT:0:7}" - - echo "════════════════════════════════════════════════════════════════" - echo "GitHub Actions Check (Early)" - echo "Commit: ${short_commit}" - echo "════════════════════════════════════════════════════════════════" - - workflow_run=$(get_workflow_run "$GIT_COMMIT") || { - echo "⚠️ Workflow not found yet - may still be triggering" - echo "Pipeline will continue. Status will be checked later." - echo "════════════════════════════════════════════════════════════════" - return 0 - } - - check_workflow_status "$workflow_run" - result=$? - - echo "════════════════════════════════════════════════════════════════" - - if [[ $result -eq 0 ]]; then - echo "✅ Workflow passed or still running - continuing" - return 0 - else - echo "❌ Workflow has failed - stopping deployment" - return 1 - fi -} - # Continuous monitoring - waits for workflow to complete gh_status() { local workflow_run result @@ -213,11 +183,3 @@ gh_status() { fi done } - -# If script is run directly (not sourced), run both checks -if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then - echo "Running in standalone mode" - gh_check - gh_status -fi - From b6b7d774281ee606dc4df7179b4d867f2fce1c4b Mon Sep 17 00:00:00 2001 From: "sergii.kostiuk" Date: Tue, 18 Nov 2025 00:03:34 +0200 Subject: [PATCH 5/6] Update Jenkinsfile to adjust SCM polling schedule --- deploy/Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/Jenkinsfile b/deploy/Jenkinsfile index e1eeea792..5b0bb43ed 100644 --- a/deploy/Jenkinsfile +++ b/deploy/Jenkinsfile @@ -13,7 +13,7 @@ pipeline { SLACK_FOOTER = "Executed on: *${NODE_NAME}*" } triggers { - pollSCM('* * * * *') // Polls SCM every minute + pollSCM('* 10-17 * * 1,2,3,4') } parameters { choice(name: "DEPLOY_COMMAND", From ad58bd3508ff777cb443b3b6a40e06b62c14f7b6 Mon Sep 17 00:00:00 2001 From: Bohdan Zhuravel Date: Tue, 18 Nov 2025 00:49:40 +0200 Subject: [PATCH 6/6] Cleanup --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9768b2cd0..6b370e0c2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,11 +13,11 @@ on: concurrency: group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: ${{ github.ref != 'refs/heads/master' && !startsWith(github.ref, 'refs/heads/staging-') }} + cancel-in-progress: ${{ contains(fromJSON('["master", "staging"]'), github.ref_name) }} jobs: build: - runs-on: runs-on=${{ github.run_id }}/cpu=1+32/ram=2+32/family=m8+c8+r8+i8+m7+c7+r7+t4/image=ubuntu22-full-arm64/spot=lowest-price/extras=s3-cache + runs-on: runs-on=${{ github.run_id }}/cpu=1+32/ram=1+32/family=m8+c8+r8+i8+m7+c7+r7+t4/image=ubuntu22-full-arm64/spot=lowest-price/extras=s3-cache env: ENVIRONMENT: production