diff --git a/.forgejo/workflows/cleanup.yaml b/.forgejo/workflows/cleanup.yaml new file mode 100644 index 0000000..69921a7 --- /dev/null +++ b/.forgejo/workflows/cleanup.yaml @@ -0,0 +1,33 @@ +on: + pull_request: + types: [ closed, merged ] + +jobs: + cleanup: + runs-on: x86_64 + container: + image: alpine:latest + steps: + - name: Environment setup + run: | + apk add git nodejs jq coreutils curl tree gawk grep + - name: Public repo pull + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.PAGES_TOKEN }} + ref: public + - name: Render website + run: | + export GITHUB_PR_NAME=$(grep -l ${{ github.sha }} previews/*/git_sha.txt | awk -F '/' '{print $2}') + echo $GITHUB_PR_NAME >> $GITHUB_ENV + rm -rf previews/$GITHUB_PR_NAME || true + cd previews + tree -d -H '.' -L 1 --noreport --charset utf-8 -T "Versions" -o index.html + - name: Website upload + run: | + git config user.name "forgejo-actions[bot]" + git config user.email "dev@ayakael.net" + git add . + git commit -m "Clean-up $GITHUB_PR_NAME" + git push diff --git a/.forgejo/workflows/deploy.yaml b/.forgejo/workflows/deploy.yaml new file mode 100644 index 0000000..c82b4db --- /dev/null +++ b/.forgejo/workflows/deploy.yaml @@ -0,0 +1,27 @@ +on: + push: + branches: + - 'public' + +jobs: + deploy: + runs-on: x86_64 + container: alpine:latest + env: + GIT_SSH_COMMAND: ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no + steps: + - name: Environment setup + run: | + apk add git nodejs openssh-client-common openssh-client-default + - name: Start ssh-agent + uses: https://github.com/webfactory/ssh-agent@v0.9.0 + with: + ssh-private-key: ${{ secrets.PAGES_PRIVKEY }} + - name: Repo pull + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Website upload + run: | + git remote set-url origin ${{ vars.PAGES_TARGET }} + git push -f diff --git a/.forgejo/workflows/pages.yaml b/.forgejo/workflows/pages.yaml new file mode 100644 index 0000000..de37353 --- /dev/null +++ b/.forgejo/workflows/pages.yaml @@ -0,0 +1,42 @@ +on: + push: + branches: + - 'main' + +jobs: + render: + runs-on: x86_64 + container: + image: alpine:latest + steps: + - name: Environment setup + run: | + apk add git ikiwiki po4a perl-yaml-tiny tree nodejs + - name: Repo pull + uses: actions/checkout@v4 + with: + fetch-depth: 1 + token: ${{ secrets.PAGES_TOKEN }} + - name: Public repo pull + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: public + path: public + token: ${{ secrets.PAGES_TOKEN }} + - name: Render website + run: ikiwiki --setup ikiwiki.setup + - name: Website upload + run: | + rm -Rf public/.forgejo + mkdir -p public/.forgejo/workflows + cp .forgejo/workflows/deploy.yaml public/.forgejo/workflows/. + git log -1 --pretty=%B > commit.txt + cd public + date > generated.txt + # Note: the following account information will not work on GHES + git config user.name "forgejo-actions[bot]" + git config user.email "dev@ayakael.net" + git add . + git commit -F ../commit.txt + git push diff --git a/.forgejo/workflows/preview.yaml b/.forgejo/workflows/preview.yaml new file mode 100644 index 0000000..3ad603e --- /dev/null +++ b/.forgejo/workflows/preview.yaml @@ -0,0 +1,49 @@ +on: + pull_request: + types: [ assigned, opened, synchronize, reopened ] + +jobs: + preview: + runs-on: x86_64 + container: + image: alpine:latest + steps: + - name: Environment setup + run: | + apk add git ikiwiki po4a perl-yaml-tiny tree nodejs jq coreutils curl + echo "GITHUB_PR_NAME=$(curl -Ls ${{ github.server_url }}/api/v1/repos/${{ github.repository }}/pulls/${{ github.ref_name }} | jq .title | tr ' ' '-' | tr -d ':' | tr -d '"' | tr '[:upper:]' '[:lower:]' | tr '/' '-')" >> $GITHUB_ENV + - name: Repo pull + uses: actions/checkout@v4 + with: + fetch-depth: 1 + token: ${{ secrets.PAGES_TOKEN }} + - name: Public repo pull + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: public + path: public + token: ${{ secrets.PAGES_TOKEN }} + - name: Render website + run: | + rm -rf public/previews/$GITHUB_PR_NAME || true + mkdir -p public/previews/$GITHUB_PR_NAME + sed -i "s|destdir.*|destdir: ./public/previews/$GITHUB_PR_NAME|" ikiwiki.setup + ikiwiki --setup ikiwiki.setup + cd public/previews + tree -d -H '.' -L 1 --noreport --charset utf-8 -T "Versions" -o index.html + - name: Website upload + run: | + rm -Rf public/.forgejo + mkdir -p public/.forgejo/workflows + cp .forgejo/workflows/deploy.yaml public/.forgejo/workflows/. + git log -1 --pretty=%B > commit.txt + cd public + date > previews/$GITHUB_PR_NAME/generated.txt + echo ${{ github.sha }} > previews/$GITHUB_PR_NAME/git_sha.txt + # Note: the following account information will not work on GHES + git config user.name "forgejo-actions[bot]" + git config user.email "dev@ayakael.net" + git add . + git commit -F ../commit.txt + git push diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 5c13bdb..0000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,75 +0,0 @@ -workflow: - rules: # disable tag pipelines and duplicate MR pipelines - - if: $CI_COMMIT_BRANCH - -variables: - MAIN_BRANCH_PATH: "." - EPHEMERAL_BRANCHES_PATH: preview # subpath to ephemeral branches content for preview - -pages: - stage: build - cache: - key: gitlab-pages - paths: [public] - before_script: - - sudo apk add git ikiwiki po4a perl-yaml-tiny tree - # CURRENT_CONTENT_PATH is defined in rules, different between main branch and ephemeral branches - - mkdir -p public/$CURRENT_CONTENT_PATH && ls public/$CURRENT_CONTENT_PATH/.. - - | # create ephermetal branched path if not existent - if [ ! -d "public/$EPHEMERAL_BRANCHES_PATH" ]; then - mkdir -p public/$EPHEMERAL_BRANCHES_PATH - fi - - | # avoid deleting main branch content when cache has been erased - if [ "$CI_COMMIT_BRANCH" != "$CI_DEFAULT_BRANCH" ] && [ ! -f public/$MAIN_BRANCH_PATH/index.html ]; then - echo -e "💥\e[91;1m Unable to retrieve $CI_DEFAULT_BRANCH generated files from cache ; please regenerate $CI_DEFAULT_BRANCH files first\e[0m" - exit 1 - fi - - rm -rf public/$CURRENT_CONTENT_PATH || true # remove last version of current branch - script: - - | # sed needs to be in its own section - sed -i "s|destdir.*|destdir: ./public/$CURRENT_CONTENT_PATH|" ikiwiki.setup - - ikiwiki --setup ikiwiki.setup - - | # create symbolic link to index.en.html if public/index.html does not exist - if [ ! -L "public/$CURRENT_CONTENT_PATH/index.html" ]; then - ln -s index.en.html public/$CURRENT_CONTENT_PATH/index.html - fi - - cd public/$EPHEMERAL_BRANCHES_PATH - - tree -d -H '.' -L 1 --noreport --charset utf-8 -T "Versions" -o index.html # generate a root HTML listing all previews for easier access - environment: - name: pages/$CI_COMMIT_BRANCH - action: start - url: $CI_PAGES_URL/$CURRENT_CONTENT_PATH - on_stop: pages-clean-preview - rules: - # 'main branch' is exposed at GitLab Pages root - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - variables: - CURRENT_CONTENT_PATH: $MAIN_BRANCH_PATH - # other (short-lived) branches generation are exposed in 'EPHEMERAL_BRANCHES_PATH/branch-name-sanitized' sub path - - variables: - CURRENT_CONTENT_PATH: $EPHEMERAL_BRANCHES_PATH/$CI_COMMIT_REF_SLUG - artifacts: - paths: [public] - expire_in: 1h - tags: - - knit - -pages-clean-preview: - stage: build - cache: - key: gitlab-pages - paths: [public] - variables: - GIT_STRATEGY: none # git files not available after branch deletion - FOLDER_TO_DELETE: $EPHEMERAL_BRANCHES_PATH/$CI_COMMIT_REF_SLUG # an indirection to allow arbitrary deletion when launching this job - script: - - rm -rf public/$FOLDER_TO_DELETE - environment: - name: pages/$CI_COMMIT_BRANCH - action: stop - rules: - - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH - when: manual - allow_failure: true - tags: - - knit diff --git a/README.md b/README.md index 4e3515b..d969bd4 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,35 @@ # ilot.io -Upstream: https://lab.ilot.io/ilot/ilot.io +Upstream: https://forge.ilot.io/ilot/ilot.io -![Build Status](https://lab.ilot.io/ilot/ilot.io/badges/main/pipeline.svg) +![Build Status](https://forge.ilot.io/ilot/ilot.io/badges/workflows/pages.yaml/badge.svg) +![Push Status](https://forge.ilot.io/ilot/ilot.io/badges/workflows/deploy.yaml/badge.svg) -## Description +## Forgejo Actions -This repository contains the source code to the [ilot.io](https://ilot.io) -website. +This project's static Pages are built by Forgejo Actions, following the steps +defined in [`.forgejo/workflows/pages.yaml`](.forgejo/workflows/pages.yaml). +That builds this website using ikiwiki, and pushes the build artifacts to the +`public` branch. -## GitLab CI +The `public` branch has its own workflow following steps defined in +[`forgejo/workflows/deploy.yaml`](.forgejo/workflows/deploy.yaml) +that uploads the artifacts to a remote HTTP server for deployment in +production. This workflow is automatically updated from `main` so that `public` +should never be manually modified. -This project's static Pages are built by [GitLab CI][ci], following the steps -defined in [`.gitlab-ci.yml`](.gitlab-ci.yml): +The deployment is done by a simple remote git push via SSH to a non-bare repo +where `git config receive.denyCurrentBranch` is set as `updateInstead`. This +allows this repo to be checked out as `public`, allowing it to be a root for +your favorite HTTP server. -We are using a theme based on -[Bootstrap 3](https://lab.ilot.io/ilot/ikiwiki-bootstrap-ilot) using submodules. +The following secrets are expected to be set for operation: +* PAGES_PRIVKEY: SSH private key that is used to push to the HTTP server's git +repo +* PAGES_TOKEN: Forgejo application token used to push to `public` branch. + +The following variables are expected to be set for operation: +* PAGES_TARGET: SSH target for HTTP server's git repo, following this format: +user@example.net:/path/to/http/repo ## Building locally @@ -25,9 +40,9 @@ To work locally with this project, you'll have to follow the steps below: * [mac][] * [linux][] * [source][] -1. Clone the submodules: `git submodule init && git submodule update` 1. Generate the website: `ikiwiki --setup ikiwiki.setup` 1. Start http-server: `./test-server.sh` +1. Preview your project: open 127.0.0.1:8080 in your browser Read more at ikiwiki's [documentation][]. @@ -37,7 +52,7 @@ Read more at ikiwiki's [documentation][]. 2. Checkout the forked repository. - - `git clone ssh://git@lab.ilot.io/$USER/ilot.io` + - `git clone ssh://git@forge.ilot.io/$USER/ilot.io` - `cd ilot.io` 3. Make your changes. @@ -60,11 +75,8 @@ Read more at ikiwiki's [documentation][]. 8. Once the tests in the merge-request pass, and reviewers are happy, your changes will be merged. -[ci]: https://about.gitlab.com/gitlab-ci/ [ikiwiki]: https://ikiwiki.info/ [source]: https://ikiwiki.info/install/ [linux]: https://ikiwiki.info/setup/ [mac]: https://ikiwiki.info/tips/ikiwiki_on_mac_os_x/ [documentation]: https://ikiwiki.info/ -[userpages]: https://docs.gitlab.com/ce/user/project/pages/introduction.html#user-or-group-pages -[projpages]: https://docs.gitlab.com/ce/user/project/pages/introduction.html#project-pages