aboutsummaryrefslogblamecommitdiffstatshomepage
path: root/.github/workflows/ci.yml
blob: 6d8ea0986ece6e594100baa325d146c524b3db42 (plain) (tree)
1
2
3
4
5
6
        
 


               
                    






                                            
                          
                     

                                                    

                      
                                 


                                     
                                 
             

                                                                                       
                                      
                                                      
                                                     










                                               
                                                  








                                                                 
                                                   
                                  
                                                                                 

                          

                                                         
 
               
                          
                      





                                                  
                                 


                                     
                                 
             

                                                                                       
                                 
                                                                                 







                                                              
                                                  







                                                                        
                                               












                                                                                                       
                                                         



                                                                                                         
                                             
 
                    
                          
                                





                                       
                                 


                                     
                                 
             

                                                                                       


                                                              
                                                                                      







                                                                   
                                                    







                                                                        
                                                 












                                                                                         
                                                           



                                                                                           
                                                  
name: CI

on:
  push:
  pull_request:
  workflow_dispatch:

env:
  JEKYLL_PROJECT_AUTHOR: egor-tensin
  JEKYLL_PROJECT_NAME: egor-tensin.github.io

jobs:
  local_build:
    runs-on: ubuntu-latest
    name: Local build
    env:
      JEKYLL_GITHUB_TOKEN: '${{ secrets.GH_TOKEN }}'
    steps:
      - name: Checkout
        uses: actions/checkout@v3
        with:
          path: src
      - name: Checkout Jekyll project
        uses: actions/checkout@v3
        with:
          repository: '${{ env.JEKYLL_PROJECT_AUTHOR }}/${{ env.JEKYLL_PROJECT_NAME }}'
          path: '${{ env.JEKYLL_PROJECT_NAME }}'
      - name: Add ~/.local/bin to PATH
        run: echo "$HOME/.local/bin" >> "$GITHUB_PATH"
      - name: chruby & ruby-install are not installed
        run: |
          test '' = "$( type -t chruby-exec )"
          test '' = "$( type -t ruby-install )"
      - name: Install Ruby
        run: |
          cd src
          make ruby-install
          make ruby-install/clean
          make ruby
          make chruby
          make chruby/clean
      - name: chruby & ruby-install were installed
        run: |
          test 'file' = "$( type -t chruby-exec )"
          test 'file' = "$( type -t ruby-install )"
      - name: Install dependencies
        run: |
          cd src
          make bundler
          make dependencies "PROJECT_DIR=../$JEKYLL_PROJECT_NAME"
      - name: _site doesn't exist
        run: test ! -e "$JEKYLL_PROJECT_NAME/_site"
      - name: Build Jekyll project
        run: make -f src/Makefile jekyll/build "PROJECT_DIR=$JEKYLL_PROJECT_NAME"
      - name: _site exists
        run: |
          test -d "$JEKYLL_PROJECT_NAME/_site"
          test -f "$JEKYLL_PROJECT_NAME/_site/index.html"

  docker_build:
    runs-on: ubuntu-latest
    name: Docker build
    steps:
      - name: Running as regular user
        run: test "$( id -u )" != 0
      - name: Docker is accessible as regular user
        run: docker ps
      - name: Checkout
        uses: actions/checkout@v3
        with:
          path: src
      - name: Checkout Jekyll project
        uses: actions/checkout@v3
        with:
          repository: '${{ env.JEKYLL_PROJECT_AUTHOR }}/${{ env.JEKYLL_PROJECT_NAME }}'
          path: '${{ env.JEKYLL_PROJECT_NAME }}'
      - name: Build Docker images
        run: make -f src/Makefile docker/build "PROJECT_DIR=$JEKYLL_PROJECT_NAME"
      - name: _site doesn't exist
        run: test ! -e "$JEKYLL_PROJECT_NAME/_site"
      - name: Start containers
        run: |
          cd src
          make docker/up "PROJECT_DIR=../$JEKYLL_PROJECT_NAME"
          sleep 3
          make docker/logs
      - name: Check Jekyll running as current user
        run: |
          pid="$( docker inspect -f '{{.State.Pid}}' jekyll_project_1 )"
          info="$( ps --no-headers -o uid:1,gid:1 -p "$pid" )"
          test "$( id -u ) $( id -g )" = "$info"
      - name: _site exists
        run: |
          test -d "$JEKYLL_PROJECT_NAME/_site"
          test -f "$JEKYLL_PROJECT_NAME/_site/index.html"
      - name: Check _site owned by current user
        run: |
          test "$( id -u ) $( id -g )" = "$( stat -c '%u %g' "$JEKYLL_PROJECT_NAME/_site" )"
          test "$( id -u ) $( id -g )" = "$( stat -c '%u %g' "$JEKYLL_PROJECT_NAME/_site/index.html" )"
      - name: Fetch index.html
        run: curl -sS -D - http://localhost:4000/index.html
      - name: _site/dummy.txt doesn't exist
        run: test ! -e "$JEKYLL_PROJECT_NAME/_site/dummy.txt"
      - name: create dummy.txt
        run: |
          echo 123 > "$JEKYLL_PROJECT_NAME/dummy.txt"
          sleep 3
      - name: _site/dummy.txt exists
        run: test -f "$JEKYLL_PROJECT_NAME/_site/dummy.txt"
      - name: Check _site/dummy.txt owned by current user
        run: test "$( id -u ) $( id -g )" = "$( stat -c '%u %g' "$JEKYLL_PROJECT_NAME/_site/dummy.txt" )"
      - name: Fetch dummy.txt
        run: curl -sS -D - http://localhost:4000/dummy.txt
      - name: Stop containers
        run: make -f src/Makefile docker/down

  docker_root_build:
    runs-on: ubuntu-latest
    name: Docker build (as root)
    steps:
      - name: Running as regular user
        run: test "$( id -u )" != 0
      - name: sudo makes root
        run: test "$( sudo id -u )" = 0
      - name: Checkout
        uses: actions/checkout@v3
        with:
          path: src
      - name: Checkout Jekyll project
        uses: actions/checkout@v3
        with:
          repository: '${{ env.JEKYLL_PROJECT_AUTHOR }}/${{ env.JEKYLL_PROJECT_NAME }}'
          path: '${{ env.JEKYLL_PROJECT_NAME }}'
      - name: Jekyll project is owned by root
        run: sudo chown -R -- root:root "$JEKYLL_PROJECT_NAME"
      - name: Build Docker images
        run: sudo make -f src/Makefile docker/build "PROJECT_DIR=$JEKYLL_PROJECT_NAME"
      - name: _site doesn't exist
        run: test ! -e "$JEKYLL_PROJECT_NAME/_site"
      - name: Start containers
        run: |
          cd src
          sudo make docker/up "PROJECT_DIR=../$JEKYLL_PROJECT_NAME"
          sleep 3
          sudo make docker/logs
      - name: Check Jekyll running as container user
        run: |
          pid="$( docker inspect -f '{{.State.Pid}}' jekyll_project_1 )"
          info="$( ps --no-headers -o uid:1,gid:1 -p "$pid" )"
          test '999 999' = "$info"
      - name: _site exists
        run: |
          test -d "$JEKYLL_PROJECT_NAME/_site"
          test -f "$JEKYLL_PROJECT_NAME/_site/index.html"
      - name: Check _site owned by container user
        run: |
          test '999 999' = "$( stat -c '%u %g' "$JEKYLL_PROJECT_NAME/_site" )"
          test '999 999' = "$( stat -c '%u %g' "$JEKYLL_PROJECT_NAME/_site/index.html" )"
      - name: Fetch index.html
        run: curl -sS -D - http://localhost:4000/index.html
      - name: _site/dummy.txt doesn't exist
        run: test ! -e "$JEKYLL_PROJECT_NAME/_site/dummy.txt"
      - name: create dummy.txt
        run: |
          echo 123 | sudo tee "$JEKYLL_PROJECT_NAME/dummy.txt"
          sleep 3
      - name: _site/dummy.txt exists
        run: test -f "$JEKYLL_PROJECT_NAME/_site/dummy.txt"
      - name: Check _site/dummy.txt owned by container user
        run: test '999 999' = "$( stat -c '%u %g' "$JEKYLL_PROJECT_NAME/_site/dummy.txt" )"
      - name: Fetch dummy.txt
        run: curl -sS -D - http://localhost:4000/dummy.txt
      - name: Stop containers
        run: sudo make -f src/Makefile docker/down