test upload & download

This commit is contained in:
Earl Warren 2023-03-29 17:16:26 +02:00
parent 89b6ae4da6
commit ba4ac4e80d
No known key found for this signature in database
GPG key ID: 0579CB2928A78A00
8 changed files with 107 additions and 139 deletions

View file

@ -12,13 +12,13 @@ jobs:
image-version: 1.19 image-version: 1.19
- name: 001 - name: 001
run: | run: |
set -ex
export FORGEJO_RUNNER_LOGS="${{ steps.forgejo.outputs.runner-logs }}" export FORGEJO_RUNNER_LOGS="${{ steps.forgejo.outputs.runner-logs }}"
testdata/run.sh push_self http://testuser:admin1234@${{ steps.forgejo.outputs.host-port }} testuser setup-forgejo-release forgejo-test-helper.sh push_self_action http://testuser:admin1234@${{ steps.forgejo.outputs.host-port }} testuser forgejo-release vTest
testdata/run.sh workflow http://testuser:admin1234@${{ steps.forgejo.outputs.host-port }} testuser try-setup-forgejo-release forgejo-test-helper.sh run_workflow testdata/upload-download http://testuser:admin1234@${{ steps.forgejo.outputs.host-port }} testuser upload-download forgejo-release
- name: 002 - name: 002
run: | run: |
set -ex set -ex
curl -sS ${{ steps.forgejo.outputs.url }}/api/forgejo/v1/version | grep 1.19
export FORGEJO="${{ steps.forgejo.outputs.url }}" export FORGEJO="${{ steps.forgejo.outputs.url }}"
export RELEASETEAMTOKEN="${{ steps.forgejo.outputs.token }}" export RELEASETEAMTOKEN="${{ steps.forgejo.outputs.token }}"
export CI_REPO_OWNER=testuser export CI_REPO_OWNER=testuser

View file

@ -1,10 +1,45 @@
name: 'Setup Forgejo release tools' name: 'Forgejo release download and upload'
author: 'Forgejo authors' author: 'Forgejo authors'
description: | description: |
Install dependencies of the forgejo-release-upload and forgejo-release-download Upload or download the assets of a release to a Forgejo instance.
actions. inputs:
url:
description: 'URL of the Forgejo instance'
required: true
repo:
description: 'owner/project relative to the URL'
required: true
tag:
description: 'Tag of the release'
required: true
doer:
description: 'Forgejo user authoring the upload'
token:
description: 'Forgejo application token'
required: true
release-dir:
description: 'Directory in whichs release assets are uploaded or downloaded'
required: true
direction:
description: 'Can either be download or upload'
required: true
verbose:
description: 'Increase the verbosity level'
default: 'false'
runs: runs:
using: "composite" using: "composite"
steps: steps:
- run: echo "${{ github.action_path }}" >> $GITHUB_PATH - run: echo "${{ github.action_path }}" >> $GITHUB_PATH
shell: bash shell: bash
- run: |
export FORGEJO="${{ inputs.url }}"
export REPO="${{ inputs.repo }}"
export TAG="${{ inputs.tag }}"
export DOER="${{ inputs.doer }}"
export TOKEN="${{ inputs.token }}"
export RELEASE_DIR="${{ inputs.release-dir }}"
export VERBOSE="${{ inputs.verbose }}"
export SHA="${{ github.sha }}"
forgejo-release.sh ${{ inputs.direction }}
shell: bash

View file

@ -1,17 +1,15 @@
#!/bin/bash #!/bin/bash
set -ex set -e
if ${VERBOSE:-false}; then set -x; fi
: ${PULL_USER:=forgejo-integration}
: ${PUSH_USER:=forgejo}
: ${TAG:=${CI_COMMIT_TAG}}
: ${FORGEJO:=https://codeberg.org} : ${FORGEJO:=https://codeberg.org}
: ${REPO:=forgejo} : ${REPO:=forgejo-integration/forgejo}
: ${RELEASE_DIR:=dist/release} : ${RELEASE_DIR:=dist/release}
: ${BIN_DIR:=/tmp} : ${BIN_DIR:=$(mktemp -d)}
: ${TEA_VERSION:=0.9.0} : ${TEA_VERSION:=0.9.0}
setup_tea() { setup_tea() {
if ! test -f $BIN_DIR/tea ; then if ! test -f $BIN_DIR/tea ; then
curl -sL https://dl.gitea.io/tea/$TEA_VERSION/tea-$TEA_VERSION-linux-amd64 > $BIN_DIR/tea curl -sL https://dl.gitea.io/tea/$TEA_VERSION/tea-$TEA_VERSION-linux-amd64 > $BIN_DIR/tea
@ -20,33 +18,38 @@ setup_tea() {
} }
ensure_tag() { ensure_tag() {
if api GET repos/$PUSH_USER/$REPO/tags/$TAG > /tmp/tag.json ; then if api GET repos/$REPO/tags/$TAG > /tmp/tag.json ; then
local sha=$(jq --raw-output .commit.sha < /tmp/tag.json) local sha=$(jq --raw-output .commit.sha < /tmp/tag.json)
if test "$sha" != "$CI_COMMIT_SHA" ; then if test "$sha" != "$SHA" ; then
cat /tmp/tag.json cat /tmp/tag.json
echo "the tag SHA in the $PUSH_USER repository does not match the tag SHA that triggered the build: $CI_COMMIT_SHA" echo "the tag SHA in the $REPO repository does not match the tag SHA that triggered the build: $SHA"
false false
fi fi
else else
api POST repos/$PUSH_USER/$REPO/tags --data-raw '{"tag_name": "'$CI_COMMIT_TAG'", "target": "'$CI_COMMIT_SHA'"}' api POST repos/$REPO/tags --data-raw '{"tag_name": "'$TAG'", "target": "'$SHA'"}'
fi fi
} }
upload() { upload_release() {
ASSETS=$(ls $RELEASE_DIR/* | sed -e 's/^/-a /') local assets=$(ls $RELEASE_DIR/* | sed -e 's/^/-a /')
echo "${CI_COMMIT_TAG}" | grep -qi '\-rc' && export RELEASETYPE="--prerelease" && echo "Uploading as Pre-Release" local releasetype
echo "${CI_COMMIT_TAG}" | grep -qi '\-test' && export RELEASETYPE="--draft" && echo "Uploading as Draft" echo "${TAG}" | grep -qi '\-rc' && export releasetype="--prerelease" && echo "Uploading as Pre-Release"
test ${RELEASETYPE+false} || echo "Uploading as Stable" echo "${TAG}" | grep -qi '\-test' && export releasetype="--draft" && echo "Uploading as Draft"
test ${releasetype+false} || echo "Uploading as Stable"
ensure_tag ensure_tag
anchor=$(echo $CI_COMMIT_TAG | sed -e 's/^v//' -e 's/[^a-zA-Z0-9]/-/g') anchor=$(echo $TAG | sed -e 's/^v//' -e 's/[^a-zA-Z0-9]/-/g')
$BIN_DIR/tea release create $ASSETS --repo $PUSH_USER/$REPO --note "$RELEASENOTES" --tag $CI_COMMIT_TAG --title $CI_COMMIT_TAG ${RELEASETYPE} $BIN_DIR/tea release create $assets --repo $REPO --note "$RELEASENOTES" --tag $TAG --title $TAG ${releasetype}
} }
push() { upload() {
setup_api setup_api
setup_tea setup_tea
GITEA_SERVER_TOKEN=$RELEASETEAMTOKEN $BIN_DIR/tea login add --name $RELEASETEAMUSER --url $FORGEJO if ! test "$DOER"; then
upload echo 'missing DOER'
return 1
fi
GITEA_SERVER_TOKEN=$TOKEN $BIN_DIR/tea login add --name $DOER --url $FORGEJO
upload_release
} }
setup_api() { setup_api() {
@ -61,15 +64,15 @@ api() {
path=$1 path=$1
shift shift
curl --fail -X $method -sS -H "Content-Type: application/json" -H "Authorization: token $RELEASETEAMTOKEN" "$@" $FORGEJO/api/v1/$path curl --fail -X $method -sS -H "Content-Type: application/json" -H "Authorization: token $TOKEN" "$@" $FORGEJO/api/v1/$path
} }
pull() { download() {
setup_api setup_api
( (
mkdir -p $RELEASE_DIR mkdir -p $RELEASE_DIR
cd $RELEASE_DIR cd $RELEASE_DIR
api GET repos/$PULL_USER/$REPO/releases/tags/$TAG > /tmp/assets.json api GET repos/$REPO/releases/tags/$TAG > /tmp/assets.json
jq --raw-output '.assets[] | "\(.name) \(.browser_download_url)"' < /tmp/assets.json | while read name url ; do jq --raw-output '.assets[] | "\(.name) \(.browser_download_url)"' < /tmp/assets.json | while read name url ; do
wget --quiet -O $name $url wget --quiet -O $name $url
done done
@ -78,7 +81,7 @@ pull() {
missing() { missing() {
echo need pull or push argument got nothing echo need upload or download argument got nothing
exit 1 exit 1
} }

97
testdata/run.sh vendored
View file

@ -1,97 +0,0 @@
#!/bin/bash
set -ex
: ${FORGEJO_RUNNER_LOGS:=../setup-forgejo/forgejo-runner.log}
DATA=$(dirname $0)
DIR=$(mktemp -d)
trap "rm -fr $DIR" EXIT
function check_status() {
local forgejo="$1"
local repo="$2"
local sha="$3"
if ! which jq > /dev/null ; then
apt-get install -y -qq jq
fi
local state=$(curl --fail -sS "$forgejo/api/v1/repos/$repo/commits/$sha/status" | jq --raw-output .state)
echo $state
test "$state" != "" -a "$state" != "pending" -a "$state" != "running" -a "$state" != "null"
}
function wait_success() {
local forgejo="$1"
local repo="$2"
local sha="$3"
for i in $(seq 40); do
if check_status "$forgejo" "$repo" "$sha"; then
break
fi
tail $FORGEJO_RUNNER_LOGS
sleep 10
done
if ! test "$(check_status "$forgejo" "$repo" "$sha")" = "success" ; then
cat $FORGEJO_RUNNER_LOGS
return 1
fi
}
function push() {
local forgejo="$1"
local owner="$2"
local workflow="$3"
local dir="$DIR/$workflow"
mkdir -p $dir/.forgejo/workflows
sed -e "s|SELF|$forgejo/$owner|" \
< $DATA/$workflow.yml > $dir/.forgejo/workflows/$workflow.yml
(
cd $dir
git init
git checkout -b main
git config user.email root@example.com
git config user.name username
git add .
git commit -m 'initial commit'
git remote add origin $forgejo/$owner/$workflow
git push --force -u origin main
git rev-parse HEAD > SHA
)
}
function workflow() {
local forgejo="${1}"
local owner="${2}"
local workflow="${3}"
push "$forgejo" "$owner" "$workflow"
wait_success "$forgejo" "$owner/$workflow" $(cat $DIR/$workflow/SHA)
}
function push_self() {
local forgejo="$1"
local owner="$2"
local self="$3"
local dir="$DIR/self"
git clone . $dir
(
cd $dir
rm -fr .forgejo .git
git init
git checkout -b main
git remote add origin $forgejo/$owner/$self
git config user.email root@example.com
git config user.name username
git add .
git commit -m 'initial commit'
git push --force origin main
git tag --force vTest HEAD
git push --force origin vTest
)
}
"$@"

View file

@ -1,11 +0,0 @@
name: Setup Forgejo Release
run-name: ${{ github.actor }} is setting up Forgejo Release
on: [push]
jobs:
setup-forgejo:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: SELF/setup-forgejo-release@vTest
- run: |
type forgejo-release.sh

View file

@ -0,0 +1,36 @@
name: Upload a Forgejo Release
on: [push]
jobs:
setup-forgejo:
runs-on: self-hosted
steps:
- uses: actions/checkout@v3
- id: forgejo
uses: https://code.forgejo.org/actions/setup-forgejo@v1
with:
user: root
password: admin1234
- id: release-upload
uses: SELF@vTest
with:
direction: upload
url: ${{ steps.forgejo.outputs.url }}
repo: root/upload-download
tag: v1.0
doer: root
token: ${{ steps.forgejo.outputs.token }}
release-dir: upload-dir
verbose: true
- id: release-download
uses: SELF@vTest
with:
direction: download
url: ${{ steps.forgejo.outputs.url }}
repo: root/upload-download
tag: v1.0
doer: root
token: ${{ steps.forgejo.outputs.token }}
release-dir: download-dir
verbose: true
- run: |
diff -u upload-dir download-dir

View file

@ -0,0 +1 @@
FILE1

View file

@ -0,0 +1 @@
FILE2