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 - + + -## 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 diff --git a/content/footer.fr.mo b/content/footer.fr.mo index 0c1e671..9e346d8 100644 Binary files a/content/footer.fr.mo and b/content/footer.fr.mo differ diff --git a/content/footer.fr.po b/content/footer.fr.po index 0c5c449..1dba242 100644 --- a/content/footer.fr.po +++ b/content/footer.fr.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ilot.io\n" -"POT-Creation-Date: 2024-06-20 21:11-0400\n" -"PO-Revision-Date: 2024-06-20 21:35-0400\n" +"POT-Creation-Date: 2024-08-29 21:32-0400\n" +"PO-Revision-Date: 2024-08-29 21:33-0400\n" "Last-Translator: \n" "Language-Team: dev@ayakael.net\n" "Language: fr\n" @@ -21,12 +21,8 @@ msgstr "" msgid "" " Copyleft © 2024-2024 ilot [[CC-BY-SA|meta/" "license]] Powered by " -"[[ikiwiki|http://ikiwiki.info/]]. [[Theme|https://gitlab.com/anarcat/" -"ikiwiki-bootstrap-anarcat]] by [[anarcat|https://anarc.at/" -"blog/2015-09-09-bootstrap]]. " +"[[ikiwiki|http://ikiwiki.info/]]. " msgstr "" " Copyleft © 2024-2024 ilot [[CC-BY-SA|meta/" "license]] Propulsé par " -"[[ikiwiki|http://ikiwiki.info/]]. [[Thème|https://gitlab.com/anarcat/" -"ikiwiki-bootstrap-anarcat]] par [[anarcat|https://anarc.at/" -"blog/2015-09-09-bootstrap]]. " +"[[ikiwiki|http://ikiwiki.info/]]. " diff --git a/content/footer.html b/content/footer.html index 998da51..1c07de6 100644 --- a/content/footer.html +++ b/content/footer.html @@ -4,6 +4,5 @@ Powered by [[ikiwiki|http://ikiwiki.info/]]. - [[Theme|https://gitlab.com/anarcat/ikiwiki-bootstrap-anarcat]] by [[anarcat|https://anarc.at/blog/2015-09-09-bootstrap]].
diff --git a/content/footer.pot b/content/footer.pot index 6060afc..ec14c7d 100644 --- a/content/footer.pot +++ b/content/footer.pot @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2024-06-20 23:55-0400\n" +"POT-Creation-Date: 2024-08-29 21:32-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME