From patchwork Tue Nov 7 20:31:58 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aaron Conole X-Patchwork-Id: 133951 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 17D60432CA; Tue, 7 Nov 2023 21:32:04 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 11FFC40698; Tue, 7 Nov 2023 21:32:04 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id CAD674025E for ; Tue, 7 Nov 2023 21:32:02 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1699389122; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Gykds1XSdqvJ2Oye6cSilZN506KLY6/+NXz51yROpZg=; b=LOTXeczHYNLmVWQ/EX5ApZSDle5xf3i7T/LdsWp1E4G4dLnadpr/QoNBQzBm/lNEyvnDa3 gXLcXpnXSC6lG381KwSNtRhhiCDVFr5a/8x9EzzhL1AaGo/qzDKqa+zWDPzyJ/d61Fc5L/ 3qi2egOjfzd+pxwAonSQGVjyv9KItD0= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-670-l6ilWbjAN2uEKLdlR1ss4w-1; Tue, 07 Nov 2023 15:32:00 -0500 X-MC-Unique: l6ilWbjAN2uEKLdlR1ss4w-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id C81BE2810D41; Tue, 7 Nov 2023 20:31:59 +0000 (UTC) Received: from RHTPC1VM0NT.redhat.com (unknown [10.22.33.168]) by smtp.corp.redhat.com (Postfix) with ESMTP id 947A419E93; Tue, 7 Nov 2023 20:31:59 +0000 (UTC) From: Aaron Conole To: ci@dpdk.org Cc: Michael Santana , David Marchand , Thomas Monjalon , Patrick Robb , Dumitru Ceara Subject: [RFC v2 3/3] github: add a tool for restarting checks Date: Tue, 7 Nov 2023 15:31:58 -0500 Message-ID: <20231107203158.1261199-4-aconole@redhat.com> In-Reply-To: <20231107203158.1261199-1-aconole@redhat.com> References: <20231107203158.1261199-1-aconole@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.5 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-BeenThere: ci@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK CI discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ci-bounces@dpdk.org The recheck framework can track specific recheck labels and track a state for them. Add a tool that will restart github workflow runs and mark the git build table to check for a repoll. This will allow existing monitor tools to re-poll the workflow and report rerun results. Signed-off-by: Aaron Conole Acked-by: Michael Santana --- github_restart | 141 +++++++++++++++++++++++++++++++++++++++++++++++ series_db_lib.sh | 16 ++++++ 2 files changed, 157 insertions(+) create mode 100755 github_restart diff --git a/github_restart b/github_restart new file mode 100755 index 0000000..5ba9677 --- /dev/null +++ b/github_restart @@ -0,0 +1,141 @@ +#!/bin/bash +# SPDX-Identifier: gpl-2.0-or-later +# Copyright (C) 2023, Red Hat, Inc. +# +# Restarts a github job run. This can be used in conjunction with +# the recheck requests to provide the ability for a user to restart +# a test - in case the workflow is suspected of having a spurious run. +# +# Licensed under the terms of the GNU General Public License as published +# by the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. You may obtain a copy of the +# license at +# +# https://www.gnu.org/licenses/old-licenses/gpl-2.0.html +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +wait_start="no" + +while [ "$1" != "" ]; do + if echo "$1" | grep -q -s -E ^--pw-project= ; then + pw_project=$(echo "$1" | sed s/^--pw-project=//) + shift + elif echo "$1" | grep -q -s -E ^--pw-instance= ; then + pw_instance=$(echo "$1" | sed s/^--pw-instance=//) + shift + elif echo "$1" | grep -q -s -E ^--pw-credentials= ; then + pw_credential=$(echo "$1" | sed s/^--pw-credentials=//) + shift + elif echo "$1" | grep -q -s -E ^--series-id= ; then + series_id=$(echo "$1" | sed s/^--series-id=//) + shift + elif echo "$1" | grep -q -s -E ^--wait-start ; then + wait_start="yes" + if echo "$1" | grep -q -s -E ^--wait-start= ; then + wait_start=$(echo "$1" | sed s/^--wait-start=//) + fi + shift + elif echo "$1" | grep -q -s -E ^--github-token= ; then + github_token=$(echo "$1" | sed s/^--github-token=//) + shift + elif echo "$1" | grep -q -s -E ^--repository= ; then + reponame=$(echo "$1" | sed s/^--repository=//) + shift + elif echo "$1" | grep -q -s -E ^--run-id= ; then + runid=$(echo "$1" | sed s/^--repository=//) + shift + elif echo "$1" | grep -q -s -E ^--sha= ; then + sha=$(echo "$1" | sed s/^--sha=//) + shift + elif echo "$1" | grep -q -s -E ^--workflow= ; then + workflow=$(echo "$1" | sed s/^--workflow=//) + shift + elif echo "$1" | grep -q -s -E ^--help ; then + echo "github restarting script" + echo "$0: args" + echo " --pw-project= Project name" + echo " --pw-instance= URL for pw" + echo " --series-id=id Series ID for reference" + echo " --github-token=token Token for github" + echo " --wait-start[=yes|no] Wait for the remote to start" + echo " --repository=repo Repository name (ex foo/bar)" + echo " --run-id=id run ID" + echo " --workflow=workflow Workflow name" + echo " --sha=commit Commit sha" + echo "" + exit 0 + else + echo "Unknown option: '$1'" >&2 + echo "Rerun with --help for details" >&2 + exit 1 + fi +done + +source $(dirname $0)/series_db_lib.sh + +if [ "X$wait_start" != "Xno" -a "X$wait_start" != "Xyes" ]; then + echo "Unrecognized '$wait_start' argument to --wait-start=" >&2 + echo "valid values are 'yes' or 'no'." >&2 + exit 1 +fi + +if [ "X$github_token" == "X" ]; then + echo "Please set a github API token." >&2 + echo "Use --help for more info." >&2 + exit 1 +fi + +if [ "X$reponame" == "X" ]; then + echo "Please set a repository (ie: '--repository=owner/repo')." >&2 + echo "Use --help for more info." >&2 + exit 1 +fi + +AUTH="Authorization: token ${github_token}" +APP="Accept: application/vnd.github.v3+json" + +if [ "X$runid" == "X" ]; then + + # lookup the runs based on the shasum + + if [ "X$sha" == "X" ]; then + echo "Need a runid or shasum to key off." >&2 + echo "See --help for more details." >&2 + exit 1 + fi + + comma="" + for job in $(curl -s -S -H "${AUTH}" -H "${APP}" \ + "https://api.github.com/repos/${reponame}/actions/runs?head_sha=${sha}" | \ + jq -rc '.workflow_runs[].id') + do + runid="${comma}${job}" + comma="," + done +fi + +echo -n "{\"results\":[" +comma="" +for job in $(echo "$runid" | sed 's/,/ /'); do + result=$(curl -s -X POST -L -S -H "${AUTH}" -H "${APP}" \ + "https://api.github.com/repos/${reponame}/actions/runs/$job/rerun") + msg=$(echo "$result" | jq -rc '.message') + + echo -n "$comma{\"run\":$job,\"result\":" + if [ "X$msg" == "Xnull" ]; then + echo -n "\"sent\"" + if [ "X$series_id" != "X" ]; then + echo -n ",\"gap_sync\":\"reset\"" + set_unsynced_for_series "$series_id" "$pw_instance" "gap_sync" + fi + else + echo -n "\"err\",\"error\":\"$msg\"" + fi + echo -n "}" +done +echo "]}" diff --git a/series_db_lib.sh b/series_db_lib.sh index ca33c1f..3f052ad 100644 --- a/series_db_lib.sh +++ b/series_db_lib.sh @@ -382,6 +382,14 @@ function set_synced_for_series() { echo "update git_builds set gap_sync=1, obs_sync=1 where patchwork_instance=\"$instance\" and series_id=$series_id;" | series_db_execute } +function set_unsynced_for_series() { + local series_id="$1" + local instance="$2" + local ci_instance="$3" + + echo "update git_builds set $ci_instance=0 where patchwork_instance=\"$instance\" and series_id=$series_id;" | series_db_execute +} + function insert_commit() { local series_id="$1" local patch_id="$2" @@ -407,6 +415,14 @@ function get_patch_id_by_series_id_and_sha() { echo "select patch_id from git_builds where patchwork_instance=\"$instance\" and series_id=$series_id and sha=\"$sha\";" | series_db_execute } +function get_sha_for_series_id_and_patch() { + local series_id="$1" + local patch_id="$2" + local instance="$3" + + echo "select sha from git_builds where patchwork_instance=\"$instance\" and series_id=\"$series_id\" and patch_id=\"$patch_id\"" | series_db_execute +} + function get_recheck_requests_by_project() { local recheck_instance="$1" local recheck_project="$2"