https://github.com/kim-hwiwon/Zola-Pages-Deployer
Build and deploy Zola project to Repository Static Pages (GitLab/GitHub Pages) automatically, whenever pushed to remote repositories
https://github.com/kim-hwiwon/Zola-Pages-Deployer
github-pages gitlab-pages pages zola
Last synced: about 1 year ago
JSON representation
Build and deploy Zola project to Repository Static Pages (GitLab/GitHub Pages) automatically, whenever pushed to remote repositories
- Host: GitHub
- URL: https://github.com/kim-hwiwon/Zola-Pages-Deployer
- Owner: kim-hwiwon
- License: mit
- Created: 2022-07-21T04:37:52.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2022-08-05T07:49:25.000Z (almost 4 years ago)
- Last Synced: 2025-02-18T03:42:59.001Z (over 1 year ago)
- Topics: github-pages, gitlab-pages, pages, zola
- Language: Shell
- Homepage:
- Size: 35.2 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Zola Pages Deployer
Build and deploy [Zola (static site generator)](https://www.getzola.org/) project to
[Repository Static Pages (*GitLab*/*GitHub* Pages)](#pages-deployment) automatically,
whenever pushed to remote repositories (*GitLab*/*GitHub*)
## Abstract
- Workflow on push to *GitLab*/*GitHub*
1. Build Zola project to a static site
2. [Optimize](#optimizer-pass) built output above
- Optimize Zola built result with optimizer passes
- Built-in optimizer
- `10_minify`: Minify text files (e.g. `.html`, `.js`, `.css`)
- `20_gzip_compression`: Perform static gzip compression on text files
- Add other optimizer scripts in addition to built-in ones
3. [Deploy](#pages-deployment) optimized output above to
[*GitLab* Pages](https://docs.gitlab.com/ee/user/project/pages/) /
[*GitHub* Pages](https://pages.github.com/)
- Supports [Pages Export on deploy](#pages-export)
(deploying built pages to an external repository),
not only to pushed repository
- Use cases
- Build Zola & deploy Pages automatically on push
- Push to *GitLab*/*GitHub*, then *GitLab*/*GitHub* Pages site is deployed
(for *GitHub*, [configuration](#pages-deployment) is required)
- Build Zola in a repository A, but export & deploy the Pages outputs to another repository B
- It is possible to push & build source in a private repository A,
but deploy the outputs in public repository B
## Quick Start
1. Git clone from this repository.
- From *GitLab*
```shell
git clone -b v1.0.2 --single-branch https://gitlab.com/snoopy3476/zola-pages-deployer
cd zola-pages-deployer
git switch -c main
```
- From *GitHub*
```shell
git clone -b v1.0.2 --single-branch https://github.com/snoopy3476/zola-pages-deployer
cd zola-pages-deployer
git switch -c main
```
2. Remove the sample zola project directory.
('`~_sample_zola_project-remove_this_before_use`')
```shell
git rm -rf ./~_sample_zola_project-remove_this_before_use
```
3. Put a single Zola project directory in the Zola Pages Deployer directory.
(NOTE: directory name '`optimizer`', '`public`', and '`static`' are reserved
and must not be used for inner Zola project directory!)
4. Build
- Build on remote repositories automatically
- Push to *GitLab*/*GitHub*, then Zola project is built automatically on remote
- Built output is also deployed to Pages if pushed to ***default branch***
- Build locally
- Install prerequisites
- [`podman`](https://podman.io/) or [`docker`](https://www.docker.com/)
- Use following scripts:
- `./build.sh [zola-dir]`:
Build Zola project,
then put the result output inside the subdirectory '`public`'
- `./img-build.sh [zola-dir]`:
Build Zola project,
then put the result output inside the webserver OCI container image (`thttpd`)
so that it can be served via container
- `./test-img.sh [zola-dir]`:
Build Zola project inside webserver image (`thttpd`),
then run the Zola container created from the image.
Note that output image and container is removed after exit
## Features
> Following features are provided in addition to just building a Zola site.
### Optimizer Pass
> After Zola build, optimizing the built result is done with optimizer passes
(which are in the directory '`optimizer`').
- Optimizer pass files should have execute permission (e.g. `$ chmod +x opt_pass_file`)
- Optimizer passes inside the directory '`optimizer`' are run in ascending order of their filenames
- E.g. `00_first_script` > `10_second_script` > `20_third_script` > ...
- Each optimizer runs at a temporary directory somewhere else,
which has two subdirectories: '`input`' and '`output`'
- All optimizers read files to optimize from '`input`' directory,
do optimize them,
then put the result files inside '`output`' directory
- Examples of optimizer files
- Just pass input as output, without any modification:
```shell
#!/bin/sh
cp -af ./input/. ./output
```
- Add gzip compressed results `(orig_filename).gz` for each input file:
```shell
#!/bin/sh
cp -af ./input/. ./output && gzip -krf9 ./output
```
- Place user-defined optimizers inside the directory '`optimizer`' to add custom passes in addition to built-in ones
### Pages Deployment
> When this project is pushed to a remote repository,
Zola project is built into Pages automatically with *GitLab* CI / *GitHub* Actions.
- Behaviors of the feature
- On push to *GitLab*/*GitHub*, according to the pushed branch
- ***Default branch***:
1. First build Zola
2. Then deploy to *GitLab*/*GitHub* Pages
- Other branches:
1. Build Zola only
- [When ***`Pages Export`*** is enabled](#pages-export)
- Required configuration for *`GitHub Pages`*
- After first push and Pages branch creation,
[Configure *GitHub* Pages](https://docs.github.com/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site)
on the repository to server pages
- Set source branch to: *`pages`* (or your custom Pages branch in other name)
- Set directory to: '`/docs`'
- (Cf. No additional configuration is needed for *`GitLab Pages`*,
just push to *GitLab* and it is deployed)
#### Pages Export
> Export & deploy built result site outputs
to an *external repository*, not deploying to the pushed repository itself.
- Behavior according to whether [environment variables for Pages Export](#environment-variables-for-pages-export) is configured
- Not configured:
1. Build & Deploy on pushed repository
- Configured:
1. First build on pushed repository
2. Then deploy on a ***different repository*** other than the pushed one
## Environment Variables
> Set following environment variables to control build and deploy process on *GitLab*/*GitHub*.
- Environment variables can be set by:
- *GitLab*: Adding as variables in `Project Settings` > `CI/CD` > `Variables`
- *GitHub*: Adding as secrets in `Repository Settings` > `Security` > `Secrets` > `Actions`
- Local run: Setting as environment variables (e.g. `$ ENV1=ENVVAR1 ENV2=ENVVAR2 ./build.sh`)
### Environment Variables for Build
> These environment variables take effect on build stage on *GitLab*/*GitHub*, or local manual run.
- For Zola
- `ZOLA_VER`: Version of Zola
(e.g. `0.16.0`)
- Default value: `latest`
- `ZOLA_BASE_URL`: `base_url` for Zola to override default in comfig.toml
- For webserver image
> (Only for local `img-build.sh`, `test-img.sh` run. Currently not used on *GitLab*/*GitHub*)
- `CACHE_MAX_AGE`: Default http cache-control max-age value in seconds (for thttpd).
This value can be overwritten on each container run
by setting this environment variable.
- Default value: `600`
- For test run
> (Only for local `test-img.sh` run. Currently not used on *GitLab*/*GitHub*)
- `EXTERNAL_PORT`: external port to get http request on test run.
- Default value: `8000`
### Environment Variables for Pages Export
> These environment variables set *path* and *authentication* information
> of an external target repository for [Pages Export](#pages-export).
>
> NOTE: If Zola output site is to be served on the repository where it is pushed,
these environment variables should NOT be set.
>
> Repository address format using following variables:
> - `REPO_PROTOCOL`://`REPO_ID`:`REPO_PW`@`REPO_HOST`/`REPO`
> - Examples
> - `https://(some_GITHUB_TOKEN)@github.com/snoopy3476/Zola-Pages-Deployer`
> - `ssh://git@github.com/snoopy3476/Zola-Pages-Deployer`
> - Same with: `git@github.com:snoopy3476/Zola-Pages-Deployer`
- Repository path
- `REPO_PROTOCOL`: Protocol
(e.g. `ssh`, `https`)
- Default value: `ssh`
- `REPO_HOST`: Host name of the target repository server to push pages
(e.g. `gitlab.com`, `github.com`, IP of any local hosted server)
- Default value: Current running server
- `REPO`: Repository name in the target repository server to push pages
(e.g. `username/reponame`)
- Default value: Current repository path
- `REPO_BRANCH`: Branch name of the repository to push pages
(e.g. `pages`, `gh-pages`)
- Default value: `pages`
- Repository authentication
> If authentication error occurs after setting *repository path* variables above,
> set appropriate authentication info to one or more of following variables
- `REPO_ID`: ID of the target repository server to push pages
(e.g. `git`, server_token)
- Default value:
- `git` (in general cases)
- [**GITHUB_TOKEN**](https://docs.github.com/actions/security-guides/automatic-token-authentication) (only on *GitHub* server, and `REPO_PROTOCOL` is `https`)
- If you use
[*GitHub* personal access token (PAT)](https://docs.github.com/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)
to export, set a PAT value to this variable
- `REPO_PW`: Password of the target repository server to push pages
(WARNING: Using this variable is not recommended in general!)
- `REPO_KEY`: SSH private key of the target repository to push pages.
Used only when `REPO_PROTOCOL` is `ssh`.
- Using *repository deploy key*
(
[GitLab Deploy Keys](https://docs.gitlab.com/ee/user/project/deploy_keys/)
/
[GitHub Deploy Keys](https://docs.github.com/developers/overview/managing-deploy-keys#deploy-keys)
)
is recommended, not your account SSH key directly
1. Create a new pair of temporary RSA key in local shell
(e.g. `$ ssh-keygen -m pem -t rsa -b 4096 -N '' -f ./tmpkey`)
2. Copy the contents of output ***private*** key,
and set it to this `REPO_KEY` variable
3. Copy the contents of output ***public*** key,
and add it as a new deploy key of the target repository
(that you want to deploy Pages).
Check `Allow write access` when creating the new deploy key
4. Remove local temporary keys created before
(e.g. `$ rm ./tmpkey ./tmpkey.pub`)
- RSA key (starting with `-----BEGIN RSA PRIVATE KEY-----`) is recommended,
as SSH in *GitHub* runner does not seems to handle
newer, non-RSA algorithms well (e.g. ed25519)
## Author
Kim Hwiwon \
## License
The MIT License (MIT)