[{"id":38864,"web_url":"https://patchwork.libcamera.org/comment/38864/","msgid":"<bfe0cd66-fdfc-44d8-b26e-971051d115d3@ideasonboard.com>","date":"2026-05-12T09:02:48","subject":"Re: [PATCH v2 2/2] Deploy docs to docs.libcamera.org","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"Hi\n\n2026. 05. 11. 15:48 keltezéssel, Stefan Klug írta:\n> Add a build step that deploys the docs to a server. This step\n> only runs on pushes to master and on tag builds. It requires three\n> external variables:\n> \n> DEPLOY_SSH_KEY_BASE64: base64 encoded private deploy key\n> DEPLOY_KNOWN_HOSTS: Known hosts containing the destination\n> DEPLOY_DESTINAION: user@host:/ for the rsync push\n> \n> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n> \n> ---\n> \n> Changes in v2:\n> \n> - Moved deployment into script\n> - Improved build rules\n> - Pipe ssh key into ssh agent instead of creating a file\n> ---\n>   .gitlab-ci/deploy-libcamera-docs.sh | 23 +++++++++++++++++++++++\n>   .gitlab-ci/setup-container.sh       |  2 ++\n>   gitlab-ci.yml                       | 29 ++++++++++++++++++++++++++++-\n>   3 files changed, 53 insertions(+), 1 deletion(-)\n>   create mode 100755 .gitlab-ci/deploy-libcamera-docs.sh\n> \n> diff --git a/.gitlab-ci/deploy-libcamera-docs.sh b/.gitlab-ci/deploy-libcamera-docs.sh\n> new file mode 100755\n> index 000000000000..a6936728c4a9\n> --- /dev/null\n> +++ b/.gitlab-ci/deploy-libcamera-docs.sh\n> @@ -0,0 +1,23 @@\n> +#!/bin/bash\n> +\n> +# SPDX-License-Identifier: GPL-2.0-or-later\n> +# SPDX-FileCopyrightText: © 2026 Ideas on Board\n> +#\n> +# Deploy libcamera docs\n> +\n> +set -e\n> +\n> +source \"$(dirname \"$0\")/lib.sh\"\n> +\n> +libcamera_deploy_docs() {\n> +\techo \"Deploying libcamera docs\"\n> +\n> +\trsync -rlz --delete --chmod=Do=rx,Fo=r \\\n> +          --exclude .doctrees \\\n> +          --exclude .buildinfo \\\n> +          --exclude objects.inv \\\n> +          docs/ \\\n> +          \"${DEPLOY_DESTINATION}${CI_COMMIT_REF_NAME}\"\n> +}\n> +\n> +run libcamera_deploy_docs\n> diff --git a/.gitlab-ci/setup-container.sh b/.gitlab-ci/setup-container.sh\n> index c7ca6426c3ab..6c4b439b887b 100755\n> --- a/.gitlab-ci/setup-container.sh\n> +++ b/.gitlab-ci/setup-container.sh\n> @@ -132,6 +132,8 @@ case $FDO_DISTRIBUTION_VERSION in\n>   \t\tpython3-sphinxcontrib.doxylink\n>   \t\ttexlive-latex-extra\n>   \t)\n> +\t# Packages required to deploy the documentation\n> +\tPKGS_LIBCAMERA_RUNTIME+=( openssh-client rsync )\n>   \t# Tools requires by the lint jobs.\n>   \tPKGS_LIBCAMERA_RUNTIME+=( clang-format jq python3-autopep8 reuse shellcheck )\n>   \t# libclang-rt-dev for the clang ASan runtime.\n> diff --git a/gitlab-ci.yml b/gitlab-ci.yml\n> index 7c5e59de30a1..cef5a16de20a 100644\n> --- a/gitlab-ci.yml\n> +++ b/gitlab-ci.yml\n> @@ -5,6 +5,7 @@ stages:\n>     - build\n>     - lint\n>     - test\n> +  - deploy\n>   \n>   variables:\n>     FDO_UPSTREAM_REPO: 'camera/libcamera'\n> @@ -74,7 +75,7 @@ include:\n>   .libcamera-ci.debian:13:\n>     variables:\n>       FDO_DISTRIBUTION_VERSION: 'trixie'\n> -    FDO_DISTRIBUTION_TAG: '2026-04-24.0'\n> +    FDO_DISTRIBUTION_TAG: '2026-05-06.0'\n>   \n>   .container-debian:\n>     extends:\n> @@ -438,3 +439,29 @@ test-lc-compliance:virtual:\n>     artifacts:\n>       reports:\n>         junit: build/lc-compliance-report.xml\n> +\n> +# ------------------------------------------------------------------------------\n> +# Deploy stage - deploy docs if we are building master or a tag\n> +# ------------------------------------------------------------------------------\n> +\n> +deploy-docs:\n> +  extends:\n> +    - .fdo.distribution-image@debian\n> +    - .libcamera-ci.debian:13\n> +    - .libcamera-ci.scripts\n> +  rules:\n> +    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n> +    - if: $CI_COMMIT_TAG =~ /^v([0-9]+\\.)*[0-9]+$/\n> +  environment: deploy\n\nproduction ? To me the name \"deploy\" does not seem too descriptive,\nand it also matches the name of the stage, which may be confusing.\n\n> +  stage: deploy\n> +  needs:\n> +    - job: build-docs\n> +  script:\n> +    - |\n> +      mkdir -p ~/.ssh\n> +      chmod 700 ~/.ssh\n> +      echo \"${DEPLOY_KNOWN_HOSTS}\" > ~/.ssh/known_hosts\n> +      eval $(ssh-agent -s)\n> +      echo \"${DEPLOY_SSH_KEY_BASE64}\" | base64 -d | ssh-add -\n\nWhy are these all in a single element of the `script` list?\n\n\n> +\n> +    - $CI_PROJECT_DIR/.gitlab-ci/deploy-libcamera-docs.sh","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 5A4F0BDCBD\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 12 May 2026 09:02:53 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 065706301A;\n\tTue, 12 May 2026 11:02:53 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id E406562FEA\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 12 May 2026 11:02:49 +0200 (CEST)","from [192.168.33.39] (185.182.215.166.nat.pool.zt.hu\n\t[185.182.215.166])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 8C0BF454;\n\tTue, 12 May 2026 11:02:41 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"iKkpvo5W\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1778576562;\n\tbh=vdwHnU0ikpg9scvsSXqcK0Hwgq1I2qHoL7mxtKFAjfg=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=iKkpvo5WqoR2T3TqqmqI9PDXzeuNOdRei8SKRW51m3wgAeLPv+N4izalxG4RR0B4B\n\tQkBvL6NwiPwiKmRrgZsqgvD9oiVkrDamo4V7/W1dhFibWIfgjGtju9DQ7y4ULQBcCZ\n\tqP0AwOm7FBTlpL5PVmuMGqbS+EjQ5Lc9XwYR8zwc=","Message-ID":"<bfe0cd66-fdfc-44d8-b26e-971051d115d3@ideasonboard.com>","Date":"Tue, 12 May 2026 11:02:48 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v2 2/2] Deploy docs to docs.libcamera.org","To":"Stefan Klug <stefan.klug@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20260511134817.2841886-1-stefan.klug@ideasonboard.com>\n\t<20260511134817.2841886-3-stefan.klug@ideasonboard.com>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<20260511134817.2841886-3-stefan.klug@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":38866,"web_url":"https://patchwork.libcamera.org/comment/38866/","msgid":"<177858239916.2119687.12467486302781296110@localhost>","date":"2026-05-12T10:39:59","subject":"Re: [PATCH v2 2/2] Deploy docs to docs.libcamera.org","submitter":{"id":184,"url":"https://patchwork.libcamera.org/api/people/184/","name":"Stefan Klug","email":"stefan.klug@ideasonboard.com"},"content":"Hi,\n\nThank you for the review.\n\nQuoting Barnabás Pőcze (2026-05-12 11:02:48)\n> Hi\n> \n> 2026. 05. 11. 15:48 keltezéssel, Stefan Klug írta:\n> > Add a build step that deploys the docs to a server. This step\n> > only runs on pushes to master and on tag builds. It requires three\n> > external variables:\n> > \n> > DEPLOY_SSH_KEY_BASE64: base64 encoded private deploy key\n> > DEPLOY_KNOWN_HOSTS: Known hosts containing the destination\n> > DEPLOY_DESTINAION: user@host:/ for the rsync push\n> > \n> > Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n> > \n> > ---\n> > \n> > Changes in v2:\n> > \n> > - Moved deployment into script\n> > - Improved build rules\n> > - Pipe ssh key into ssh agent instead of creating a file\n> > ---\n> >   .gitlab-ci/deploy-libcamera-docs.sh | 23 +++++++++++++++++++++++\n> >   .gitlab-ci/setup-container.sh       |  2 ++\n> >   gitlab-ci.yml                       | 29 ++++++++++++++++++++++++++++-\n> >   3 files changed, 53 insertions(+), 1 deletion(-)\n> >   create mode 100755 .gitlab-ci/deploy-libcamera-docs.sh\n> > \n> > diff --git a/.gitlab-ci/deploy-libcamera-docs.sh b/.gitlab-ci/deploy-libcamera-docs.sh\n> > new file mode 100755\n> > index 000000000000..a6936728c4a9\n> > --- /dev/null\n> > +++ b/.gitlab-ci/deploy-libcamera-docs.sh\n> > @@ -0,0 +1,23 @@\n> > +#!/bin/bash\n> > +\n> > +# SPDX-License-Identifier: GPL-2.0-or-later\n> > +# SPDX-FileCopyrightText: © 2026 Ideas on Board\n> > +#\n> > +# Deploy libcamera docs\n> > +\n> > +set -e\n> > +\n> > +source \"$(dirname \"$0\")/lib.sh\"\n> > +\n> > +libcamera_deploy_docs() {\n> > +     echo \"Deploying libcamera docs\"\n> > +\n> > +     rsync -rlz --delete --chmod=Do=rx,Fo=r \\\n> > +          --exclude .doctrees \\\n> > +          --exclude .buildinfo \\\n> > +          --exclude objects.inv \\\n> > +          docs/ \\\n> > +          \"${DEPLOY_DESTINATION}${CI_COMMIT_REF_NAME}\"\n> > +}\n> > +\n> > +run libcamera_deploy_docs\n> > diff --git a/.gitlab-ci/setup-container.sh b/.gitlab-ci/setup-container.sh\n> > index c7ca6426c3ab..6c4b439b887b 100755\n> > --- a/.gitlab-ci/setup-container.sh\n> > +++ b/.gitlab-ci/setup-container.sh\n> > @@ -132,6 +132,8 @@ case $FDO_DISTRIBUTION_VERSION in\n> >               python3-sphinxcontrib.doxylink\n> >               texlive-latex-extra\n> >       )\n> > +     # Packages required to deploy the documentation\n> > +     PKGS_LIBCAMERA_RUNTIME+=( openssh-client rsync )\n> >       # Tools requires by the lint jobs.\n> >       PKGS_LIBCAMERA_RUNTIME+=( clang-format jq python3-autopep8 reuse shellcheck )\n> >       # libclang-rt-dev for the clang ASan runtime.\n> > diff --git a/gitlab-ci.yml b/gitlab-ci.yml\n> > index 7c5e59de30a1..cef5a16de20a 100644\n> > --- a/gitlab-ci.yml\n> > +++ b/gitlab-ci.yml\n> > @@ -5,6 +5,7 @@ stages:\n> >     - build\n> >     - lint\n> >     - test\n> > +  - deploy\n> >   \n> >   variables:\n> >     FDO_UPSTREAM_REPO: 'camera/libcamera'\n> > @@ -74,7 +75,7 @@ include:\n> >   .libcamera-ci.debian:13:\n> >     variables:\n> >       FDO_DISTRIBUTION_VERSION: 'trixie'\n> > -    FDO_DISTRIBUTION_TAG: '2026-04-24.0'\n> > +    FDO_DISTRIBUTION_TAG: '2026-05-06.0'\n> >   \n> >   .container-debian:\n> >     extends:\n> > @@ -438,3 +439,29 @@ test-lc-compliance:virtual:\n> >     artifacts:\n> >       reports:\n> >         junit: build/lc-compliance-report.xml\n> > +\n> > +# ------------------------------------------------------------------------------\n> > +# Deploy stage - deploy docs if we are building master or a tag\n> > +# ------------------------------------------------------------------------------\n> > +\n> > +deploy-docs:\n> > +  extends:\n> > +    - .fdo.distribution-image@debian\n> > +    - .libcamera-ci.debian:13\n> > +    - .libcamera-ci.scripts\n> > +  rules:\n> > +    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n> > +    - if: $CI_COMMIT_TAG =~ /^v([0-9]+\\.)*[0-9]+$/\n> > +  environment: deploy\n> \n> production ? To me the name \"deploy\" does not seem too descriptive,\n> and it also matches the name of the stage, which may be confusing.\n\nActually I liked the fact that it is the same name as the stage. So it\nbecomes clear on which stage that environment is used. Naming it\nproduction leaves it completely open. As we don't have distinct\nstaging/production environments, I don't think that really fits our\ncase.\n\n> \n> > +  stage: deploy\n> > +  needs:\n> > +    - job: build-docs\n> > +  script:\n> > +    - |\n> > +      mkdir -p ~/.ssh\n> > +      chmod 700 ~/.ssh\n> > +      echo \"${DEPLOY_KNOWN_HOSTS}\" > ~/.ssh/known_hosts\n> > +      eval $(ssh-agent -s)\n> > +      echo \"${DEPLOY_SSH_KEY_BASE64}\" | base64 -d | ssh-add -\n> \n> Why are these all in a single element of the `script` list?\n> \n\nHaving a dash in front of every line clutters the code in my opinion, so\nI spit it into logical units. What is the benefit in making it\nindividual items?\n\nBest regards,\nStefan\n\n> \n> > +\n> > +    - $CI_PROJECT_DIR/.gitlab-ci/deploy-libcamera-docs.sh\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 22DE0BDCBD\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 12 May 2026 10:40:04 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 597D862FEA;\n\tTue, 12 May 2026 12:40:03 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id DBD166271A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 12 May 2026 12:40:01 +0200 (CEST)","from ideasonboard.com (unknown\n\t[IPv6:2a00:6020:448c:6c00:b16a:5ed9:4ada:a95a])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 224A3C59;\n\tTue, 12 May 2026 12:39:54 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"Kps3SJ2Q\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1778582394;\n\tbh=40mio5ItTbYtI/HKJyqqjazZ4IuFNvRc+C8S6yFJQLE=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=Kps3SJ2QnDWVkQgsbMenmyEuXU+oKZyyg81+Og5IC1reKrPOKSANvmPRq4NN2JFvD\n\tscTWpqbAo9bHtfw8hDCzqgF2rOMnKISK7Ch6ny/e3tjJBrLPLFlzyIaG2d20YeBKsZ\n\tfIxmgiFK0JMSj9o6QJdzm2SD4/ZpryigF7kFnaBQ=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<bfe0cd66-fdfc-44d8-b26e-971051d115d3@ideasonboard.com>","References":"<20260511134817.2841886-1-stefan.klug@ideasonboard.com>\n\t<20260511134817.2841886-3-stefan.klug@ideasonboard.com>\n\t<bfe0cd66-fdfc-44d8-b26e-971051d115d3@ideasonboard.com>","Subject":"Re: [PATCH v2 2/2] Deploy docs to docs.libcamera.org","From":"Stefan Klug <stefan.klug@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Tue, 12 May 2026 12:39:59 +0200","Message-ID":"<177858239916.2119687.12467486302781296110@localhost>","User-Agent":"alot/0.12.dev8+g2c003385c862.d20250602","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":38872,"web_url":"https://patchwork.libcamera.org/comment/38872/","msgid":"<52d60afa-b444-49d6-84d4-c35ee66da834@ideasonboard.com>","date":"2026-05-12T12:29:55","subject":"Re: [PATCH v2 2/2] Deploy docs to docs.libcamera.org","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"2026. 05. 12. 12:39 keltezéssel, Stefan Klug írta:\n> Hi,\n> \n> Thank you for the review.\n> \n> Quoting Barnabás Pőcze (2026-05-12 11:02:48)\n>> Hi\n>>\n>> 2026. 05. 11. 15:48 keltezéssel, Stefan Klug írta:\n>>> Add a build step that deploys the docs to a server. This step\n>>> only runs on pushes to master and on tag builds. It requires three\n>>> external variables:\n>>>\n>>> DEPLOY_SSH_KEY_BASE64: base64 encoded private deploy key\n>>> DEPLOY_KNOWN_HOSTS: Known hosts containing the destination\n>>> DEPLOY_DESTINAION: user@host:/ for the rsync push\n>>>\n>>> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n>>>\n>>> ---\n>>>\n>>> Changes in v2:\n>>>\n>>> - Moved deployment into script\n>>> - Improved build rules\n>>> - Pipe ssh key into ssh agent instead of creating a file\n>>> ---\n>>>    .gitlab-ci/deploy-libcamera-docs.sh | 23 +++++++++++++++++++++++\n>>>    .gitlab-ci/setup-container.sh       |  2 ++\n>>>    gitlab-ci.yml                       | 29 ++++++++++++++++++++++++++++-\n>>>    3 files changed, 53 insertions(+), 1 deletion(-)\n>>>    create mode 100755 .gitlab-ci/deploy-libcamera-docs.sh\n>>>\n>>> diff --git a/.gitlab-ci/deploy-libcamera-docs.sh b/.gitlab-ci/deploy-libcamera-docs.sh\n>>> new file mode 100755\n>>> index 000000000000..a6936728c4a9\n>>> --- /dev/null\n>>> +++ b/.gitlab-ci/deploy-libcamera-docs.sh\n>>> @@ -0,0 +1,23 @@\n>>> +#!/bin/bash\n>>> +\n>>> +# SPDX-License-Identifier: GPL-2.0-or-later\n>>> +# SPDX-FileCopyrightText: © 2026 Ideas on Board\n>>> +#\n>>> +# Deploy libcamera docs\n>>> +\n>>> +set -e\n>>> +\n>>> +source \"$(dirname \"$0\")/lib.sh\"\n>>> +\n>>> +libcamera_deploy_docs() {\n>>> +     echo \"Deploying libcamera docs\"\n>>> +\n>>> +     rsync -rlz --delete --chmod=Do=rx,Fo=r \\\n>>> +          --exclude .doctrees \\\n>>> +          --exclude .buildinfo \\\n>>> +          --exclude objects.inv \\\n>>> +          docs/ \\\n>>> +          \"${DEPLOY_DESTINATION}${CI_COMMIT_REF_NAME}\"\n>>> +}\n>>> +\n>>> +run libcamera_deploy_docs\n>>> diff --git a/.gitlab-ci/setup-container.sh b/.gitlab-ci/setup-container.sh\n>>> index c7ca6426c3ab..6c4b439b887b 100755\n>>> --- a/.gitlab-ci/setup-container.sh\n>>> +++ b/.gitlab-ci/setup-container.sh\n>>> @@ -132,6 +132,8 @@ case $FDO_DISTRIBUTION_VERSION in\n>>>                python3-sphinxcontrib.doxylink\n>>>                texlive-latex-extra\n>>>        )\n>>> +     # Packages required to deploy the documentation\n>>> +     PKGS_LIBCAMERA_RUNTIME+=( openssh-client rsync )\n>>>        # Tools requires by the lint jobs.\n>>>        PKGS_LIBCAMERA_RUNTIME+=( clang-format jq python3-autopep8 reuse shellcheck )\n>>>        # libclang-rt-dev for the clang ASan runtime.\n>>> diff --git a/gitlab-ci.yml b/gitlab-ci.yml\n>>> index 7c5e59de30a1..cef5a16de20a 100644\n>>> --- a/gitlab-ci.yml\n>>> +++ b/gitlab-ci.yml\n>>> @@ -5,6 +5,7 @@ stages:\n>>>      - build\n>>>      - lint\n>>>      - test\n>>> +  - deploy\n>>>    \n>>>    variables:\n>>>      FDO_UPSTREAM_REPO: 'camera/libcamera'\n>>> @@ -74,7 +75,7 @@ include:\n>>>    .libcamera-ci.debian:13:\n>>>      variables:\n>>>        FDO_DISTRIBUTION_VERSION: 'trixie'\n>>> -    FDO_DISTRIBUTION_TAG: '2026-04-24.0'\n>>> +    FDO_DISTRIBUTION_TAG: '2026-05-06.0'\n>>>    \n>>>    .container-debian:\n>>>      extends:\n>>> @@ -438,3 +439,29 @@ test-lc-compliance:virtual:\n>>>      artifacts:\n>>>        reports:\n>>>          junit: build/lc-compliance-report.xml\n>>> +\n>>> +# ------------------------------------------------------------------------------\n>>> +# Deploy stage - deploy docs if we are building master or a tag\n>>> +# ------------------------------------------------------------------------------\n>>> +\n>>> +deploy-docs:\n>>> +  extends:\n>>> +    - .fdo.distribution-image@debian\n>>> +    - .libcamera-ci.debian:13\n>>> +    - .libcamera-ci.scripts\n>>> +  rules:\n>>> +    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n>>> +    - if: $CI_COMMIT_TAG =~ /^v([0-9]+\\.)*[0-9]+$/\n>>> +  environment: deploy\n>>\n>> production ? To me the name \"deploy\" does not seem too descriptive,\n>> and it also matches the name of the stage, which may be confusing.\n> \n> Actually I liked the fact that it is the same name as the stage. So it\n\nI see, then let's stick with that.\n\n\n> becomes clear on which stage that environment is used. Naming it\n> production leaves it completely open. As we don't have distinct\n> staging/production environments, I don't think that really fits our\n> case.\n\nArguably there is only \"production\" in this case.\n\n\n> \n>>\n>>> +  stage: deploy\n>>> +  needs:\n>>> +    - job: build-docs\n>>> +  script:\n>>> +    - |\n>>> +      mkdir -p ~/.ssh\n>>> +      chmod 700 ~/.ssh\n>>> +      echo \"${DEPLOY_KNOWN_HOSTS}\" > ~/.ssh/known_hosts\n>>> +      eval $(ssh-agent -s)\n>>> +      echo \"${DEPLOY_SSH_KEY_BASE64}\" | base64 -d | ssh-add -\n>>\n>> Why are these all in a single element of the `script` list?\n>>\n> \n> Having a dash in front of every line clutters the code in my opinion, so\n> I spit it into logical units. What is the benefit in making it\n> individual items?\n\nMost other script blocks have one invocation per item, so it looked\na bit out of place, that's why I asked. I don't think there is any\nbenefit.\n\n\n> \n> Best regards,\n> Stefan\n> \n>>\n>>> +\n>>> +    - $CI_PROJECT_DIR/.gitlab-ci/deploy-libcamera-docs.sh\n>>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id B4B80BDCBD\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 12 May 2026 12:30:00 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5C71B6302B;\n\tTue, 12 May 2026 14:30:00 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6610762FEA\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 12 May 2026 14:29:58 +0200 (CEST)","from [192.168.33.39] (185.182.215.166.nat.pool.zt.hu\n\t[185.182.215.166])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id A500218C7;\n\tTue, 12 May 2026 14:29:50 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"ST3dXWAw\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1778588990;\n\tbh=U2waOtKHS/MDyWLW1BdEikyFB1IU1a2Gr41z+R0aaKM=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=ST3dXWAwZbyOCQMQZidMpcpYR+G+qw8FXDsCSKhglOkk9XltUF1NYSQ6dQojh3auM\n\tmFHS7LRY4EIHO6BDTsshIqoo/xhAdZ+zjAeEE00pj2dYIcjJDAS7aqXuLnyqdzXmbj\n\tMfh8CVXOEF8r6VMWIbjqbBjMlKWfh6pOHk2Yx9uQ=","Message-ID":"<52d60afa-b444-49d6-84d4-c35ee66da834@ideasonboard.com>","Date":"Tue, 12 May 2026 14:29:55 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v2 2/2] Deploy docs to docs.libcamera.org","To":"Stefan Klug <stefan.klug@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20260511134817.2841886-1-stefan.klug@ideasonboard.com>\n\t<20260511134817.2841886-3-stefan.klug@ideasonboard.com>\n\t<bfe0cd66-fdfc-44d8-b26e-971051d115d3@ideasonboard.com>\n\t<177858239916.2119687.12467486302781296110@localhost>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<177858239916.2119687.12467486302781296110@localhost>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":38884,"web_url":"https://patchwork.libcamera.org/comment/38884/","msgid":"<20260512231854.GA237815@killaraus.ideasonboard.com>","date":"2026-05-12T23:18:54","subject":"Re: [PATCH v2 2/2] Deploy docs to docs.libcamera.org","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Stefan,\n\nThank you for the patch.\n\nOn Mon, May 11, 2026 at 03:48:05PM +0200, Stefan Klug wrote:\n> Add a build step that deploys the docs to a server. This step\n> only runs on pushes to master and on tag builds. It requires three\n> external variables:\n> \n> DEPLOY_SSH_KEY_BASE64: base64 encoded private deploy key\n> DEPLOY_KNOWN_HOSTS: Known hosts containing the destination\n> DEPLOY_DESTINAION: user@host:/ for the rsync push\n> \n> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n> \n> ---\n> \n> Changes in v2:\n> \n> - Moved deployment into script\n> - Improved build rules\n> - Pipe ssh key into ssh agent instead of creating a file\n> ---\n>  .gitlab-ci/deploy-libcamera-docs.sh | 23 +++++++++++++++++++++++\n>  .gitlab-ci/setup-container.sh       |  2 ++\n>  gitlab-ci.yml                       | 29 ++++++++++++++++++++++++++++-\n>  3 files changed, 53 insertions(+), 1 deletion(-)\n>  create mode 100755 .gitlab-ci/deploy-libcamera-docs.sh\n> \n> diff --git a/.gitlab-ci/deploy-libcamera-docs.sh b/.gitlab-ci/deploy-libcamera-docs.sh\n> new file mode 100755\n> index 000000000000..a6936728c4a9\n> --- /dev/null\n> +++ b/.gitlab-ci/deploy-libcamera-docs.sh\n> @@ -0,0 +1,23 @@\n> +#!/bin/bash\n> +\n> +# SPDX-License-Identifier: GPL-2.0-or-later\n> +# SPDX-FileCopyrightText: © 2026 Ideas on Board\n> +#\n> +# Deploy libcamera docs\n> +\n> +set -e\n> +\n> +source \"$(dirname \"$0\")/lib.sh\"\n> +\n> +libcamera_deploy_docs() {\n> +\techo \"Deploying libcamera docs\"\n> +\n> +\trsync -rlz --delete --chmod=Do=rx,Fo=r \\\n> +          --exclude .doctrees \\\n> +          --exclude .buildinfo \\\n> +          --exclude objects.inv \\\n> +          docs/ \\\n> +          \"${DEPLOY_DESTINATION}${CI_COMMIT_REF_NAME}\"\n> +}\n> +\n> +run libcamera_deploy_docs\n> diff --git a/.gitlab-ci/setup-container.sh b/.gitlab-ci/setup-container.sh\n> index c7ca6426c3ab..6c4b439b887b 100755\n> --- a/.gitlab-ci/setup-container.sh\n> +++ b/.gitlab-ci/setup-container.sh\n> @@ -132,6 +132,8 @@ case $FDO_DISTRIBUTION_VERSION in\n>  \t\tpython3-sphinxcontrib.doxylink\n>  \t\ttexlive-latex-extra\n>  \t)\n> +\t# Packages required to deploy the documentation\n> +\tPKGS_LIBCAMERA_RUNTIME+=( openssh-client rsync )\n>  \t# Tools requires by the lint jobs.\n>  \tPKGS_LIBCAMERA_RUNTIME+=( clang-format jq python3-autopep8 reuse shellcheck )\n>  \t# libclang-rt-dev for the clang ASan runtime.\n> diff --git a/gitlab-ci.yml b/gitlab-ci.yml\n> index 7c5e59de30a1..cef5a16de20a 100644\n> --- a/gitlab-ci.yml\n> +++ b/gitlab-ci.yml\n> @@ -5,6 +5,7 @@ stages:\n>    - build\n>    - lint\n>    - test\n> +  - deploy\n>  \n>  variables:\n>    FDO_UPSTREAM_REPO: 'camera/libcamera'\n> @@ -74,7 +75,7 @@ include:\n>  .libcamera-ci.debian:13:\n>    variables:\n>      FDO_DISTRIBUTION_VERSION: 'trixie'\n> -    FDO_DISTRIBUTION_TAG: '2026-04-24.0'\n> +    FDO_DISTRIBUTION_TAG: '2026-05-06.0'\n>  \n>  .container-debian:\n>    extends:\n> @@ -438,3 +439,29 @@ test-lc-compliance:virtual:\n>    artifacts:\n>      reports:\n>        junit: build/lc-compliance-report.xml\n> +\n> +# ------------------------------------------------------------------------------\n> +# Deploy stage - deploy docs if we are building master or a tag\n> +# ------------------------------------------------------------------------------\n> +\n> +deploy-docs:\n> +  extends:\n> +    - .fdo.distribution-image@debian\n> +    - .libcamera-ci.debian:13\n> +    - .libcamera-ci.scripts\n> +  rules:\n> +    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n> +    - if: $CI_COMMIT_TAG =~ /^v([0-9]+\\.)*[0-9]+$/\n> +  environment: deploy\n> +  stage: deploy\n> +  needs:\n> +    - job: build-docs\n> +  script:\n> +    - |\n> +      mkdir -p ~/.ssh\n> +      chmod 700 ~/.ssh\n> +      echo \"${DEPLOY_KNOWN_HOSTS}\" > ~/.ssh/known_hosts\n> +      eval $(ssh-agent -s)\n> +      echo \"${DEPLOY_SSH_KEY_BASE64}\" | base64 -d | ssh-add -\n\nI'm still not sure why you don't use a file secret.\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> +\n> +    - $CI_PROJECT_DIR/.gitlab-ci/deploy-libcamera-docs.sh","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 8D048BDB1C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 12 May 2026 23:18:58 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B104863025;\n\tWed, 13 May 2026 01:18:57 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 0701A62DC4\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 13 May 2026 01:18:56 +0200 (CEST)","from killaraus.ideasonboard.com\n\t(2001-14ba-70f3-e800--a06.rev.dnainternet.fi\n\t[IPv6:2001:14ba:70f3:e800::a06])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id A7D308E0;\n\tWed, 13 May 2026 01:18:47 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"HNLNMV4v\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1778627927;\n\tbh=Uo4hEpTuNy5XBNQP7ITPye5HTgwR06320BuFg68DBzw=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=HNLNMV4vVwtSHlkMzBi/zAa3xBo3t9zxJD4mPFUyKuHbSi4EGMYpOwENTMzX+Mh5x\n\tT5BBLRYVVeUXrbqwgPwRmTdfN4D2KBVTwxP+A4j+iMqmohgmmS5UjqYQhus8XR1Mhc\n\thSVVCNC7yJ8+mtnVyfPfi79VIqrIi3mogWL49Q/I=","Date":"Wed, 13 May 2026 02:18:54 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Stefan Klug <stefan.klug@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v2 2/2] Deploy docs to docs.libcamera.org","Message-ID":"<20260512231854.GA237815@killaraus.ideasonboard.com>","References":"<20260511134817.2841886-1-stefan.klug@ideasonboard.com>\n\t<20260511134817.2841886-3-stefan.klug@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20260511134817.2841886-3-stefan.klug@ideasonboard.com>","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]