You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by po...@apache.org on 2025/05/15 04:35:40 UTC

(airflow) branch improve-live-staging-approach-for-docs updated (c2519b60e23 -> aaea7d3488e)

This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a change to branch improve-live-staging-approach-for-docs
in repository https://gitbox.apache.org/repos/asf/airflow.git


 discard c2519b60e23 Improve flow for live/staging doc publishing
     new aaea7d3488e Improve flow for live/staging doc publishing

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (c2519b60e23)
            \
             N -- N -- N   refs/heads/improve-live-staging-approach-for-docs (aaea7d3488e)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .github/workflows/publish-docs-to-s3.yml | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)


(airflow) 01/01: Improve flow for live/staging doc publishing

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch improve-live-staging-approach-for-docs
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit aaea7d3488e1c84503048efe76bc64f9a38ed858
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Wed May 14 22:17:06 2025 -0400

    Improve flow for live/staging doc publishing
    
    There are a couple of improvements for live/staging doc publishing.
    
    1) we use auto/live/staging rather than buckets in the drop-downs
    2) auto selection of live/staging depending on the tag used to
       produce the documentation
    3) we use env variables to pass inputs/outputs to scripts - which
       is good security practice
    4) watermark changes are applied to documentation published to
       staging site
---
 .github/workflows/publish-docs-to-s3.yml |  58 ++++++++++++++-------
 dev/add_watermark.py                     |  85 +++++++++++++++++++++++++++++++
 dev/images/staging.png                   | Bin 0 -> 17612 bytes
 3 files changed, 126 insertions(+), 17 deletions(-)

diff --git a/.github/workflows/publish-docs-to-s3.yml b/.github/workflows/publish-docs-to-s3.yml
index 748a466cf8c..82f521e46e7 100644
--- a/.github/workflows/publish-docs-to-s3.yml
+++ b/.github/workflows/publish-docs-to-s3.yml
@@ -24,6 +24,15 @@ on:  # yamllint disable-line rule:truthy
         description: "The branch or tag to checkout for the docs publishing"
         required: true
         type: string
+      destination:
+        description: "The destination location in S3"
+        required: false
+        default: auto
+        type: choice
+        options:
+          - auto
+          - live
+          - staging
       include-docs:
         description: |
           Space separated list of docs to build.
@@ -38,14 +47,6 @@ on:  # yamllint disable-line rule:truthy
         required: false
         default: "no-docs-excluded"
         type: string
-      destination-location:
-        description: "The destination location in S3, default is live site"
-        required: false
-        default: "s3://live-docs-airflow-apache-org/docs"
-        type: choice
-        options:
-          - s3://live-docs-airflow-apache-org/docs
-          - s3://staging-docs-airflow-apache-org/docs
 
 env:
   AIRFLOW_ROOT_PATH: "/home/runner/work/temp-airflow-repo-reference"  # checkout dir for referenced tag
@@ -62,9 +63,11 @@ jobs:
       REF: ${{ inputs.ref }}
       INCLUDE_DOCS: ${{ inputs.include-docs }}
       EXCLUDE_DOCS: ${{ inputs.exclude-docs }}
-      DESTINATION_LOCATION: ${{ inputs.destination-location }}
+      DESTINATION: ${{ inputs.destination }}
     outputs:
       include-docs: ${{ inputs.include-docs == 'all' && '' || inputs.include-docs }}
+      destination-location: ${{ steps.parameters.outputs.destination-location }}
+      destination: ${{ steps.parameters.outputs.destination }}
     if: contains(fromJSON('[
       "ashb",
       "eladkal",
@@ -78,13 +81,29 @@ jobs:
     steps:
       - name: "Input parameters summary"
         shell: bash
+        id: parameters
         run: |
           echo "Input parameters summary"
           echo "========================="
           echo "Ref: '${REF}'"
           echo "Included docs : '${INCLUDE_DOCS}'"
           echo "Exclude docs: '${EXCLUDE_DOCS}'"
-          echo "Destination location: '${DESTINATION_LOCATION}'"
+          echo "Destination: '${DESTINATION}'"
+          if [[ "${DESTINATION}" == "auto" ]]; then
+             if [[ "${REF}" =~ ^.*[0-9]*\.[0-9]*\.[0-9]*$ ]]; then
+                echo "${REF} looks like final release, using live destination"
+                DESTINATION="live"
+             else
+                echo "${REF} does not looks like final release, using staging destination"
+                DESTINATION="staging"
+             fi
+          fi
+          echo "destination=${DESTINATION}" >> ${GITHUB_OUTPUT}
+          if [[ "${DESTINATION}"  == "live" ]]; then
+             echo "destination-location=s3://live-docs-airflow-apache-org/docs/" >> ${GITHUB_OUTPUT}
+          else
+             echo "destination-location=s3://staging-docs-airflow-apache-org/docs/" >> ${GITHUB_OUTPUT}
+          fi
 
   build-ci-images:
     name: Build CI images
@@ -179,18 +198,18 @@ jobs:
         uses: actions/checkout@v4
         with:
           persist-credentials: false
-      - name: "Prepare breeze & CI image: 3.9"
-        uses: ./.github/actions/prepare_breeze_and_image
-        with:
-          platform: "linux/amd64"
-          python: 3.9
-          use-uv: true
       - name: "Checkout ${{ inputs.ref }}"
         run: |
           git clone https://github.com/apache/airflow.git "${AIRFLOW_ROOT_PATH}"
           cd "${AIRFLOW_ROOT_PATH}" && git checkout ${REF}
         env:
           REF: ${{ inputs.ref }}
+      - name: "Prepare breeze & CI image: 3.9"
+        uses: ./.github/actions/prepare_breeze_and_image
+        with:
+          platform: "linux/amd64"
+          python: 3.9
+          use-uv: true
       - name: "Download docs prepared as artifacts"
         uses: actions/download-artifact@v4
         with:
@@ -220,6 +239,11 @@ jobs:
         run: breeze release-management add-back-references docker-stack
       - name: "Generate back references for helm-chart"
         run: breeze release-management add-back-references helm-chart
+      - name: "Update watermarks"
+        run: >
+          uv run dev/add_watermark.py --pattern 'main.min.css'
+          --folder generated/_build/docs --image-directory images --url-prefix /docs/images
+        if: needs.build-info.outputs.destination == 'staging'
       - name: Install AWS CLI v2
         run: |
           curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o /tmp/awscliv2.zip
@@ -235,7 +259,7 @@ jobs:
           aws-region: us-east-2
       - name: "Syncing docs to S3"
         env:
-          DESTINATION_LOCATION: "${{ inputs.destination-location }}"
+          DESTINATION_LOCATION: "${{ needs.build-info.outputs.destination-location }}"
           SOURCE_DIR_PATH: "/mnt/airflow-site/docs-archive/"
           EXCLUDE_DOCS: "${{ inputs.exclude-docs }}"
         run: |
diff --git a/dev/add_watermark.py b/dev/add_watermark.py
new file mode 100755
index 00000000000..152c5a83fbb
--- /dev/null
+++ b/dev/add_watermark.py
@@ -0,0 +1,85 @@
+#!/usr/bin/env python3
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# /// script
+# requires-python = ">=3.11"
+# dependencies = [
+#   "rich>=14.0.0",
+# ]
+# ///
+from __future__ import annotations
+
+import argparse
+import shutil
+from pathlib import Path
+
+from rich.console import Console
+
+console = Console(width=200, color_system="standard")
+
+CSS_TO_ADD = """
+  body {
+      position: relative; /* Ensures the pseudo-element is positioned relative to the body */
+      z-index: 0; /* Keeps the content above the pseudo-element */
+  }
+
+  body::before {
+      content: "";
+      position: fixed;
+      top: 0;
+      left: 0;
+      width: 100%;
+      height: 100%;
+      background: url(URL_PREFIX/staging.png) repeat center center fixed; /* Sets the background image */
+      opacity: 0.2; /* Makes the watermark semi-transparent */
+      pointer-events: none; /* Ensures the watermark doesn't interfere with user interactions */
+      z-index: -1; /* Places the pseudo-element behind all other elements */
+  }
+"""
+
+IMAGE_FILE = Path(__file__).parent / "images" / "staging.png"
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser(description="Add watermark")
+    parser.add_argument("--folder", required=True, help="Folder to look for css files for")
+    parser.add_argument("--pattern", required=True, help="Glob pattern to look for")
+    parser.add_argument("--url-prefix", required=True, help="URL prefix to use for the image")
+    parser.add_argument(
+        "--image-directory",
+        required=True,
+        help="Image directory where image should be written-relative to folder path.",
+    )
+    args = parser.parse_args()
+
+    folder_path = Path(args.folder)
+    pattern = args.pattern
+    url_prefix = args.url_prefix
+    image_directory_path = Path(args.image_directory)
+
+    content_to_add = CSS_TO_ADD.replace("URL_PREFIX", url_prefix)
+
+    files = folder_path.rglob(pattern)
+    for file in files:
+        content = file.read_text()
+        if "watermark semi-transparent" not in content:
+            console.print(f"[bright_blue]Adding watermark to:[/] {file}")
+            content = content + content_to_add
+            file.write_text(content)
+    target_image_location = folder_path / image_directory_path
+    target_image_location.mkdir(parents=True, exist_ok=True)
+    shutil.copy(IMAGE_FILE, target_image_location / "staging.png")
diff --git a/dev/images/staging.png b/dev/images/staging.png
new file mode 100644
index 00000000000..a7cbaf306b0
Binary files /dev/null and b/dev/images/staging.png differ