Compare commits

...

12 commits
v4.0.0 ... v4

Author SHA1 Message Date
Chl
17f9610281
Stopping the mixing -> clear separation Forgejo/Github
All checks were successful
/ GenerateReleaseZipfile (push) Successful in 1m15s
This action is even less useful in Github than in Forgejo/Gitea so let's stop
wasting time and clearly label with a suffix 'v4.x.y-github' for Github.
2024-08-31 15:25:00 +02:00
Chl
67ac8517db
Fixup workflow trigger on Forgejo
All checks were successful
/ GenerateReleaseZipfile (push) Successful in 1m14s
2024-08-31 03:23:58 +02:00
Chl
9c77c2641a
Branding for Github's marketplace 2024-08-31 02:53:39 +02:00
Chl
61b070edf9
Github's marketplace: Description must be less than 125 characters 2024-08-31 02:52:43 +02:00
Chl
e21efb3c3c
readme: compatibility with Github 2024-08-31 02:48:57 +02:00
Chl
8730db6b49
Only trigger the workflow when pushing a branch 2024-08-31 02:41:33 +02:00
Chl
9075262e0e
Github doesn't like the &comp=block
All checks were successful
/ GenerateReleaseZipfile (push) Successful in 1m13s
2024-08-31 02:27:41 +02:00
Chl
dbfd979bf4
Trying some compatibility with Github
All checks were successful
/ GenerateReleaseZipfile (push) Successful in 1m11s
Just for the fun of it (it was kinda interesting but not sure the motivation is
enough in the long run...)
2024-08-31 01:56:44 +02:00
Chl
f430f71f1d
Github don't follow symlinks 2024-08-30 01:30:33 +02:00
Chl
9588309c74
Update the readme 2024-08-30 01:30:23 +02:00
Chl
705e2d717c
Self CI/CD with download of the artifact
All checks were successful
/ GenerateReleaseZipfile (push) Successful in 1m10s
2024-08-29 03:58:30 +02:00
Chl
c2d7e3d9bc
Some minor improvements + starting to use CI/CD on itself
All checks were successful
/ GenerateReleaseZipfile (push) Successful in 1m11s
2024-08-29 02:15:22 +02:00
4 changed files with 264 additions and 20 deletions

View file

@ -0,0 +1,68 @@
on:
push:
branches:
- 'v4'
jobs:
GenerateReleaseZipfile:
runs-on: docker
container:
image: entrepot.xlii.si/actions/alpine-wget-git-zip:latest
steps:
- name: Generate some content
run: |
set -ex
mkdir toto
echo tata > toto/tata.txt
echo titi > toto/titi.txt
echo titi titi > "toto/titi titi.txt"
echo tutu > tutu.txt
echo tutu >> tutu.txt
echo tutuuuuu >> tutu2.txt
echo tutuuuuu >> "tutu tutu.txt"
echo ratata >> 'tutu tutu*.txt'
ls -R
- name: Testing the artifact uploading
id: "uploading"
uses: "${{ github.server_url }}/${{ github.repository }}@${{ github.sha }}"
with:
path: |
toto
tutu*
- name: Is there any output for the previous step ?
run: |
set -x
printf "steps.uploading.outputs.artifact-id: %s\n" "${{ steps.uploading.outputs.artifact-id }}"
printf "steps.uploading.outputs.artifact-url: %s\n" "${{ steps.uploading.outputs.artifact-url }}"
- name: Check the content of the uploaded artifact
run: |
# Stop at first error and be verbose
set -ex
# Create some temporary files/directory
DOWNLOAD_FILE="$( mktemp )"
SHASUM_FILE="$( mktemp )"
TEST_ARTIFACT_DIR="$( mktemp -d )"
# Get the fingerprint of our test
find . -type f -exec sha256sum \{\} \; > "$SHASUM_FILE"
# Little optional checkup
cat "$SHASUM_FILE"
cd "$TEST_ARTIFACT_DIR"
# In case the repository becomes private, we add our GITHUB_TOKEN to the artifact-url.
MY_AUTHENTICATED_URL="$( echo "${{ steps.uploading.outputs.artifact-url }}" | sed "s#^\(https\?://\)#\1$GITHUB_TOKEN\@#" )"
wget -O "$DOWNLOAD_FILE" "$MY_AUTHENTICATED_URL"
# unzip and check
unzip "$DOWNLOAD_FILE"
sha256sum -c "$SHASUM_FILE"
# Cleanup
cd -
rm -f "$DOWNLOAD_FILE"
rm -f "$SHASUM_FILE"
rm -rf "$TEST_ARTIFACT_DIR"

View file

@ -0,0 +1,100 @@
on:
push:
branches:
- 'v4-github'
jobs:
GenerateReleaseZipfile:
runs-on: ubuntu-latest
# Trying to help access to the artifact with the GITHUB_TOKEN at the last step but didn't help.
#permissions: read-all
steps:
- name: Generate some content
run: |
set -ex
mkdir toto
echo tata > toto/tata.txt
echo titi > toto/titi.txt
echo titi titi > "toto/titi titi.txt"
echo tutu > tutu.txt
echo tutu >> tutu.txt
echo tutuuuuu >> tutu2.txt
echo tutuuuuu >> "tutu tutu.txt"
# Github doesn't like special characters.
#echo ratata >> 'tutu tutu*.txt'
ls -R
- name: "Github requires checkout for 'uses: ./' (or we could hard write the repository's URL ?)"
run: |
mkdir myaction && cd myaction
git init
test -z "$GITHUB_TOKEN" && GITHUB_TOKEN="${{ github.token }}"
MY_AUTHENTICATED_URL="$( echo "$GITHUB_SERVER_URL" | sed "s#^\(https\?://\)#\1$GITHUB_TOKEN\@#" )"
git remote add origin "$MY_AUTHENTICATED_URL"/"$GITHUB_REPOSITORY"
# Little and optional speed optimization
git config --local gc.auto 0
git fetch --no-tags --prune --no-recurse-submodules --depth=1 origin "$GITHUB_SHA"
git reset --hard "$GITHUB_SHA"
- name: Testing the artifact uploading
id: "uploading"
uses: ./myaction
# For comparison
#uses: actions/upload-artifact@v4
with:
path: |
toto
tutu*
- name: "Cleanup Github"
run: rm -rvf myaction
- name: Is there any output for the uploading step ?
run: |
set -x
printf "steps.uploading.outputs.artifact-id: %s\n" "${{ steps.uploading.outputs.artifact-id }}"
printf "steps.uploading.outputs.artifact-url: %s\n" "${{ steps.uploading.outputs.artifact-url }}"
- name: Check the content of the uploaded artifact
run: |
# Stop at first error and be verbose
set -ex
# Create some temporary files/directory
DOWNLOAD_FILE="$( mktemp )"
SHASUM_FILE="$( mktemp )"
TEST_ARTIFACT_DIR="$( mktemp -d )"
# Get the fingerprint of our test
find . -type f -exec sha256sum \{\} \; > "$SHASUM_FILE"
# Little optional checkup
cat "$SHASUM_FILE"
cd "$TEST_ARTIFACT_DIR"
# In case the repository becomes private, we add our GITHUB_TOKEN to the artifact-url.
test -z "$GITHUB_TOKEN" && GITHUB_TOKEN="${{ github.token }}"
# TODO : can't get it to work :-/
#wget --header "Authorization: Bearer $GITHUB_TOKEN" -O "$DOWNLOAD_FILE" "${{ steps.uploading.outputs.artifact-url }}"
# Oh boy... We're gone beyond salvation but let's try to explain:
# - the api.github.com accepts the GITHUB_TOKEN in the Authorization
# header (but not the ACTIONS_RUNTIME_TOKEN, nor the GITHUB_TOKEN as
# part of the URL like https://$GITHUB_TOKEN@api.github.com/...)
# - ...but we get redirect to Windows.net/Azure data warehouse which refuses GITHUB_TOKEN...
# -> so, if the api.github.com fails, we try to extract the redirect location and hit it without any header.
# ('beginning to wonder if Github's changing master to main was also a part of a plot to complexify our lives...)
WGET_OUTPUT="$( wget -O "$DOWNLOAD_FILE" \
--header "Authorization: Bearer $GITHUB_TOKEN" \
"https://api.github.com/repos/$GITHUB_REPOSITORY/actions/artifacts/${{ steps.uploading.outputs.artifact-id }}/zip" 2>&1 )" \
|| wget -O "$DOWNLOAD_FILE" \
"$( echo "$WGET_OUTPUT" | sed -n 's/^Location: \(.*\) \[following\]/\1/p' | tail -n 1 )"
# unzip and check
unzip "$DOWNLOAD_FILE"
sha256sum -c "$SHASUM_FILE"
# Cleanup
cd -
rm -f "$DOWNLOAD_FILE"
rm -f "$SHASUM_FILE"
rm -rf "$TEST_ARTIFACT_DIR"

View file

@ -9,13 +9,23 @@ the artifact uploading required a full blown NodeJS container.
## Usage ## Usage
This actions won't copy all the features of the original NodeJS version but This action won't copy all the features of the original NodeJS version but
please report differences on the main ones. please report differences on the main ones.
### Requirements
This action needs the following executables:
* `zip` (unless you zip the artifact yourself)
* `wget` (the full version : unfortunately, as of 2024-08-26, the busybox variant isn't capable of using the PUT method)
### Inputs ### Inputs
```yaml ```yaml
- uses: actions/upload-artifact@v4 # If you can, give the full URL :
# - uses: https://entrepot.xlii.si/actions/upload-artifact-with-wget@v4
- uses: actions/upload-artifact-with-wget@v4
with: with:
# Name of the artifact to upload. # Name of the artifact to upload.
# Optional. Default is 'artifact' # Optional. Default is 'artifact'
@ -24,6 +34,14 @@ please report differences on the main ones.
# A file, directory or wildcard pattern that describes what to upload # A file, directory or wildcard pattern that describes what to upload
# Required. # Required.
path: path:
# If the artifact is already a zipfile, set to false.
# Optional. Default is true.
compression:
# Set the compression level of the zipfile.
# Optional. Default is '6'.
compression-level:
``` ```
### Outputs ### Outputs
@ -31,6 +49,7 @@ please report differences on the main ones.
| Name | Description | Example | | Name | Description | Example |
| - | - | - | | - | - | - |
| `artifact-id` | GitHub ID of an Artifact, can be used by the REST API | `1234` | | `artifact-id` | GitHub ID of an Artifact, can be used by the REST API | `1234` |
| `artifact-url` | URL to download an Artifact. | `https://github.com/example-org/example-repo/actions/runs/1/artifacts/1234` or `https://codeberg.org/forgejo/forgejo/actions/runs/1/artifacts/my-artifact` |
## Examples ## Examples
@ -45,3 +64,21 @@ steps:
name: my-artifact name: my-artifact
path: path/to/artifact/world.txt path: path/to/artifact/world.txt
``` ```
## Miscellaneous
If you seek a similar alternative for checkout, look at https://github.com/marketplace/actions/checkout-action or use the code below :
```yaml
steps:
- name: Simple checkout
run: |
git init
# On Github, the token isn't readily available.
test -z "$GITHUB_TOKEN" && GITHUB_TOKEN="${{ github.token }}"
MY_AUTHENTICATED_URL="$( echo "$GITHUB_SERVER_URL" | sed "s#^\(https\?://\)#\1$GITHUB_TOKEN\@#" )"
git remote add origin "$MY_AUTHENTICATED_URL"/"$GITHUB_REPOSITORY"
# Little and optional speed optimization
git config --local gc.auto 0
git fetch --no-tags --prune --no-recurse-submodules --depth=1 origin "$GITHUB_SHA"
git reset --hard "$GITHUB_SHA"
```

View file

@ -1,13 +1,16 @@
# SPDX-License-Identifier: 0BSD # SPDX-License-Identifier: 0BSD
name: "Upload artifact with wget" name: "Upload an artifact with wget"
author: "Chl <chl@xlii.si>" author: "Chl"
description: | description: |
Upload an artifact for a workflow. Upload an artifact.
This is a far lighter version of upload-artifact, it only need a shell, zip This is a lighter version of upload-artifact, it only needs a shell, zip
and the full version of wget (unfortunately, as of 2024-08-26, the busybox and the full version of wget.
variant isn't capable of using the PUT method).
branding:
icon: archive
color: gray-dark
inputs: inputs:
name: name:
@ -17,7 +20,7 @@ inputs:
description: 'A file, directory or wildcard pattern that describes what to upload' description: 'A file, directory or wildcard pattern that describes what to upload'
required: true required: true
compression: compression:
description: 'Set to false to upload the (already zipped) file directly. (default: true)' description: 'Set to false to upload the (already zipped by yourself) file directly. (default: true)'
default: true default: true
compression-level: compression-level:
description: 'The level of compression for Zlib to be applied to the artifact archive (between 0 and 9).' description: 'The level of compression for Zlib to be applied to the artifact archive (between 0 and 9).'
@ -25,21 +28,38 @@ inputs:
outputs: outputs:
artifact-id: artifact-id:
description: A unique identifier for the artifact that was just uploaded. Empty if the artifact upload failed. description: A unique identifier for the artifact that was just uploaded.
value: ${{ steps.uploading.outputs.artifact-id }}
artifact-url:
description: The URL for the uploaded artifact. Access may require authorization.
value: ${{ steps.uploading.outputs.artifact-url }}
runs: runs:
using: 'composite' using: 'composite'
steps: steps:
# ACTIONS_RUNTIME_TOKEN is not yet available (2024-08) for composite actions on Github :
# https://github.com/actions/runner/issues/3046
# Forgejo tries to download this remote action even if it's not needed :
# uncomment if you want to run this action in Github.
#- name: Expose GitHub Runtime
# if: env.ACTIONS_RUNTIME_TOKEN == ''
# uses: "https://github.com/crazy-max/ghaction-github-runtime@v3"
- name: Upload artifact (using v4) - name: Upload artifact (using v4)
shell: sh shell: sh
# id for reference in the outputs extraction
id: uploading
run: | run: |
# Some optional help for debugging. # Some optional help for debugging.
set -ex set -ex
# Compatibility layer for Github
test -z "$GITHUB_TOKEN" && GITHUB_TOKEN="${{ github.token }}"
# Compress the input paths into a zip archive # Compress the input paths into a zip archive
# (note: busybox' mktemp doesn't have the --suffix option) # (note: busybox' mktemp doesn't have the --suffix option)
MYUPLOAD="$( mktemp -u ).zip" MYUPLOAD="$( mktemp -u ).zip"
if [ "${{ inputs.compression }}" == "true" ]; then if [ "${{ inputs.compression }}" = "true" ]; then
# inputs.path can be a list of files (with wildcards and spaces) and # inputs.path can be a list of files (with wildcards and spaces) and
# the shell's command substitution + field splitting + pathname # the shell's command substitution + field splitting + pathname
# expansion gives a behaviour pretty close to the original Github's # expansion gives a behaviour pretty close to the original Github's
@ -64,36 +84,55 @@ runs:
$( echo "$ACTIONS_RUNTIME_TOKEN" | sed 's/.*\.\(.*\)\..*/\1/' | base64 -d 2>/dev/null | sed 's/.*Actions.Results:\([^:]\+\):\([^:" ]\+\).*/\1 \2/' ) $( echo "$ACTIONS_RUNTIME_TOKEN" | sed 's/.*\.\(.*\)\..*/\1/' | base64 -d 2>/dev/null | sed 's/.*Actions.Results:\([^:]\+\):\([^:" ]\+\).*/\1 \2/' )
EOF EOF
# Github compatibility layer: ACTIONS_RESULTS_URL already ends with a '/'
ACTIONS_RESULTS_URL="$( echo "$ACTIONS_RESULTS_URL" | sed 's/\/$//' )"
# Request an upload URL # Request an upload URL
RESPONSE="$( wget -O - \ RESPONSE="$( wget -O - \
--header 'Content-Type:application/json' \ --header 'Content-Type:application/json' \
--header "Authorization: Bearer $GITHUB_TOKEN" \ --header "Authorization: Bearer $ACTIONS_RUNTIME_TOKEN" \
--post-data "$( printf '{"version":4, "name":"%s", "workflow_run_backend_id":"%s", "workflow_job_run_backend_id":"%s"}' "${{ inputs.name }}" "$WORKFLOW_RUN_BACKEND_ID" "$WORKFLOW_JOB_RUN_BACKEND_ID" )" \ --post-data "$( printf '{"version":4, "name":"%s", "workflow_run_backend_id":"%s", "workflow_job_run_backend_id":"%s"}' "${{ inputs.name }}" "$WORKFLOW_RUN_BACKEND_ID" "$WORKFLOW_JOB_RUN_BACKEND_ID" )" \
"$GITHUB_SERVER_URL"/twirp/github.actions.results.api.v1.ArtifactService/CreateArtifact "$ACTIONS_RESULTS_URL"/twirp/github.actions.results.api.v1.ArtifactService/CreateArtifact
)" )"
# We get a JSON with an signedUploadUrl similar to : # We get a JSON with an signedUploadUrl similar to :
# https://entrepot.xlii.si/twirp/github.actions.results.api.v1.ArtifactService/UploadArtifact?sig=yWWEI8tIIECp8D7E5TVh4_6G2pZxWaVdQcSYaCsx5s0=&expires=2024-08-26+07%3A20%3A49.886890537+%2B0200+CEST&artifactName=mymodule-1.2.3.zip&taskID=63 # https://entrepot.xlii.si/twirp/github.actions.results.api.v1.ArtifactService/UploadArtifact?sig=yWWEI8tIIECp8D7E5TVh4_6G2pZxWaVdQcSYaCsx5s0=&expires=2024-08-26+07%3A20%3A49.886890537+%2B0200+CEST&artifactName=mymodule-1.2.3.zip&taskID=63
SIGNED_UPLOAD_URL="$( echo "$RESPONSE" | sed -n 's/.*"signedUploadUrl" *: *"\([^"]\+\)".*/\1/p' )" SIGNED_UPLOAD_URL="$( echo "$RESPONSE" | sed -n 's/.*"signed_\?[uU]pload_\?[uU]rl" *: *"\([^"]\+\)".*/\1/p' )"
# Upload our file # Upload our file
# (note: adding '&comp=block' at the end of the URL) # (note: adding '&comp=block' at the end of the URL for Forgejo)
# (note 2: if it fails here, it probably means you are using the busybox # (note 2: if it fails here, it probably means you are using the busybox
# variant of wget which can't (as of 2024-08-26) use the PUT method. # variant of wget which can't (as of 2024-08-26) use the PUT method.
# Install the full one beforehand : apt install wget / pkg add wget / ...) # Install the full one beforehand : apt install wget / pkg add wget / ...)
wget --method PUT --body-file "$MYUPLOAD" "$SIGNED_UPLOAD_URL&comp=block" if [ "$GITHUB_SERVER_URL" != "https://github.com" ]; then
SIGNED_UPLOAD_URL="$SIGNED_UPLOAD_URL&comp=block"
fi
wget -O /dev/null \
--method PUT \
--body-file "$MYUPLOAD" \
--header "x-ms-blob-content-type: zip" \
--header "x-ms-blob-type: BlockBlob" \
"$SIGNED_UPLOAD_URL"
# Finalize the artifact # Finalize the artifact
RESPONSE="$( wget -O - \ RESPONSE="$( wget -O - \
--header 'Content-Type:application/json' \ --header 'Content-Type:application/json' \
--header "Authorization: Bearer $GITHUB_TOKEN" \ --header "Authorization: Bearer $ACTIONS_RUNTIME_TOKEN" \
--post-data "$( printf '{"hash":"sha256:%s", "name":"%s", "size":"%d", "workflow_run_backend_id":"%s", "workflow_job_run_backend_id":"%s"}' "$( sha256sum $MYUPLOAD | sed 's/[[:space:]]\+.*//' )" "${{ inputs.name }}" "$( stat -c %s $MYUPLOAD )" "$WORKFLOW_RUN_BACKEND_ID" "$WORKFLOW_JOB_RUN_BACKEND_ID" )" \ --post-data "$( printf '{"hash":"sha256:%s", "name":"%s", "size":"%d", "workflow_run_backend_id":"%s", "workflow_job_run_backend_id":"%s"}' "$( sha256sum $MYUPLOAD | sed 's/[[:space:]]\+.*//' )" "${{ inputs.name }}" "$( stat -c %s $MYUPLOAD )" "$WORKFLOW_RUN_BACKEND_ID" "$WORKFLOW_JOB_RUN_BACKEND_ID" )" \
"$GITHUB_SERVER_URL"/twirp/github.actions.results.api.v1.ArtifactService/FinalizeArtifact "$ACTIONS_RESULTS_URL"/twirp/github.actions.results.api.v1.ArtifactService/FinalizeArtifact
)" )"
# Store the outputs # Store the outputs
echo artifact-id="$( echo "$RESPONSE" | sed -n 's/.*"artifactId" *: *"\([^"]\+\)".*/\1/p' )" >> $GITHUB_OUTPUT ARTIFACT_ID="$( echo "$RESPONSE" | sed -n 's/.*"artifact_\?Id" *: *"\([^"]\+\)".*/\1/ip' )"
echo artifact-id="$ARTIFACT_ID" >> $GITHUB_OUTPUT
if [ "$GITHUB_SERVER_URL" = "https://github.com" ]; then
# note: as an alternative, there is https://api.github.com/repos/OWNER/REPO/actions/artifacts/ARTIFACT_ID
echo artifact-url="$GITHUB_SERVER_URL"/"$GITHUB_REPOSITORY"/actions/runs/"$GITHUB_RUN_ID"/artifacts/"$ARTIFACT_ID" >> $GITHUB_OUTPUT
else
# Gitea & Forgejo : github.run_number instead of github.run_id and name of the artifact instead of artifact_id
echo artifact-url="$GITHUB_SERVER_URL"/"$GITHUB_REPOSITORY"/actions/runs/"$GITHUB_RUN_NUMBER"/artifacts/"$INPUT_NAME" >> $GITHUB_OUTPUT
fi
# Cleanup # Cleanup
if [ "${{ inputs.compression }}" == "true" ]; then if [ "${{ inputs.compression }}" = "true" ]; then
rm -f "$MYUPLOAD" rm -f "$MYUPLOAD"
fi fi