Preparation

Push Jekyll Project to Github Repository

while AWS amplify support multiple repository, github will be used on this article. below are the project repository url

https://github.com/deganandapriyambada/playpumpkin.com

with following project skeleton:

drwxr-xr-x@ 19 deganandaferdian  staff   608 Sep  4 23:11 .
drwxr-xr-x  29 deganandaferdian  staff   928 Aug 10 11:26 ..
-rw-r--r--@  1 deganandaferdian  staff  8196 Sep  4 22:47 .DS_Store
drwxr-xr-x  14 deganandaferdian  staff   448 Sep  4 23:13 .git
-rw-r--r--   1 deganandaferdian  staff    41 Sep  4 21:27 .gitignore
drwxr-xr-x   4 deganandaferdian  staff   128 Sep  4 21:45 .jekyll-cache
-rw-r--r--   1 deganandaferdian  staff   393 Sep  4 21:27 Gemfile
-rw-r--r--   1 deganandaferdian  staff  3150 Sep  4 21:43 Gemfile.lock
-rw-r--r--   1 deganandaferdian  staff  2112 Sep  4 23:11 _config.yml
drwxr-xr-x   7 deganandaferdian  staff   224 Sep  4 23:12 _drafts
drwxr-xr-x   5 deganandaferdian  staff   160 Sep  4 22:19 _includes
drwxr-xr-x   5 deganandaferdian  staff   160 Sep  4 22:14 _layouts
drwxr-xr-x   5 deganandaferdian  staff   160 Sep  4 22:14 _posts
drwxr-xr-x   3 deganandaferdian  staff    96 Sep  4 23:06 _sass
drwxr-xr-x   9 deganandaferdian  staff   288 Sep  4 23:12 _site
drwxr-xr-x   5 deganandaferdian  staff   160 Sep  4 22:53 assets
-rw-r--r--   1 deganandaferdian  staff   871 Sep  4 23:11 index.html
-rw-r--r--   1 deganandaferdian  staff   269 Sep  4 21:27 readme.md
-rw-r--r--   1 deganandaferdian  staff     0 Sep  4 22:12 sw.js

explanation:

1.Gemfile store list of ruby package that used for the jekyll project

# frozen_string_literal: true

source "https://rubygems.org"

# gem "rails"

gem "jekyll"
gem "jekyll-paginate"
gem "jekyll-paginate-categories"
gem "jekyll-paginate-tags"
gem 'jekyll-feed'
gem 'jekyll-sitemap'
gem 'jekyll-archives'
gem 'jekyll-tagging-related_posts'
gem 'jekyll-last-modified-at'
gem 'jekyll-loading-lazy'
gem 'jekyll-glossary_tooltip'
gem 'wdm', '>= 0.1.0', platform: :mingw

2.Config.yml - jekyll plugins configuration and site configuration (eg : title, description, max post per page, etc)

3._includes - a folder that store html web component (eg: header, sidebar, footer, etc) 4.Layout - layout for each mardown types. Post, category and tag has their own html layout. 5.Assets - store the images used on the posts 6._site - dist folder. Contain the compiled html files generated by jekyll for each page.

Hence, _site folder need to be picked by AWS Amplify (after the project has been bult)

Deploy to AWS

go to aws console launcher and search for aws amplify project.

postimage100 AWS Amplify can be found on the console launcher

Create new App

inside the aws amplify landing page, click the create new app button on the top right.

postimage100 Create new App

Choose the repository sources

There are several repository supported by jekyll :

  1. github
  2. bitbucket
  3. gitlab
  4. Commit

however, the _site file can also be zipped and manually uploaded to the AWS Amplify (not recommended).

manualy deployment is not recommended, any changes will need manual intervention.

Ideally, it should be retrieved from the repo, build and deploy each time there is changes on the release branch (master/release).

Choose appopriate repository that used by the project.

postimage100 Repository Type

by default Jekyll is not supported by AWS Leave tempalte as unchoosen. Need to pre-determine the deployment script manually.

define the release branch name and repository name

postimage100 Release branch configuration and Repository name

Configure the deployment script

AWS Amplify has its own CICD (based on AWS services), it will not use the repository CICD such as github action.

AWS has a deployment pipeline config file called as amplify.yml

Similar with azure devops yaml or jekyll yaml. A-Z deployment steps will be determined here. From pulling the code, build and deploy.

Jekyll (version 4.x) project build steps.

Other version might have slightly different steps, but the main logic is the same.

Pre-build

  1. Determine ruby version (jekyll is based on ruby) eventhrough the final build output is plain html.
  2. add ruby to the path
  3. set language UTF-8 (to avoid any issue on the jekyll markdown redering)
  4. Install the bundle based on Project gemfile that contains list of ruby package for jekyll project and its depedencies.
    preBuild:
      commands:
        - rvm install 3.1.3
        - rvm use 3.1.3
        - pip install --user jupyter 
        - export PATH=$PATH:/root/.local/bin
        - export LANG=C.UTF-8
        - export LC_ALL=C.UTF-8
        - bundle install

Build

re-execute steps 1 ~ 3 from prebuild and build the jekyll project

    build:
      commands:
        - export PATH=$PATH:/root/.local/bin
        - export LANG=C.UTF-8
        - export LC_ALL=C.UTF-8
        - bundle exec jekyll build

Set dist folder

by default jekyll will build the project output on _site folder. Artifact need to be pointed on those folder after prebuild and build completed

  artifacts:
    baseDirectory: _site
    files:
      - "**/*"

Final Amplify.yaml for AWS Amplify deployment pipeline.

version: 1
frontend:
  phases:
    preBuild:
      commands:
        - rvm install 3.1.3
        - rvm use 3.1.3
        - export PATH=$PATH:/root/.local/bin
        - export LANG=C.UTF-8
        - export LC_ALL=C.UTF-8
        - bundle install
    build:
      commands:
        - export PATH=$PATH:/root/.local/bin
        - export LANG=C.UTF-8
        - export LC_ALL=C.UTF-8
        - bundle exec jekyll build
  artifacts:
    baseDirectory: _site
    files:
      - "**/*"
  cache:
    paths: []

make sure the yaml file is properly configured and click “save & deploy”

postimage100 Deploy using predefined amplify.yml

Deployment result

once deployment is iniated, AWS Amplify will execute the cicd pipeline that determined on the amplify.yml

postimage100 Deployment Status

all the deployment detailed logs can be seen on the overview page

postimage100 Deployment Status: Deployed

Access the deployed jekyll project

postimage100 Access the deployed website

all html generated by jekyll inside _site folder will be automatically deployed on specific aws amplify url / sub domain.

https://master.d3rbadms89ye7m.amplifyapp.com/

After the deployment is completed and successful. Go to the amplifyapp url to see the deployed jekyll project.