Add Drone CI pipeline for builds, checks, and auto-merge
This commit is contained in:
+198
@@ -0,0 +1,198 @@
|
|||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: ci
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
event:
|
||||||
|
- push
|
||||||
|
- pull_request
|
||||||
|
branch:
|
||||||
|
- main
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: check
|
||||||
|
image: alpine:3.20
|
||||||
|
commands:
|
||||||
|
- apk add --no-cache bash >/dev/null
|
||||||
|
- |
|
||||||
|
set -eu
|
||||||
|
bash -n build.sh check-versions.sh update-version.sh versions.sh
|
||||||
|
./check-versions.sh
|
||||||
|
|
||||||
|
- name: build
|
||||||
|
image: ghcr.io/flathub-infra/flatpak-github-actions:freedesktop-24.08
|
||||||
|
privileged: true
|
||||||
|
commands:
|
||||||
|
- |
|
||||||
|
set -eu
|
||||||
|
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||||
|
flatpak install -y flathub org.electronjs.Electron2.BaseApp//24.08
|
||||||
|
flatpak-builder --repo=repo --force-clean build-dir nz.scuttlebutt.Patchwork.yaml
|
||||||
|
|
||||||
|
- name: merge
|
||||||
|
image: alpine:3.20
|
||||||
|
when:
|
||||||
|
event:
|
||||||
|
- pull_request
|
||||||
|
environment:
|
||||||
|
GITHUB_TOKEN:
|
||||||
|
from_secret: github_token
|
||||||
|
commands:
|
||||||
|
- apk add --no-cache curl jq >/dev/null
|
||||||
|
- |
|
||||||
|
set -eu
|
||||||
|
PR=$(curl -fsSL -H "Authorization: token ${GITHUB_TOKEN}" \
|
||||||
|
"https://api.github.com/repos/${DRONE_REPO}/pulls/${DRONE_PULL_REQUEST}") || exit 0
|
||||||
|
STATE=$(printf '%s' "$PR" | jq -r '.state')
|
||||||
|
HEAD_REF=$(printf '%s' "$PR" | jq -r '.head.ref')
|
||||||
|
MERGEABLE=$(printf '%s' "$PR" | jq -r '.mergeable_state')
|
||||||
|
HAS_LABEL=$(printf '%s' "$PR" | jq -r 'has("labels") and ([.labels[].name] | index("automerge") != null)')
|
||||||
|
case "$HEAD_REF" in
|
||||||
|
update-patchwork-*) ;;
|
||||||
|
*)
|
||||||
|
echo "skipping auto-merge (head=${HEAD_REF})"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
if [ "$STATE" != "open" ] || [ "$MERGEABLE" != "clean" ] || [ "$HAS_LABEL" != "true" ]; then
|
||||||
|
echo "skipping auto-merge (state=${STATE} mergeable=${MERGEABLE} label=${HAS_LABEL})"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
curl -fsSL -X PUT -H "Authorization: token ${GITHUB_TOKEN}" \
|
||||||
|
-H "Accept: application/vnd.github.v3+json" \
|
||||||
|
"https://api.github.com/repos/${DRONE_REPO}/pulls/${DRONE_PULL_REQUEST}/merge" \
|
||||||
|
-d '{"merge_method":"squash","delete_branch":true}'
|
||||||
|
echo "Merged PR #${DRONE_PULL_REQUEST}"
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: update
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
event:
|
||||||
|
- cron
|
||||||
|
cron:
|
||||||
|
- nightly
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: bump
|
||||||
|
image: alpine:3.20
|
||||||
|
environment:
|
||||||
|
GITHUB_TOKEN:
|
||||||
|
from_secret: github_token
|
||||||
|
commands:
|
||||||
|
- apk add --no-cache git curl jq bash >/dev/null
|
||||||
|
- |
|
||||||
|
set -eu
|
||||||
|
git config user.name "github-actions[bot]"
|
||||||
|
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||||
|
bash update-version.sh
|
||||||
|
if git diff --quiet; then
|
||||||
|
echo "No upstream changes."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
. ./versions.sh
|
||||||
|
BRANCH="update-patchwork-${APP_VERSION}"
|
||||||
|
REMOTE="https://${GITHUB_TOKEN}@github.com/${DRONE_REPO}.git"
|
||||||
|
if git ls-remote --heads "$REMOTE" "refs/heads/${BRANCH}" | grep -q "refs/heads/${BRANCH}$"; then
|
||||||
|
echo "Branch ${BRANCH} already exists (a PR is probably open); nothing to do."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
git checkout -b "${BRANCH}"
|
||||||
|
git add versions.sh nz.scuttlebutt.Patchwork.yaml nz.scuttlebutt.Patchwork.metainfo.xml
|
||||||
|
git commit -m "Update Patchwork to ${APP_VERSION}"
|
||||||
|
git push "$REMOTE" "${BRANCH}"
|
||||||
|
BODY=$(cat <<EOF
|
||||||
|
Bump the pinned Patchwork (Poncho Wonky) release to **${APP_VERSION}**.
|
||||||
|
|
||||||
|
- x86_64 sha256: \`${APP_SHA256_X86_64}\`
|
||||||
|
- aarch64 sha256: \`${APP_SHA256_AARCH64}\`
|
||||||
|
|
||||||
|
See https://github.com/soapdog/patchwork/releases/tag/v${APP_VERSION}
|
||||||
|
|
||||||
|
CI builds the manifest and this PR auto-merges once the checks pass.
|
||||||
|
EOF
|
||||||
|
)
|
||||||
|
PR_JSON=$(curl -fsSL -X POST -H "Authorization: token ${GITHUB_TOKEN}" \
|
||||||
|
-H "Accept: application/vnd.github+json" \
|
||||||
|
"https://api.github.com/repos/${DRONE_REPO}/pulls" \
|
||||||
|
-d "$(jq -n --arg t "Update Patchwork to ${APP_VERSION}" \
|
||||||
|
--arg h "${BRANCH}" --arg b "main" --arg body "$BODY" \
|
||||||
|
'{title:$t, head:$h, base:$b, body:$body}')")
|
||||||
|
PR_NUMBER=$(printf '%s' "$PR_JSON" | jq -r '.number')
|
||||||
|
if [ -z "$PR_NUMBER" ] || [ "$PR_NUMBER" = "null" ]; then
|
||||||
|
echo "PR creation failed:"
|
||||||
|
printf '%s\n' "$PR_JSON"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
curl -fsSL -X POST -H "Authorization: token ${GITHUB_TOKEN}" \
|
||||||
|
"https://api.github.com/repos/${DRONE_REPO}/issues/${PR_NUMBER}/labels" \
|
||||||
|
-d '{"labels":["automerge"]}'
|
||||||
|
echo "Opened PR #${PR_NUMBER} (${BRANCH})"
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: update-manual
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
event:
|
||||||
|
- custom
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: bump
|
||||||
|
image: alpine:3.20
|
||||||
|
environment:
|
||||||
|
GITHUB_TOKEN:
|
||||||
|
from_secret: github_token
|
||||||
|
commands:
|
||||||
|
- apk add --no-cache git curl jq bash >/dev/null
|
||||||
|
- |
|
||||||
|
set -eu
|
||||||
|
git config user.name "github-actions[bot]"
|
||||||
|
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||||
|
bash update-version.sh
|
||||||
|
if git diff --quiet; then
|
||||||
|
echo "No upstream changes."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
. ./versions.sh
|
||||||
|
BRANCH="update-patchwork-${APP_VERSION}"
|
||||||
|
REMOTE="https://${GITHUB_TOKEN}@github.com/${DRONE_REPO}.git"
|
||||||
|
if git ls-remote --heads "$REMOTE" "refs/heads/${BRANCH}" | grep -q "refs/heads/${BRANCH}$"; then
|
||||||
|
echo "Branch ${BRANCH} already exists (a PR is probably open); nothing to do."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
git checkout -b "${BRANCH}"
|
||||||
|
git add versions.sh nz.scuttlebutt.Patchwork.yaml nz.scuttlebutt.Patchwork.metainfo.xml
|
||||||
|
git commit -m "Update Patchwork to ${APP_VERSION}"
|
||||||
|
git push "$REMOTE" "${BRANCH}"
|
||||||
|
BODY=$(cat <<EOF
|
||||||
|
Bump the pinned Patchwork (Poncho Wonky) release to **${APP_VERSION}**.
|
||||||
|
|
||||||
|
- x86_64 sha256: \`${APP_SHA256_X86_64}\`
|
||||||
|
- aarch64 sha256: \`${APP_SHA256_AARCH64}\`
|
||||||
|
|
||||||
|
See https://github.com/soapdog/patchwork/releases/tag/v${APP_VERSION}
|
||||||
|
|
||||||
|
CI builds the manifest and this PR auto-merges once the checks pass.
|
||||||
|
EOF
|
||||||
|
)
|
||||||
|
PR_JSON=$(curl -fsSL -X POST -H "Authorization: token ${GITHUB_TOKEN}" \
|
||||||
|
-H "Accept: application/vnd.github+json" \
|
||||||
|
"https://api.github.com/repos/${DRONE_REPO}/pulls" \
|
||||||
|
-d "$(jq -n --arg t "Update Patchwork to ${APP_VERSION}" \
|
||||||
|
--arg h "${BRANCH}" --arg b "main" --arg body "$BODY" \
|
||||||
|
'{title:$t, head:$h, base:$b, body:$body}')")
|
||||||
|
PR_NUMBER=$(printf '%s' "$PR_JSON" | jq -r '.number')
|
||||||
|
if [ -z "$PR_NUMBER" ] || [ "$PR_NUMBER" = "null" ]; then
|
||||||
|
echo "PR creation failed:"
|
||||||
|
printf '%s\n' "$PR_JSON"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
curl -fsSL -X POST -H "Authorization: token ${GITHUB_TOKEN}" \
|
||||||
|
"https://api.github.com/repos/${DRONE_REPO}/issues/${PR_NUMBER}/labels" \
|
||||||
|
-d '{"labels":["automerge"]}'
|
||||||
|
echo "Opened PR #${PR_NUMBER} (${BRANCH})"
|
||||||
Reference in New Issue
Block a user