From 94937a77f9bc6e830f675f896606411c8d6f8250 Mon Sep 17 00:00:00 2001 From: John Morrice Date: Sat, 15 Feb 2025 16:38:07 +0000 Subject: [PATCH 01/14] Grab build scripts from jooda branch --- scripts/build.sh | 12 ++++++++++++ scripts/bundle-lock.sh | 21 +++++++++++++++++++++ scripts/dev-server.sh | 9 +++++++++ 3 files changed, 42 insertions(+) create mode 100755 scripts/build.sh create mode 100755 scripts/bundle-lock.sh create mode 100755 scripts/dev-server.sh diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100755 index 00000000..f71adcfb --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -e + +echo "Building Docker image for static site generation..." +docker build --platform=linux/amd64 -t argmin-gravitas/jekyll-build -f Dockerfiles/Dockerfile.jekyll . + +echo "Generating static site..." +# Mount your local "./_site" directory to the container's /srv/jekyll/_site directory. +mkdir -p _site +docker run --platform=linux/amd64 -v "$(pwd)/_site:/srv/jekyll/_site" argmin-gravitas/jekyll-build bundle exec jekyll build + +echo "Site built successfully into the ./_site directory." diff --git a/scripts/bundle-lock.sh b/scripts/bundle-lock.sh new file mode 100755 index 00000000..27bf2245 --- /dev/null +++ b/scripts/bundle-lock.sh @@ -0,0 +1,21 @@ +#!/bin/bash +set -e + +# Define image name and Dockerfile path. +IMAGE_NAME="gemfile_updater" +DOCKERFILE="Dockerfiles/Dockerfile.bundle" + +echo "Building the Docker image" +docker build -t ${IMAGE_NAME} -f ${DOCKERFILE} . + +# Create a container from the builder image. +CONTAINER_ID=$(docker create ${IMAGE_NAME}) + +# Copy the Gemfile.lock from the container to the host. +echo "Copying updated Gemfile.lock from container (${CONTAINER_ID})..." +docker cp "${CONTAINER_ID}:/srv/jekyll/Gemfile.lock" ./Gemfile.lock + +# Clean up the temporary container. +docker rm ${CONTAINER_ID} > /dev/null + +echo "Updated Gemfile.lock has been copied to the host." \ No newline at end of file diff --git a/scripts/dev-server.sh b/scripts/dev-server.sh new file mode 100755 index 00000000..e1257bfe --- /dev/null +++ b/scripts/dev-server.sh @@ -0,0 +1,9 @@ +#!/bin/bash +set -e + +echo "Building Docker image for Jekyll development..." +docker build -t argmin-gravitas/jekyll-dev -f Dockerfiles/Dockerfile.jekyll . + +echo "Running Docker container with live file editing enabled..." +# The -v flag mounts the current directory (source code) into /srv/jekyll in the container. +docker run -p 4000:4000 -v "$(pwd)":/srv/jekyll argmin-gravitas/jekyll-dev \ No newline at end of file From 98dffff4e0c7a867659fc766ea26870ecb334590 Mon Sep 17 00:00:00 2001 From: John Morrice Date: Sat, 15 Feb 2025 16:40:35 +0000 Subject: [PATCH 02/14] Update build scripts to fix hyperlinks --- Dockerfiles/Dockerfile.bundle | 14 ++++++++++++++ Dockerfiles/Dockerfile.jekyll | 34 ++++++++++++++++++++++++++++++++++ _config_docker.yml | 11 +++++++++++ 3 files changed, 59 insertions(+) create mode 100644 Dockerfiles/Dockerfile.bundle create mode 100644 Dockerfiles/Dockerfile.jekyll create mode 100644 _config_docker.yml diff --git a/Dockerfiles/Dockerfile.bundle b/Dockerfiles/Dockerfile.bundle new file mode 100644 index 00000000..57406f6a --- /dev/null +++ b/Dockerfiles/Dockerfile.bundle @@ -0,0 +1,14 @@ +FROM jekyll/jekyll:3.8.6 + +# Create a working directory. +WORKDIR /srv/jekyll + +# Copy dependency files first for caching. +COPY Gemfile ./ + +# Make files be owned by jekyll user. +RUN chown -R jekyll:jekyll /srv/jekyll + +# Update the bundle and add the current platform lock. +RUN bundle lock + diff --git a/Dockerfiles/Dockerfile.jekyll b/Dockerfiles/Dockerfile.jekyll new file mode 100644 index 00000000..67558b21 --- /dev/null +++ b/Dockerfiles/Dockerfile.jekyll @@ -0,0 +1,34 @@ +# Use Ruby 2.6.3 on Alpine. +FROM ruby:2.6.3-alpine + +# Update RubyGems system. +RUN gem update --system 3.3.22 + +# Install system dependencies. +# (Node.js is here for asset compilation, adjust as needed.) +RUN apk update && apk add --no-cache \ + build-base \ + nodejs \ + libffi-dev + +# Install bundler if it’s not already available. +RUN gem install bundler -v 2.0.2 + +# Set working directory. +WORKDIR /srv/jekyll + +# Copy project files (so that dependencies are installed during image build). +# When running interactively you will mount your project folder over this. +COPY . . + +# Install Ruby dependencies as specified in the Gemfile. +RUN bundle install + +# Expose the default Jekyll port. +EXPOSE 4000 + +ENV JEKYLL_ENV=docker + +# Run the Jekyll server with incremental rebuilds and bind to localhost. +CMD ["bundle", "exec", "jekyll", "serve", "--incremental", "--host", "0.0.0.0", "--config", "_config_docker.yml"] + diff --git a/_config_docker.yml b/_config_docker.yml new file mode 100644 index 00000000..0150806f --- /dev/null +++ b/_config_docker.yml @@ -0,0 +1,11 @@ +# Site settings +title: argmin gravitas +fmtTitle: argmin gravitas +email: g@gleech.org +baseurl: "" # the subpath of your site, e.g. /blog/ +url: http://localhost:4000 # the base hostname & protocol for your site +github_username: g-leech +highlighter: none + +# Build settings +markdown: kramdown From d4dd8ff52947df1b4d6ef1399128a163b3504b6a Mon Sep 17 00:00:00 2001 From: John Morrice Date: Sat, 15 Feb 2025 16:45:50 +0000 Subject: [PATCH 03/14] Update Gemfile --- Dockerfiles/Dockerfile.bundle | 2 +- Dockerfiles/Dockerfile.jekyll | 4 ++-- Gemfile | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Dockerfiles/Dockerfile.bundle b/Dockerfiles/Dockerfile.bundle index 57406f6a..9bbc0228 100644 --- a/Dockerfiles/Dockerfile.bundle +++ b/Dockerfiles/Dockerfile.bundle @@ -1,4 +1,4 @@ -FROM jekyll/jekyll:3.8.6 +FROM jekyll/jekyll:4.0 # Create a working directory. WORKDIR /srv/jekyll diff --git a/Dockerfiles/Dockerfile.jekyll b/Dockerfiles/Dockerfile.jekyll index 67558b21..434b8033 100644 --- a/Dockerfiles/Dockerfile.jekyll +++ b/Dockerfiles/Dockerfile.jekyll @@ -2,7 +2,7 @@ FROM ruby:2.6.3-alpine # Update RubyGems system. -RUN gem update --system 3.3.22 +# RUN gem update --system 3.3.22 # Install system dependencies. # (Node.js is here for asset compilation, adjust as needed.) @@ -12,7 +12,7 @@ RUN apk update && apk add --no-cache \ libffi-dev # Install bundler if it’s not already available. -RUN gem install bundler -v 2.0.2 +# RUN gem install bundler -v 2.0.2 # Set working directory. WORKDIR /srv/jekyll diff --git a/Gemfile b/Gemfile index b2c08cbe..0e987322 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,8 @@ # A sample Gemfile source "https://rubygems.org" -gem "jekyll" +ruby '~> 3.1.1' +gem "jekyll", "~> 4.3.3" gem "jekyll-sass-converter", "~> 2.0" gem "webrick", "~> 1.8" \ No newline at end of file From 787fc0f84b4da7150bf4d1b0e2ef2eb44e948742 Mon Sep 17 00:00:00 2001 From: John Morrice Date: Sat, 15 Feb 2025 16:48:11 +0000 Subject: [PATCH 04/14] Use ruby 3.1 for build --- Dockerfiles/Dockerfile.jekyll | 4 ++-- Gemfile.lock | 32 ++++++++++++++++---------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Dockerfiles/Dockerfile.jekyll b/Dockerfiles/Dockerfile.jekyll index 434b8033..e61fe469 100644 --- a/Dockerfiles/Dockerfile.jekyll +++ b/Dockerfiles/Dockerfile.jekyll @@ -1,5 +1,5 @@ -# Use Ruby 2.6.3 on Alpine. -FROM ruby:2.6.3-alpine +# Use Ruby 3.1 series on Alpine. +FROM ruby:3.1-alpine # Update RubyGems system. # RUN gem update --system 3.3.22 diff --git a/Gemfile.lock b/Gemfile.lock index e1244180..1abf9209 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -4,17 +4,17 @@ GEM addressable (2.8.7) public_suffix (>= 2.0.2, < 7.0) colorator (1.1.0) - concurrent-ruby (1.3.3) + concurrent-ruby (1.3.5) em-websocket (0.5.3) eventmachine (>= 0.12.9) http_parser.rb (~> 0) eventmachine (1.2.7) - ffi (1.16.3) + ffi (1.17.1-x86_64-linux-musl) forwardable-extended (2.6.0) http_parser.rb (0.8.0) - i18n (1.14.5) + i18n (1.14.7) concurrent-ruby (~> 1.0) - jekyll (4.3.3) + jekyll (4.3.4) addressable (~> 2.4) colorator (~> 1.0) em-websocket (~> 0.5) @@ -34,8 +34,8 @@ GEM sassc (> 2.0.1, < 3.0) jekyll-watch (2.2.1) listen (~> 3.0) - kramdown (2.4.0) - rexml + kramdown (2.5.1) + rexml (>= 3.3.9) kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) liquid (4.0.4) @@ -49,26 +49,26 @@ GEM rb-fsevent (0.11.2) rb-inotify (0.11.1) ffi (~> 1.0) - rexml (3.3.2) - strscan - rouge (4.3.0) + rexml (3.4.0) + rouge (4.5.1) safe_yaml (1.0.5) sassc (2.4.0) ffi (~> 1.9) - strscan (3.1.0) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) - unicode-display_width (2.5.0) - webrick (1.8.1) + unicode-display_width (2.6.0) + webrick (1.9.1) PLATFORMS - aarch64-linux-gnu - ruby + x86_64-linux-musl DEPENDENCIES - jekyll + jekyll (~> 4.3.3) jekyll-sass-converter (~> 2.0) webrick (~> 1.8) +RUBY VERSION + ruby 3.1.1p18 + BUNDLED WITH - 2.1.4 + 2.3.25 From e12a1e9dd72e5d0f459022e167673aca0005f9b2 Mon Sep 17 00:00:00 2001 From: John Morrice Date: Sat, 15 Feb 2025 16:49:38 +0000 Subject: [PATCH 05/14] Use plain progress for docker build --- scripts/dev-server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/dev-server.sh b/scripts/dev-server.sh index e1257bfe..04e380ce 100755 --- a/scripts/dev-server.sh +++ b/scripts/dev-server.sh @@ -2,7 +2,7 @@ set -e echo "Building Docker image for Jekyll development..." -docker build -t argmin-gravitas/jekyll-dev -f Dockerfiles/Dockerfile.jekyll . +docker build --progress plain -t argmin-gravitas/jekyll-dev -f Dockerfiles/Dockerfile.jekyll . echo "Running Docker container with live file editing enabled..." # The -v flag mounts the current directory (source code) into /srv/jekyll in the container. From 230a4f5692871c03064c803d4c88bbe9c421eafc Mon Sep 17 00:00:00 2001 From: John Morrice Date: Sat, 15 Feb 2025 16:52:52 +0000 Subject: [PATCH 06/14] Update build dockerfile --- Dockerfiles/Dockerfile.jekyll | 5 +---- Gemfile.lock | 2 ++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Dockerfiles/Dockerfile.jekyll b/Dockerfiles/Dockerfile.jekyll index e61fe469..ebfbe30d 100644 --- a/Dockerfiles/Dockerfile.jekyll +++ b/Dockerfiles/Dockerfile.jekyll @@ -1,9 +1,6 @@ # Use Ruby 3.1 series on Alpine. FROM ruby:3.1-alpine -# Update RubyGems system. -# RUN gem update --system 3.3.22 - # Install system dependencies. # (Node.js is here for asset compilation, adjust as needed.) RUN apk update && apk add --no-cache \ @@ -12,7 +9,7 @@ RUN apk update && apk add --no-cache \ libffi-dev # Install bundler if it’s not already available. -# RUN gem install bundler -v 2.0.2 +RUN gem install bundler -v 2.3.25 # Set working directory. WORKDIR /srv/jekyll diff --git a/Gemfile.lock b/Gemfile.lock index 1abf9209..8e1961b6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -9,6 +9,7 @@ GEM eventmachine (>= 0.12.9) http_parser.rb (~> 0) eventmachine (1.2.7) + ffi (1.17.1-aarch64-linux-musl) ffi (1.17.1-x86_64-linux-musl) forwardable-extended (2.6.0) http_parser.rb (0.8.0) @@ -60,6 +61,7 @@ GEM webrick (1.9.1) PLATFORMS + aarch64-linux-musl x86_64-linux-musl DEPENDENCIES From f93dc55833076f9010cbeebd4b30dfc808333e68 Mon Sep 17 00:00:00 2001 From: John Morrice Date: Sat, 15 Feb 2025 17:01:02 +0000 Subject: [PATCH 07/14] Building site should just use the jekyll-dev docker target --- .github/workflows/deploy-cloudflare.yml | 43 +++++++++++++++++++++++++ .github/workflows/deploy-netlify.yml | 9 ++++-- scripts/build.sh | 4 +-- 3 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/deploy-cloudflare.yml diff --git a/.github/workflows/deploy-cloudflare.yml b/.github/workflows/deploy-cloudflare.yml new file mode 100644 index 00000000..4fc39841 --- /dev/null +++ b/.github/workflows/deploy-cloudflare.yml @@ -0,0 +1,43 @@ +name: Manual Build & Deploy to Netlify (Dev) + +on: + # 1. Manual trigger via the Actions tab + workflow_dispatch: + inputs: + branch: + description: "Branch to build and deploy" + required: false + default: "master" + inputs: + environment: + description: "Environment to deploy to" + required: false + default: "Dev" + +jobs: + build-and-deploy: + name: Build and Deploy to Cloudflare + runs-on: ubuntu-latest + + # 2. Use the environment input to set the environment + # so that environment-scoped secrets are available + environment: ${{ github.event.inputs.environment }} + + steps: + # 3. Check out the specified branch + - name: Check out code + uses: actions/checkout@v3 + with: + ref: ${{ github.event.inputs.branch }} + + # 4. Build the site using your existing Docker build script + - name: Build the site using Docker + run: | + ./scripts/build.sh + + # 5. Deploy to Cloudflare using the Cloudflare Wrangler Action + - name: Deploy + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + workingDirectory: "_site" diff --git a/.github/workflows/deploy-netlify.yml b/.github/workflows/deploy-netlify.yml index d9817c7b..06e21e95 100644 --- a/.github/workflows/deploy-netlify.yml +++ b/.github/workflows/deploy-netlify.yml @@ -8,15 +8,20 @@ on: description: "Branch to build and deploy" required: false default: "master" + inputs: + environment: + description: "Environment to deploy to" + required: false + default: "Dev" jobs: build-and-deploy: name: Build and Deploy to Netlify runs-on: ubuntu-latest - # 2. Use the environment named 'Dev' + # 2. Use the environment input to set the environment # so that environment-scoped secrets are available - environment: Dev + environment: ${{ github.event.inputs.environment }} steps: # 3. Check out the specified branch diff --git a/scripts/build.sh b/scripts/build.sh index f71adcfb..10456fd5 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -2,11 +2,11 @@ set -e echo "Building Docker image for static site generation..." -docker build --platform=linux/amd64 -t argmin-gravitas/jekyll-build -f Dockerfiles/Dockerfile.jekyll . +docker build --platform=linux/amd64 -t argmin-gravitas/jekyll-dev -f Dockerfiles/Dockerfile.jekyll . echo "Generating static site..." # Mount your local "./_site" directory to the container's /srv/jekyll/_site directory. mkdir -p _site -docker run --platform=linux/amd64 -v "$(pwd)/_site:/srv/jekyll/_site" argmin-gravitas/jekyll-build bundle exec jekyll build +docker run --platform=linux/amd64 -v "$(pwd)/_site:/srv/jekyll/_site" argmin-gravitas/jekyll-dev bundle exec jekyll build echo "Site built successfully into the ./_site directory." From 18d41e435514fb5aca5b9e7226c6357417af7ade Mon Sep 17 00:00:00 2001 From: John Morrice Date: Sat, 15 Feb 2025 17:03:05 +0000 Subject: [PATCH 08/14] Improve Docker caching --- Dockerfiles/Dockerfile.jekyll | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Dockerfiles/Dockerfile.jekyll b/Dockerfiles/Dockerfile.jekyll index ebfbe30d..609f3898 100644 --- a/Dockerfiles/Dockerfile.jekyll +++ b/Dockerfiles/Dockerfile.jekyll @@ -16,11 +16,14 @@ WORKDIR /srv/jekyll # Copy project files (so that dependencies are installed during image build). # When running interactively you will mount your project folder over this. -COPY . . +COPY Gemfile Gemfile.lock ./ # Install Ruby dependencies as specified in the Gemfile. RUN bundle install +# Copy the rest of the project files. +COPY . . + # Expose the default Jekyll port. EXPOSE 4000 From 0cbe67c7680bcb965c1dc632fc04a760c82a0fc7 Mon Sep 17 00:00:00 2001 From: John Morrice Date: Sat, 15 Feb 2025 17:04:11 +0000 Subject: [PATCH 09/14] Tidy comments --- Dockerfiles/Dockerfile.jekyll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfiles/Dockerfile.jekyll b/Dockerfiles/Dockerfile.jekyll index 609f3898..842c78b9 100644 --- a/Dockerfiles/Dockerfile.jekyll +++ b/Dockerfiles/Dockerfile.jekyll @@ -14,14 +14,14 @@ RUN gem install bundler -v 2.3.25 # Set working directory. WORKDIR /srv/jekyll -# Copy project files (so that dependencies are installed during image build). -# When running interactively you will mount your project folder over this. +# Copy Gemfiles (so that dependencies are installed during image build). COPY Gemfile Gemfile.lock ./ # Install Ruby dependencies as specified in the Gemfile. RUN bundle install # Copy the rest of the project files. +# When running interactively you will mount your project folder over this. COPY . . # Expose the default Jekyll port. From 730bfa8699cc124dab0ed3a8f53ac70f3e87c128 Mon Sep 17 00:00:00 2001 From: John Morrice Date: Sat, 15 Feb 2025 17:06:56 +0000 Subject: [PATCH 10/14] Tidy up environment name --- .github/workflows/deploy-netlify.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-netlify.yml b/.github/workflows/deploy-netlify.yml index 06e21e95..7ca6addb 100644 --- a/.github/workflows/deploy-netlify.yml +++ b/.github/workflows/deploy-netlify.yml @@ -12,7 +12,7 @@ on: environment: description: "Environment to deploy to" required: false - default: "Dev" + default: "development" jobs: build-and-deploy: From 507281ee9b4ead255b26df99b39104fb9fb97d56 Mon Sep 17 00:00:00 2001 From: John Morrice Date: Sat, 15 Feb 2025 17:14:59 +0000 Subject: [PATCH 11/14] Add environment to cloudflare --- .github/workflows/deploy-cloudflare.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy-cloudflare.yml b/.github/workflows/deploy-cloudflare.yml index 4fc39841..582494fe 100644 --- a/.github/workflows/deploy-cloudflare.yml +++ b/.github/workflows/deploy-cloudflare.yml @@ -40,4 +40,5 @@ jobs: uses: cloudflare/wrangler-action@v3 with: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + environment: ${{ github.event.inputs.environment }} workingDirectory: "_site" From 9a6fad29d4096bfa5dcabaa666dc348475f850b1 Mon Sep 17 00:00:00 2001 From: John Morrice Date: Sat, 15 Feb 2025 17:16:46 +0000 Subject: [PATCH 12/14] Remove progress-plain from dev-server.sh --- scripts/dev-server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/dev-server.sh b/scripts/dev-server.sh index 04e380ce..e1257bfe 100755 --- a/scripts/dev-server.sh +++ b/scripts/dev-server.sh @@ -2,7 +2,7 @@ set -e echo "Building Docker image for Jekyll development..." -docker build --progress plain -t argmin-gravitas/jekyll-dev -f Dockerfiles/Dockerfile.jekyll . +docker build -t argmin-gravitas/jekyll-dev -f Dockerfiles/Dockerfile.jekyll . echo "Running Docker container with live file editing enabled..." # The -v flag mounts the current directory (source code) into /srv/jekyll in the container. From 2f13314c97e79a9e7af8539833c4afc8850709f2 Mon Sep 17 00:00:00 2001 From: John Morrice Date: Sat, 15 Feb 2025 17:29:19 +0000 Subject: [PATCH 13/14] Tidy up actions names --- .github/workflows/deploy-cloudflare.yml | 2 +- .github/workflows/deploy-netlify.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-cloudflare.yml b/.github/workflows/deploy-cloudflare.yml index 582494fe..58eb6fe2 100644 --- a/.github/workflows/deploy-cloudflare.yml +++ b/.github/workflows/deploy-cloudflare.yml @@ -1,4 +1,4 @@ -name: Manual Build & Deploy to Netlify (Dev) +name: Build & Deploy to Cloudflare on: # 1. Manual trigger via the Actions tab diff --git a/.github/workflows/deploy-netlify.yml b/.github/workflows/deploy-netlify.yml index 7ca6addb..307e6d85 100644 --- a/.github/workflows/deploy-netlify.yml +++ b/.github/workflows/deploy-netlify.yml @@ -1,4 +1,4 @@ -name: Manual Build & Deploy to Netlify (Dev) +name: Build & Deploy to Netlify on: # 1. Manual trigger via the Actions tab From 05f8b73c3b7f7418bdb510fc2f63ad78ed25629f Mon Sep 17 00:00:00 2001 From: John Morrice Date: Sat, 15 Feb 2025 17:29:49 +0000 Subject: [PATCH 14/14] Fix environment name --- .github/workflows/deploy-cloudflare.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-cloudflare.yml b/.github/workflows/deploy-cloudflare.yml index 58eb6fe2..542aecb5 100644 --- a/.github/workflows/deploy-cloudflare.yml +++ b/.github/workflows/deploy-cloudflare.yml @@ -12,7 +12,7 @@ on: environment: description: "Environment to deploy to" required: false - default: "Dev" + default: "development" jobs: build-and-deploy: