mirror of
https://codeberg.org/crowci/pages.git
synced 2025-04-18 04:44:02 +03:00
24 lines
22 KiB
HTML
24 lines
22 KiB
HTML
<!doctype html><html lang=en class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link href="https://crowci.dev/" rel="canonical"><link href=installation/ rel=next><link rel=icon href=favicon.png><meta name=generator content="mkdocs-1.6.1, mkdocs-material-9.6.5"><title>Crow CI</title><link rel=stylesheet href=assets/stylesheets/main.8608ea7d.min.css><link rel=stylesheet href=assets/stylesheets/palette.06af60db.min.css><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><link rel=stylesheet href=stylesheets/extra.css><script>__md_scope=new URL(".",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script><meta property=og:type content=website><meta property=og:title content="Crow CI"><meta property=og:description content=None><meta property=og:image content=https://crowci.dev/assets/images/social/index.png><meta property=og:image:type content=image/png><meta property=og:image:width content=1200><meta property=og:image:height content=630><meta content=https://crowci.dev/ property=og:url><meta name=twitter:card content=summary_large_image><meta name=twitter:title content="Crow CI"><meta name=twitter:description content=None><meta name=twitter:image content=https://crowci.dev/assets/images/social/index.png> <link href="assets/stylesheets/glightbox.min.css" rel="stylesheet"/><style>
|
|
html.glightbox-open { overflow: initial; height: 100%; }
|
|
.gslide-title { margin-top: 0px; user-select: text; }
|
|
.gslide-desc { color: #666; user-select: text; }
|
|
.gslide-image img { background: white; }
|
|
.gscrollbar-fixer { padding-right: 15px; }
|
|
.gdesc-inner { font-size: 0.75rem; }
|
|
body[data-md-color-scheme="slate"] .gdesc-inner { background: var(--md-default-bg-color);}
|
|
body[data-md-color-scheme="slate"] .gslide-title { color: var(--md-default-fg-color);}
|
|
body[data-md-color-scheme="slate"] .gslide-desc { color: var(--md-default-fg-color);}</style> <script src="assets/javascripts/glightbox.min.js"></script></head> <body dir=ltr data-md-color-scheme=default data-md-color-primary=indigo data-md-color-accent=indigo> <input class=md-toggle data-md-toggle=drawer type=checkbox id=__drawer autocomplete=off> <input class=md-toggle data-md-toggle=search type=checkbox id=__search autocomplete=off> <label class=md-overlay for=__drawer></label> <div data-md-component=skip> <a href=#why-self-host-cicd class=md-skip> Skip to content </a> </div> <div data-md-component=announce> </div> <header class="md-header md-header--shadow md-header--lifted" data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Header> <a href=. title="Crow CI" class="md-header__button md-logo" aria-label="Crow CI" data-md-component=logo> <img src=logo.svg alt=logo> </a> <label class="md-header__button md-icon" for=__drawer> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> </label> <div class=md-header__title data-md-component=header-title> <div class=md-header__ellipsis> <div class=md-header__topic> <span class=md-ellipsis> Crow CI </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> Getting started </span> </div> </div> </div> <form class=md-header__option data-md-component=palette> <input class=md-option data-md-color-media=(prefers-color-scheme) data-md-color-scheme=default data-md-color-primary=indigo data-md-color-accent=indigo aria-label="Switch to light mode" type=radio name=__palette id=__palette_0> <label class="md-header__button md-icon" title="Switch to light mode" for=__palette_1 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="m14.3 16-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zm-9.15 3.96h2.3L12 9z"/></svg> </label> <input class=md-option data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme=custom-light data-md-color-primary=indigo data-md-color-accent=indigo aria-label="Switch to dark mode" type=radio name=__palette id=__palette_1> <label class="md-header__button md-icon" title="Switch to dark mode" for=__palette_2 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg> </label> <input class=md-option data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme=slate data-md-color-primary=custom data-md-color-accent=indigo aria-label="Switch to system preference" type=radio name=__palette id=__palette_2> <label class="md-header__button md-icon" title="Switch to system preference" for=__palette_0 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M17 6H7c-3.31 0-6 2.69-6 6s2.69 6 6 6h10c3.31 0 6-2.69 6-6s-2.69-6-6-6m0 10H7c-2.21 0-4-1.79-4-4s1.79-4 4-4h10c2.21 0 4 1.79 4 4s-1.79 4-4 4M7 9c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3"/></svg> </label> </form> <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> <label class="md-header__button md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> </label> <div class=md-search data-md-component=search role=dialog> <label class=md-search__overlay for=__search></label> <div class=md-search__inner role=search> <form class=md-search__form name=search> <input type=text class=md-search__input name=query aria-label=Search placeholder=Search autocapitalize=off autocorrect=off autocomplete=off spellcheck=false data-md-component=search-query required> <label class="md-search__icon md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> </label> <nav class=md-search__options aria-label=Search> <button type=reset class="md-search__icon md-icon" title=Clear aria-label=Clear tabindex=-1> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> </button> </nav> <div class=md-search__suggest data-md-component=search-suggest></div> </form> <div class=md-search__output> <div class=md-search__scrollwrap tabindex=0 data-md-scrollfix> <div class=md-search-result data-md-component=search-result> <div class=md-search-result__meta> Initializing search </div> <ol class=md-search-result__list role=presentation></ol> </div> </div> </div> </div> </div> <div class=md-header__source> <a href="https://codeberg.org/crowci/crow" title="Go to repository" class="md-source" data-md-component="source"> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M11.955.49A12 12 0 0 0 0 12.49a12 12 0 0 0 1.832 6.373L11.838 5.928a.187.14 0 0 1 .324 0l10.006 12.935A12 12 0 0 0 24 12.49a12 12 0 0 0-12-12zm.375 6.467 4.416 16.553a12 12 0 0 0 5.137-4.213z"/></svg> </div> <div class=md-source__repository> crowci/crow </div> </a> </div> </nav> <nav class=md-tabs aria-label=Tabs data-md-component=tabs> <div class=md-grid> <ul class=md-tabs__list> <li class="md-tabs__item md-tabs__item--active"> <a href=. class=md-tabs__link> Getting started </a> </li> <li class=md-tabs__item> <a href=installation/ class=md-tabs__link> Installation </a> </li> <li class=md-tabs__item> <a href=configuration/ class=md-tabs__link> Configuration </a> </li> <li class=md-tabs__item> <a href=usage/ class=md-tabs__link> Usage </a> </li> <li class=md-tabs__item> <a href=plugins/ class=md-tabs__link> Plugins </a> </li> <li class=md-tabs__item> <a href=ecosystem/ class=md-tabs__link> Ecosystem </a> </li> <li class=md-tabs__item> <a href=development/ class=md-tabs__link> Development </a> </li> </ul> </div> </nav> </header> <div class=md-container data-md-component=container> <main class=md-main data-md-component=main> <div class="md-main__inner md-grid"> <div class="md-sidebar md-sidebar--primary" data-md-component=sidebar data-md-type=navigation hidden> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--primary md-nav--lifted" aria-label=Navigation data-md-level=0> <label class=md-nav__title for=__drawer> <a href=. title="Crow CI" class="md-nav__button md-logo" aria-label="Crow CI" data-md-component=logo> <img src=logo.svg alt=logo> </a> Crow CI </label> <div class=md-nav__source> <a href="https://codeberg.org/crowci/crow" title="Go to repository" class="md-source" data-md-component="source"> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M11.955.49A12 12 0 0 0 0 12.49a12 12 0 0 0 1.832 6.373L11.838 5.928a.187.14 0 0 1 .324 0l10.006 12.935A12 12 0 0 0 24 12.49a12 12 0 0 0-12-12zm.375 6.467 4.416 16.553a12 12 0 0 0 5.137-4.213z"/></svg> </div> <div class=md-source__repository> crowci/crow </div> </a> </div> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--active"> <input class="md-nav__toggle md-toggle" type=checkbox id=__toc> <label class="md-nav__link md-nav__link--active" for=__toc> <span class=md-ellipsis> Getting started </span> <span class="md-nav__icon md-icon"></span> </label> <a href=. class="md-nav__link md-nav__link--active"> <span class=md-ellipsis> Getting started </span> </a> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class=md-nav__list data-md-component=toc data-md-scrollfix> <li class=md-nav__item> <a href=#why-self-host-cicd class=md-nav__link> <span class=md-ellipsis> Why self-host CI/CD? </span> </a> </li> <li class=md-nav__item> <a href=#why-use-crow-ci-in-the-first-place class=md-nav__link> <span class=md-ellipsis> Why use Crow CI in the first place? </span> </a> </li> <li class=md-nav__item> <a href=#containers-at-the-core class=md-nav__link> <span class=md-ellipsis> Containers at the core </span> </a> </li> <li class=md-nav__item> <a href=#target-audience class=md-nav__link> <span class=md-ellipsis> Target audience </span> </a> </li> <li class=md-nav__item> <a href=#history class=md-nav__link> <span class=md-ellipsis> History </span> </a> </li> <li class=md-nav__item> <a href=#license class=md-nav__link> <span class=md-ellipsis> License </span> </a> </li> <li class=md-nav__item> <a href=#logo class=md-nav__link> <span class=md-ellipsis> Logo </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--pruned md-nav__item--nested"> <a href=installation/ class=md-nav__link> <span class=md-ellipsis> Installation </span> <span class="md-nav__icon md-icon"></span> </a> </li> <li class="md-nav__item md-nav__item--pruned md-nav__item--nested"> <a href=configuration/ class=md-nav__link> <span class=md-ellipsis> Configuration </span> <span class="md-nav__icon md-icon"></span> </a> </li> <li class="md-nav__item md-nav__item--pruned md-nav__item--nested"> <a href=usage/ class=md-nav__link> <span class=md-ellipsis> Usage </span> <span class="md-nav__icon md-icon"></span> </a> </li> <li class="md-nav__item md-nav__item--pruned md-nav__item--nested"> <a href=plugins/ class=md-nav__link> <span class=md-ellipsis> Plugins </span> <span class="md-nav__icon md-icon"></span> </a> </li> <li class="md-nav__item md-nav__item--pruned md-nav__item--nested"> <a href=ecosystem/ class=md-nav__link> <span class=md-ellipsis> Ecosystem </span> <span class="md-nav__icon md-icon"></span> </a> </li> <li class="md-nav__item md-nav__item--pruned md-nav__item--nested"> <a href=development/ class=md-nav__link> <span class=md-ellipsis> Development </span> <span class="md-nav__icon md-icon"></span> </a> </li> </ul> </nav> </div> </div> </div> <div class="md-sidebar md-sidebar--secondary" data-md-component=sidebar data-md-type=toc> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class=md-nav__list data-md-component=toc data-md-scrollfix> <li class=md-nav__item> <a href=#why-self-host-cicd class=md-nav__link> <span class=md-ellipsis> Why self-host CI/CD? </span> </a> </li> <li class=md-nav__item> <a href=#why-use-crow-ci-in-the-first-place class=md-nav__link> <span class=md-ellipsis> Why use Crow CI in the first place? </span> </a> </li> <li class=md-nav__item> <a href=#containers-at-the-core class=md-nav__link> <span class=md-ellipsis> Containers at the core </span> </a> </li> <li class=md-nav__item> <a href=#target-audience class=md-nav__link> <span class=md-ellipsis> Target audience </span> </a> </li> <li class=md-nav__item> <a href=#history class=md-nav__link> <span class=md-ellipsis> History </span> </a> </li> <li class=md-nav__item> <a href=#license class=md-nav__link> <span class=md-ellipsis> License </span> </a> </li> <li class=md-nav__item> <a href=#logo class=md-nav__link> <span class=md-ellipsis> Logo </span> </a> </li> </ul> </nav> </div> </div> </div> <div class=md-content data-md-component=content> <article class="md-content__inner md-typeset"> <a href="https://codeberg.org/crowci/crow/edit/main/docs/index.md" title="Edit this page" class="md-content__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75z"/></svg> </a> <h1>Getting started</h1> <!-- markdownlint-disable MD041 --> <p>Crow CI is a <em>Continuous Integration & Continuous Delivery</em> (CI/CD)<sup id=fnref:1><a class=footnote-ref href=#fn:1>1</a></sup> application. It is designed to be <strong>lightweight</strong>, simple to use and <strong>fast</strong>.</p> <h2 id=why-self-host-cicd>Why self-host CI/CD?</h2> <p>There are many CI/CD options offered for free. As with all hosted options which are provided for free, there are limitations and downsides. Self-hosting provides ways to get rid of these.</p> <p>For CI/CD specifically, the following limitations of public CI offerings can be tackled:</p> <ul> <li>Limited build times</li> <li>Low-performing runners</li> <li>Storing secrets on remote platforms</li> <li>Platform/Forge bound</li> </ul> <h2 id=why-use-crow-ci-in-the-first-place>Why use Crow CI in the first place?</h2> <p>Crow CI gives you full control over the selection of nodes which will process builds. You can store secrets on servers you own and run as many builds as you want. In addition, Crow CI works with many different forges (GitHub, GitLab, Gitea, Forgejo, Bitbucket), allowing you to transition between these or use a consistent CI syntax across all of them.</p> <p>Combined with the <a href=configuration/autoscaler/ >Crow CI Autoscaler</a>, you can make use of powerful CI runners on any cloud provider, giving you the full power the cloud space has to offer while keeping costs to a minimum.</p> <h2 id=containers-at-the-core>Containers at the core</h2> <p>Crow CI is a <em>container-only</em> application. This stands in contrast to other common CI/CD apps like <a href="https://docs.github.com/en/actions">GitHub Actions</a>, <a href="https://docs.gitlab.com/runner/">GitLab Runner</a>, <a href="https://www.jenkins.io/">Jenkins</a>, <a href="https://circleci.com/">Circle CI</a> or <a href="https://www.drone.io/">Drone CI</a>. While these can also execute pipelines in containers if desired, they are "host-first", i.e., by default pipelines run directly on a VM and are subsequently restricted to the OS on that VM.</p> <p>Crow in contrast only uses containers and is hence operating-system agnostic, i.e. it does not matter which OS is running on the host which is executing the pipelines.</p> <p>With respect to well-known CI/CD providers, Crow is mostly comparable to <a href="https://circleci.com/">Circle CI</a>, which is also making use of a container-only approach.</p> <h2 id=target-audience>Target audience</h2> <p>Crow CI is Apache-2.0 licensed, lightweight and can be used in private environments without restriction. It has a very small footprint (< 200 MB memory consumption) in idle and can even be installed and practically used on a Raspberry Pi with 4GB (or even less, depending on what the builds will do).</p> <p>Crow uses a SQLite by default and can do a lot with in during runtime. If you are planning a bigger instance with multiple (active) users and > 20 active repos, it is recommended to configure it with a Postgres or MariaDB database for performance reasons.<sup id=fnref:2><a class=footnote-ref href=#fn:2>2</a></sup></p> <h2 id=history>History</h2> <p>Crow has been forked from <a href="https://woodpecker-ci.org/">Woodpecker CI</a> (v3.0.0) in January 2025 from the former Woodpecker maintainer <a href="https://github.com/pat-s">@pat-s</a>. Motivation for the fork was built around the improvement of infrastructure-related processes (releases, docs, governance) and professionalizing the project ecosystem.</p> <p>Woodpecker itself is a fork of Drone CI (v0.8.91) from April 2019 with the first standalone version being released on September 9th 2019.</p> <h2 id=license>License</h2> <p>Crow CI is licensed under the Apache 2.0 license (following inheritance from Woodpecker and Drone).</p> <!-- markdownlint-disable --> <!-- markdownlint-enable --> <h2 id=logo>Logo</h2> <p>The logo was designed and kindly contributed by <a href="https://boldcrow.ai/">Bold Crow AI</a>.</p> <div class=footnote> <hr> <ol> <li id=fn:1> <p><a href="https://www.redhat.com/en/topics/devops/what-is-ci-cd">This RedHat blog post explains the concept of CI/CD in more detail.</a> <a class=footnote-backref href=#fnref:1 title="Jump back to footnote 1 in the text">↩</a></p> </li> <li id=fn:2> <p>This is primarily because Crow (still) stores pipeline logs in the DB. A refactoring to storing these outside the DB by default is planned but not yet implemented. <a class=footnote-backref href=#fnref:2 title="Jump back to footnote 2 in the text">↩</a></p> </li> </ol> </div> </article> </div> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> <button type=button class="md-top md-icon" data-md-component=top hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> Back to top </button> </main> <footer class=md-footer> <nav class="md-footer__inner md-grid" aria-label=Footer> <a href=installation/ class="md-footer__link md-footer__link--next" aria-label="Next: Index"> <div class=md-footer__title> <span class=md-footer__direction> Next </span> <div class=md-ellipsis> Index </div> </div> <div class="md-footer__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg> </div> </a> </nav> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class=md-copyright> <div class=md-copyright__highlight> Copyright © 2025 - 2025 Crow CI </div> </div> </div> </div> </footer> </div> <div class=md-dialog data-md-component=dialog> <div class="md-dialog__inner md-typeset"></div> </div> <div class=md-progress data-md-component=progress role=progressbar></div> <script id=__config type=application/json>{"base": ".", "features": ["navigation.instant", "navigation.instant.prefetch", "navigation.instant.progress", "navigation.tracking", "navigation.tabs", "navigation.tabs.sticky", "navigation.prune", "navigation.indexes", "navigation.footer", "toc.follow", "navigation.top", "search.suggest", "search.highlight", "header.autohide", "content.action.edit", "content.code.copy"], "search": "assets/javascripts/workers/search.f8cc74c7.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script> <script src=assets/javascripts/bundle.f1b6f286.min.js></script> <script src=javascripts/extra.js></script> <script id="init-glightbox">document.querySelectorAll('.glightbox').forEach(function(element) {
|
|
try {
|
|
var img = element.querySelector('img');
|
|
if (img && img.src) {
|
|
element.setAttribute('href', img.src);
|
|
} else {
|
|
console.log('No img element with src attribute found');
|
|
}
|
|
} catch (error) {
|
|
console.log('Error:', error);
|
|
}
|
|
});
|
|
const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
|
|
document$.subscribe(() => { lightbox.reload() });
|
|
</script></body> </html> |