diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000..5ef51b3086 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,29 @@ +# Ignorar Git y configuración +.git +.gitignore +.gitattributes + +# Ignorar cachés de dependencias +node_modules +bower_components +tmp +.cache + +# Ignorar archivos locales de desarrollo +.DS_Store +*.swp +*.swo +*.log + +# Ignorar artefactos de builds +bundles/ +frontend/target/ +backend/target/ +exporter/target/ +docs/_dist/ + +# Ignorar configuración de CI no necesaria +.github/ +.circleci/ +.vscode/ +.idea/ diff --git a/.github/workflows/build-bundles.yml b/.github/workflows/build-bundles.yml new file mode 100644 index 0000000000..054902a565 --- /dev/null +++ b/.github/workflows/build-bundles.yml @@ -0,0 +1,60 @@ +name: Build and Upload Penpot Bundles + +on: + workflow_dispatch: + push: + branches: + - github-actions-bundle-build + +jobs: + build-bundles: + name: Build frontend, backend, exporter and upload bundles + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build Penpot CI Builder Image + run: | + docker build \ + --build-arg EXTERNAL_UID=1000 \ + --build-arg EXTERNAL_GID=1000 \ + -t penpotapp/penpot-ci-builder:latest \ + -f docker/devenv/Dockerfile . + + - name: Run manage.sh build-bundle from host + run: ./manage.sh build-bundle + + - name: Create global README and package all bundles + run: | + echo "# Penpot Bundles" > bundles/README.md + echo "" >> bundles/README.md + echo "This package contains the automatically built Penpot artifacts (frontend, backend, and exporter) from the official repository." >> bundles/README.md + echo "" >> bundles/README.md + echo "## Contents" >> bundles/README.md + echo "" >> bundles/README.md + echo "- frontend/: Compiled frontend files of Penpot." >> bundles/README.md + echo "- backend/: Backend build artifacts of Penpot." >> bundles/README.md + echo "- exporter/: Module responsible for exporting resources from Penpot." >> bundles/README.md + echo "- README.md: This file." >> bundles/README.md + echo "" >> bundles/README.md + echo "## Usage" >> bundles/README.md + echo "" >> bundles/README.md + echo "1. Unzip the \"penpot-all-bundles.zip\" archive in your target environment." >> bundles/README.md + echo "2. Explore each subdirectory and follow the appropriate deployment steps for frontend, backend, and exporter based on your infrastructure." >> bundles/README.md + echo "3. You can use servers like NGINX to serve the frontend and Dockerized or custom environments to run backend/exporter services." >> bundles/README.md + + cd bundles + mkdir all-in-one + cp -r ../frontend ../backend ../exporter README.md all-in-one/ + zip -r penpot-all-bundles.zip all-in-one + + - name: Upload all-in-one bundle + uses: actions/upload-artifact@v4 + with: + name: penpot-all-bundles + path: bundles/penpot-all-bundles.zip diff --git a/Dockerfile.ci b/Dockerfile.ci new file mode 100644 index 0000000000..24b6664a25 --- /dev/null +++ b/Dockerfile.ci @@ -0,0 +1,16 @@ +# Dockerfile para Penpot CI Builder + +FROM penpotapp/devenv:latest + +USER root + +RUN mkdir -p /home/penpot/.cache/node/corepack/v1 && \ + chown -R 1000:1000 /home/penpot + +USER penpot +ENV HOME=/home/penpot +WORKDIR /home/penpot/penpot + +COPY . . + +RUN corepack enable && corepack prepare yarn@stable --activate diff --git a/docker/devenv/Dockerfile b/docker/devenv/Dockerfile index d9105fbe49..e5b27252c0 100644 --- a/docker/devenv/Dockerfile +++ b/docker/devenv/Dockerfile @@ -45,11 +45,18 @@ RUN set -ex; \ locale-gen; \ rm -rf /var/lib/apt/lists/*; +ARG EXTERNAL_UID=1000 +ARG EXTERNAL_GID=1000 + RUN set -ex; \ - usermod -l penpot -d /home/penpot -G users -s /bin/bash ubuntu; \ - passwd penpot -d; \ + groupmod -g $EXTERNAL_GID ubuntu || true; \ + usermod -l penpot -d /home/penpot -u $EXTERNAL_UID -g $EXTERNAL_GID -m ubuntu || true; \ + usermod -s /bin/bash penpot; \ + mkdir -p /home/penpot; \ + chown -R $EXTERNAL_UID:$EXTERNAL_GID /home/penpot; \ + passwd -d penpot || true; \ echo "penpot ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers - + RUN set -ex; \ apt-get -qq update; \ apt-get -qqy install --no-install-recommends \ diff --git a/manage.sh b/manage.sh index 5af31dd055..9bfe2f8acd 100755 --- a/manage.sh +++ b/manage.sh @@ -7,6 +7,9 @@ export DEVENV_PNAME="penpotdev"; export CURRENT_USER_ID=$(id -u); export CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD); +# Safe directory para evitar errores de ownership con Git +git config --global --add safe.directory /home/penpot/penpot || true + # Set default java options export JAVA_OPTS=${JAVA_OPTS:-"-Xmx1000m -Xms50m"}; @@ -111,14 +114,15 @@ function build { pull-devenv-if-not-exists; docker volume create ${DEVENV_PNAME}_user_data; docker run -t --rm \ - --mount source=${DEVENV_PNAME}_user_data,type=volume,target=/home/penpot/ \ - --mount source=`pwd`,type=bind,target=/home/penpot/penpot \ - -e EXTERNAL_UID=$CURRENT_USER_ID \ - -e BUILD_STORYBOOK=$BUILD_STORYBOOK \ - -e SHADOWCLJS_EXTRA_PARAMS=$SHADOWCLJS_EXTRA_PARAMS \ - -e JAVA_OPTS="$JAVA_OPTS" \ - -w /home/penpot/penpot/$1 \ - $DEVENV_IMGNAME:latest sudo -EH -u penpot ./scripts/build $version + --mount source=${DEVENV_PNAME}_user_data,type=volume,target=/home/penpot/ \ + --mount source=`pwd`,type=bind,target=/home/penpot/penpot \ + -e EXTERNAL_UID=$CURRENT_USER_ID \ + -e BUILD_STORYBOOK=$BUILD_STORYBOOK \ + -e SHADOWCLJS_EXTRA_PARAMS=$SHADOWCLJS_EXTRA_PARAMS \ + -e JAVA_OPTS="$JAVA_OPTS" \ + -w /home/penpot/penpot/$1 \ + $DEVENV_IMGNAME:latest sh -c "chown -R penpot:ubuntu /home/penpot && sudo -EH -u penpot ./scripts/build $version" + echo ">> build end: $1" }