This repository contains the source for the GitHub generated GeoServer home page.
If you stumble into any issue with the GeoServer web site please report it in our Jira issue tracker using the website component.
The site is built with Jekyll:
#. Before you start:
gem install bundler
Install from Gemfile list:
bundle install
On macOS with apple silicon:
bundle update ffi
#. Jekyll can be run in "watch" mode for development:
bundle exec jekyll serve --watch
The site contents will be served at http://localhost:4000.
See TEST.md for more details.
#. Commit to main branch and the result is published to https://geoserver.org
Blog posts are managed as part of the website.
To create a new blog post:
-
Create a new markdown page in
_postsfollowing the filename convention for sort order:_posts/2021-05-04-may-the-fork-be-with-you.md -
The post is published using the metadata included at the top of your file.
--- author: Andrea Aime date: 2021-05-04 layout: post title: May the fork be with you! categories: - Developer notes --- -
Popular categories include:
Developer notesAnnouncements-- used for project team and release announcementsTips and TricksTutorialsUser perspectives
When a release is performed, the site contents are updated to reflect the new release. Below is the process of updating site contents for a stable release.
-
Manually (in the GUI) search JIRA for issues with
level = Vulnerabilitythat are hidden from the JQL API:If there is a fix version which includes the current release, but is scheduled for a later release, then include the
--securitycommand line argument, which will simply add a generic placeholder textSample JQL:
(level = Vulnerability AND fixVersion = 2.26.4 AND Disclosure > 2.26.4) -
Write a blog post announcing the new release:
cd bin python3 announcement.py username password 2.23.2 --geotools 29.2 --geowebcache 1.23.2 [--security]usernameandpasswordare your JIRA credentials.A post is generated to stdout for your review.
If everything looks good generate a post using (the date for the generated post is supplied by Jira):
python3 announcement.py username password 2.23.2 --geotools 29.2 --geowebcache 1.23.2 --postSecurity Vulnerability Options:
- Use
--securityto force a security section (automatically added if vulnerabilities are detected) - Use
--urgency normal|important|urgentto set security urgency level (default: important) - Use
--concurrent "2.25.3,2.26.1"to mention concurrent security releases - Use
--disclosure 2.27.0to generate updates for prior blog posts when vulnerabilities are disclosed
See script instructions for more information,
python3 announcement.py --helpfor more options.note: At the start of a new series (when making a milestone or release candidate) a new
bin/templates/about22?.mdtemplate will be required for the script to work. - Use
-
Release posts have the following format
--- author: Jody Garnett date: 2024-09-18 layout: post title: GeoServer 2.26.0 Release categories: - Announcements - Vulnerability tags: - Release release: release_226 version: 2.26.0 jira_version: 16916 doi:13827176 ---The following information is used to generate a
release/<version>/index.htmlpage:-
release: This is the_layoutused for the generated release page -
Tags are used to indicate
Release,Release Candidate,Milestone.The
Vulnerabilitytag is used to highlight blog posts and release announcements covering a security topic. -
version: The GeoServer version being announced -
jira_version: Used to track the latest release for each branch displayed on the home page.The value for
jira_versioncan be found by navigating to that version on Jira and examining the URL. For example, for example,2.7.2links tohttps://osgeo-org.atlassian.net/projects/GEOS/versions/10601, giving ajira_versionof10601. For a maintenance or development release, instead modifyrelease/maintain/index.htmlorrelease/dev/index.htmlrespectively. -
doi: Is generated by zendo processing the tag and can be found on zendo
-
-
Check one of the previous blog posts so we end up with a consistent format.
- GeoTools and GeoWebCache version numbers will need to be supplied on the command line
- Check the "about section" at end of post with links to documentation / proposals / presentations
-
Update
_config.yml(this change will be reflected inindex.htmlanddownload/index.html):-
Update
stable_nightlyto be the same as the next release, this is used for the Nightly build page.stable_nightly: 16821 -
For a maintenance instead change
maintain_nightly.maintain_nightly: 16819
-
When publishing the first milestone, beta or release candidate for a series:
-
Check
_layout/release_main.htmlfor any extensions that need to be added (or removed) for the new release. -
Create a new
_layouts/release_<version>.htmltemplate by copying the_layout/release_main.htmltemplate.This is the value used for
releasewhen making your announcement blog posts.Create
bin/templates/about_XXX.mdhighlighting new features, GSIP proposals, key presentations. -
Update
_config.ymlupdatedev_branchanddev_nightlythe matching release announcement post will be used to generaterelease/dev/index.htmlpage.dev_branch: 2.27.x dev_nightly: 16884When
dev_branchis notmainthe build process scan for the latest development release for public testing. -
Update the
main_series, andmain_nightlyto reflect the new version number formainbranch, this will be used to generate a placeholder forrelease/main/index.htmlpage.main_series 2.28.x main_nightly: 16829As the main branch always has the same name
main_seriesis used to provide the name to use for generating links.
When creating the final release:
-
Update the
_config.ymlproperties:- Update the
maintain_branchusing the values fromstable. - Update the
stable_branch.
- Update the
-
Update the
main_seriesandmain_nightlyinformation. For example, when starting the series2.22.x:main_series: 2.29.x main_nightly: 16829As the main branch always has the same name
main_seriesis used to provide the name to use for generating links. -
Restore
dev_branchproperty in_config.ymltomain.dev_branch: main dev_nightly: 16829When
dev_branchismainthe build process will no longer match any posts as the development period is over.
The announcement script includes enhanced support for security vulnerability disclosure management (GEOS-11928).
The script automatically detects and categorizes vulnerabilities:
- Disclosed vulnerabilities - Issues scheduled for public disclosure (Disclosure field set with released version)
- Undisclosed vulnerabilities - Issues not yet scheduled for disclosure or with future disclosure dates
- Legacy vulnerabilities - Issues using the component-based approach (component = "Vulnerability")
Security releases can be marked with different urgency levels using the --urgency option:
normal- Standard security updateimportant- Recommended security update (default)urgent- Critical security update requiring immediate attention
When vulnerabilities are publicly disclosed, the --disclosure option generates update instructions for prior release announcements:
python3 announcement.py username password 2.26.4 --disclosure 2.27.0
This produces:
- List of vulnerabilities scheduled for disclosure in version 2.27.0
- Identification of earlier blog posts that need security sections added
- Ready-to-use markdown text for updating prior announcements
Security vulnerabilities with level = "Vulnerability" have restricted visibility in JIRA and won't appear in standard queries until scheduled for disclosure. This is intentional security-by-design behavior. The announcement script handles this by:
- Using the Disclosure field (customfield_11057) to detect scheduled disclosures
- Supporting backward compatibility with component-based detection
- Providing appropriate messaging when no vulnerabilities are detected
The Jekyll build process goes through several steps:
-
The file
_config.ymlis parsed into Jekyll::Sitesite.data
-
Makes an inventory of existing content:
-
site.pagescontains instances of Jekyll::Page for each page (and post) defined. -
site.static_filescontains Jekyll::StaticFile
-
-
Our custom plugin
_plugins/release.rbgenerator is run:- Processes the posts in
site.pages, add additional Jekyll::PageWithoutAFile entries tosite.pages - Creates a
site.data.releasesdata structure listing all the releases found for use by thedownload/index.htmlpage.
- Processes the posts in
-
Additional plugins are run:
- jekyll-feed: generates an Atom feed of all the posts
- jekyll-sitemap: generates a sitemap of all the pages
- jekyll-paginate: uses
_blog/index.htmlas a template to generatepage2.html,page3.html, ...page80.html
-
At this point all the
site.pagesare created each containing:page.titlepage.contentpage.urlpage.datepage.idpage.dirpage.namepage.dataprovided by front-matter at the top of the file
Release pages have:
page.data.versionpage.data.jira_versionpage.data.release_datepage.data.announce
-
Jekyll process any pages with Liquid into static files in the
_sitefolder.-
Variable reference use
{{and}}:Download the latest [GeoServer {{site.stable_version}}](/release/stable/index.html) release. -
Variable filters use
|pipe character to define a processing chain:Released {{ page.date | date_to_long_string }}. -
Tags used to define control flow:
{% for release in site.data.releases | where: "series", "2.19" %} {{ release.version }} {% endfor %}
Here is a decent cheatsheet for reference.
-
Commit to main and the result is published.
Technical details:
-
Commit to the
mainbranch. -
Workflow .github/workflows/build-jekyll.yml action is triggered.
-
Uses
ubuntu-latestenvironment -
Uses JEKYLL DEPLOY ACTION
-
Runs Jekyll build to generate static files (just like normal)
-
Commits the resulting static files to the gh-pages branch
-
-
-
GitHub pages settings is configured to publish the
gh-pagesbranch tohttps://geoserver.github.io.- The CNAME
geoserver.orgmanaged by OSGeo System Admin Committee
The content is available as the https:/geoserver.org website
- The CNAME