diff --git a/.forgejo/workflows/package.yml b/.forgejo/workflows/package.yml index 2277a88..f6325b8 100644 --- a/.forgejo/workflows/package.yml +++ b/.forgejo/workflows/package.yml @@ -1,45 +1,94 @@ -name: Build Plugin Zip +# Building and releasing Wordpress plugins is pretty simple +# It's just zipping up some PHP. This doesn't contain any unit tests +# this is just zipping and shipping. +# +# Generally speaking your directory structure would be: +# . +# ├── README.md +# └── src +# └── wordpress-plugin.php +# +# With the repository name being the name of your plugin to make it easier +# to Google for. Up to you though; you can configure the source dir below. +# +# When you tag a commit and the tag stats with 'v', this workflow will +# zip and ship the Wordpress plugin to the 'releases' tab of Github or Forgejo + +name: Build & Release WordPress Plugin on: push: - branches: - - main - workflow_dispatch: # Manual trigger + tags: + - 'v*' jobs: - build-zip: + build: runs-on: docker + container: debian:12 + + env: + SOURCE_DIR: "src" + steps: + + - name: Prepare Build Environment + run: | + apt update && apt -y install zip unzip nodejs curl jq + - name: Checkout repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 - - name: Get repo name - id: repo_name - run: echo "REPO_NAME=$(basename $(git rev-parse --show-toplevel))" >> $GITHUB_ENV - - - name: Prepare zip folder + - name: Package plugin run: | - rm -rf /tmp/$REPO_NAME - mkdir -p /tmp/$REPO_NAME - cp -r ./src/* /tmp/$REPO_NAME/ + # Set plugin name like this because it's easier than inline + PLUGIN_NAME=$(echo $GITHUB_REPOSITORY | awk -F'/' '{ print $2 }') - - name: Create zip archive + # Create a build directory to ensure that we're correctly creating + # a single child directory in the zip. + mkdir -p build + cp -r ${SOURCE_DIR} "build/${PLUGIN_NAME}" + + # Zip it up for shipping + cd build + zip -r "../${PLUGIN_NAME}.zip" "${PLUGIN_NAME}" + cd - + unzip -l "${PLUGIN_NAME}.zip" + + - name: Create Release if not exists run: | - apt update && apt -y install zip - cd /tmp - zip -r $REPO_NAME.zip $REPO_NAME + # Curl request that uses the repos token & Forgejo's built-in variables + # to create a new release based on the tag that you have pushed + # + # It doesn't care if the release exists or not. + curl -X POST "${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/releases" \ + -H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \ + -H "Content-Type: application/json" \ + -d '{ + "tag_name": "'"${GITHUB_REF##*/}"'", + "target_commitish": "main", + "name": "'"${GITHUB_REF##*/}"'", + "body": "Auto release", + "draft": false, + "prerelease": false + }' || true + + - name: Upload Plugin Zip to Release + run: | + # Set some variables because it's cleaner than in-line + TAG_NAME="${GITHUB_REF##*/}" + REPO_NAME="$(basename $GITHUB_REPOSITORY)" + PLUGIN_NAME=$(echo $GITHUB_REPOSITORY | awk -F'/' '{ print $2 }') - - name: Upload zip artifact - uses: actions/upload-artifact@v3 - with: - name: ${{ env.REPO_NAME }}-plugin-zip - path: /tmp/${{ env.REPO_NAME }}.zip + # Get the release ID created in the last step + RELEASE_ID=$(curl -s \ + -H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \ + "${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/releases/tags/${TAG_NAME}" \ + | jq -r '.id') + + # Pushes he zip file to be shown in the "Releases" tab under this release. + curl -X POST "${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/releases/${RELEASE_ID}/assets" \ + -H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \ + -F "name=${PLUGIN_NAME}.zip" \ + -F "attachment=@${PLUGIN_NAME}.zip" - - name: Upload Release Asset - uses: actions/upload-release-asset@v1 - with: - upload_url: ${{ github.event.release.upload_url }} - asset_path: build/${{ env.REPO_NAME }}.zip - asset_name: ${{ env.REPO_NAME }}.zip - asset_content_type: application/zip