From d833ead3de0a40bd2da00eec5d5c7b6a36a2d928 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Fri, 30 Aug 2024 10:41:53 +0200 Subject: [PATCH 1/9] Use explicit fast build without source maps and minify for testing and PullPreview (#16563) Use explicit fast build without source maps and minify for testing and PP --- docker/ci/entrypoint.sh | 2 +- docker/pullpreview/docker-compose.yml | 2 +- frontend/angular.json | 32 --------------------------- frontend/extra-webpack.config.js | 2 +- frontend/package.json | 3 +-- lib/tasks/assets.rake | 4 +--- 6 files changed, 5 insertions(+), 40 deletions(-) diff --git a/docker/ci/entrypoint.sh b/docker/ci/entrypoint.sh index 6c41d9e9cdeb..d4dc280c9223 100755 --- a/docker/ci/entrypoint.sh +++ b/docker/ci/entrypoint.sh @@ -92,7 +92,7 @@ backend_stuff() { } frontend_stuff() { - execute_quiet "DATABASE_URL=nulldb://db time bin/rails openproject:plugins:register_frontend assets:precompile" + execute_quiet "OPENPROJECT_ANGULAR_BUILD=fast DATABASE_URL=nulldb://db time bin/rails openproject:plugins:register_frontend assets:precompile" execute_quiet "cp -rp config/frontend_assets.manifest.json public/assets/frontend_assets.manifest.json" } diff --git a/docker/pullpreview/docker-compose.yml b/docker/pullpreview/docker-compose.yml index 7c9664a60635..f6a3bb409c39 100644 --- a/docker/pullpreview/docker-compose.yml +++ b/docker/pullpreview/docker-compose.yml @@ -14,7 +14,7 @@ x-defaults: &defaults build: context: . args: - OPENPROJECT_ANGULAR_UGLIFY: "false" + OPENPROJECT_ANGULAR_BUILD: "fast" restart: unless-stopped env_file: - .env.pullpreview diff --git a/frontend/angular.json b/frontend/angular.json index 4be288938831..7c48128237c2 100644 --- a/frontend/angular.json +++ b/frontend/angular.json @@ -102,38 +102,6 @@ } ] }, - "fastprod": { - "index": "", - "preserveSymlinks": true, - "optimization": false, - "outputHashing": "all", - "sourceMap": false, - "namedChunks": false, - "extractLicenses": false, - "buildOptimizer" : false, - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" - } - ] - }, - "ci": { - "index": "", - "preserveSymlinks": true, - "optimization": false, - "outputHashing": "all", - "sourceMap": false, - "namedChunks": false, - "extractLicenses": false, - "buildOptimizer" : false, - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" - } - ] - } } }, "serve": { diff --git a/frontend/extra-webpack.config.js b/frontend/extra-webpack.config.js index 2eef5b817f14..4ca5c933c4b1 100644 --- a/frontend/extra-webpack.config.js +++ b/frontend/extra-webpack.config.js @@ -5,7 +5,7 @@ module.exports = { minimizer: [ new TerserPlugin({ terserOptions: { - mangle: process.env.OPENPROJECT_ANGULAR_UGLIFY !== 'false', + mangle: process.env.OPENPROJECT_ANGULAR_BUILD !== 'fast', keep_classnames: true, keep_fnames: true, } diff --git a/frontend/package.json b/frontend/package.json index d3abc54e5c5f..373e4d8d1e1b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -161,8 +161,7 @@ }, "scripts": { "analyze": "ng build --configuration production --stats-json && webpack-bundle-analyzer -h 0.0.0.0 -p 9999 ../public/assets/frontend/stats.json", - "build:ci": "node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng build --configuration ci", - "build:fast": "OPENPROJECT_ANGULAR_UGLIFY=false node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng build --configuration fastprod", + "build:fast": "OPENPROJECT_ANGULAR_BUILD=fast node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng build --configuration production", "build": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng build --configuration production --named-chunks --source-map", "build:watch": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng build --watch --named-chunks", "tokens:generate": "theo src/app/spot/styles/tokens/tokens.yml --transform web --format sass,json --dest src/app/spot/styles/tokens/dist", diff --git a/lib/tasks/assets.rake b/lib/tasks/assets.rake index b2a3ffe3b8d3..eda73829bfd8 100644 --- a/lib/tasks/assets.rake +++ b/lib/tasks/assets.rake @@ -63,9 +63,7 @@ namespace :assets do puts "Building angular frontend" Dir.chdir Rails.root.join("frontend") do cmd = - if ENV["CI"] - "npm run build:ci" - elsif ENV["OPENPROJECT_ANGULAR_UGLIFY"] == "false" + if ENV["OPENPROJECT_ANGULAR_BUILD"] == "fast" "npm run build:fast" else "npm run build" From 77c9d76a1216d5f6a813989780a2b64a9461ed6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Fri, 30 Aug 2024 10:34:31 +0200 Subject: [PATCH 2/9] Only merge the digests from matrix.target --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 878af2a2d746..3db90e894c39 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -250,7 +250,7 @@ jobs: - name: Merge digests uses: actions/upload-artifact/merge@v4 with: - pattern: digests-* + pattern: "digests-${{ matrix.target }}-*" overwrite: true name: "merged-digests-${{ matrix.target }}-${{ github.run_number }}-${{ github.run_attempt }}" - name: Download digests From 8251ef6e44c40800cdd509e7926b282565c1e6ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Fri, 30 Aug 2024 12:43:39 +0200 Subject: [PATCH 3/9] Add release-notes file --- docs/release-notes/14-4-2/README.md | 29 +++++++++++++++++++++++++++++ docs/release-notes/README.md | 7 +++++++ 2 files changed, 36 insertions(+) create mode 100644 docs/release-notes/14-4-2/README.md diff --git a/docs/release-notes/14-4-2/README.md b/docs/release-notes/14-4-2/README.md new file mode 100644 index 000000000000..d02a1e8d6b49 --- /dev/null +++ b/docs/release-notes/14-4-2/README.md @@ -0,0 +1,29 @@ +--- +title: OpenProject 14.4.2 +sidebar_navigation: + title: 14.4.2 +release_version: 14.4.2 +release_date: 2024-08-30 +--- + +# OpenProject 14.4.2 + +Release date: 2024-08-30 + +We released OpenProject [OpenProject 14.4.2](https://community.openproject.org/versions/2117). +The release contains several bug fixes and we recommend updating to the newest version. +In these Release Notes, we will give an overview of important feature changes. +At the end, you will find a complete list of all changes and bug fixes. + + + +## Bug fixes and changes + + + + +- Bugfix: Docker: JavaScript isn't minimized \[[#57559](https://community.openproject.org/wp/57559)\] +- Bugfix: Docker slim version got pushed as all-in-one container \[[#57561](https://community.openproject.org/wp/57561)\] + + + diff --git a/docs/release-notes/README.md b/docs/release-notes/README.md index 20ef61cebbe5..6ecbe562a252 100644 --- a/docs/release-notes/README.md +++ b/docs/release-notes/README.md @@ -13,6 +13,13 @@ Stay up to date and get an overview of the new features included in the releases +## 14.4.2 + +Release date: 2024-08-30 + +[Release Notes](14-4-2/) + + ## 14.4.1 Release date: 2024-08-28 From 9f8bf446b46c464ad0987324ff86d552f56a1916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Fri, 30 Aug 2024 12:43:40 +0200 Subject: [PATCH 4/9] Bumped version to 14.4.3 [ci skip] --- lib/open_project/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/open_project/version.rb b/lib/open_project/version.rb index 082f629b9299..edd31e5d3066 100644 --- a/lib/open_project/version.rb +++ b/lib/open_project/version.rb @@ -33,7 +33,7 @@ module OpenProject module VERSION # :nodoc: MAJOR = 14 MINOR = 4 - PATCH = 2 + PATCH = 3 class << self # Used by semver to define the special version (if any). From 5ca3f5b8a8d0f18fe2ac2640484eedcf3527ce79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 2 Sep 2024 08:23:28 +0200 Subject: [PATCH 5/9] Explain how and why to create docker-compose.override.yml --- docs/installation-and-operations/configuration/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/installation-and-operations/configuration/README.md b/docs/installation-and-operations/configuration/README.md index b77b0637d13b..9f22b6325930 100644 --- a/docs/installation-and-operations/configuration/README.md +++ b/docs/installation-and-operations/configuration/README.md @@ -36,6 +36,7 @@ Configuring OpenProject through environment variables is described in detail [in ### one container per process installation +Create a file `docker-compose.override.yml` next to `docker-compose.yml` file. Docker Compose will automatically merge those files, for more information, see https://docs.docker.com/compose/multiple-compose-files/merge/. Add your custom configuration to `docker-compose.override.yml`. In the compose folder you will also find the file `docker-compose.yml` which shall **NOT** be edited. From 76b2c78a49a69c68c6c7a0213ddf9210892a4e48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Tue, 24 Sep 2024 12:57:32 +0200 Subject: [PATCH 6/9] Add release-notes file --- docs/release-notes/14-5-1/README.md | 45 +++++++++++++++++++++++++++++ docs/release-notes/README.md | 7 +++++ 2 files changed, 52 insertions(+) create mode 100644 docs/release-notes/14-5-1/README.md diff --git a/docs/release-notes/14-5-1/README.md b/docs/release-notes/14-5-1/README.md new file mode 100644 index 000000000000..37a09e27f62a --- /dev/null +++ b/docs/release-notes/14-5-1/README.md @@ -0,0 +1,45 @@ +--- +title: OpenProject 14.5.1 +sidebar_navigation: + title: 14.5.1 +release_version: 14.5.1 +release_date: 2024-09-24 +--- + +# OpenProject 14.5.1 + +Release date: 2024-09-24 + +We released OpenProject [OpenProject 14.5.1](https://community.openproject.org/versions/2118). +The release contains several bug fixes and we recommend updating to the newest version. +In these Release Notes, we will give an overview of important feature changes. +At the end, you will find a complete list of all changes and bug fixes. + + + +## Bug fixes and changes + + + + +- Bugfix: Internal server error opening budget \[[#57905](https://community.openproject.org/wp/57905)\] +- Bugfix: User can't create a new global role \[[#57906](https://community.openproject.org/wp/57906)\] +- Bugfix: German translations not complete \[[#57908](https://community.openproject.org/wp/57908)\] +- Bugfix: User can't be removed from global role \[[#57928](https://community.openproject.org/wp/57928)\] +- Bugfix: Incorrect read-only label for SSO logins \[[#57961](https://community.openproject.org/wp/57961)\] +- Bugfix: The Project Settings-Information page does not load \[[#57981](https://community.openproject.org/wp/57981)\] +- Bugfix: Bump ruby-saml to address CVE-2024-45409 \[[#57984](https://community.openproject.org/wp/57984)\] +- Bugfix: Cannot delete users who created meeting agenda items \[[#57986](https://community.openproject.org/wp/57986)\] + + + + +## Contributions +A very special thank you goes to our sponsors for this release. +Also a big thanks to our Community members for reporting bugs and helping us identify and provide fixes. +Special thanks for reporting and finding bugs go to Александр Татаринцев, Niklas Grönblom. + +Last but not least, we are very grateful for our very engaged translation contributors on Crowdin, who translated quite a few OpenProject strings! +Would you like to help out with translations yourself? +Then take a look at our translation guide and find out exactly how you can contribute. +It is very much appreciated! diff --git a/docs/release-notes/README.md b/docs/release-notes/README.md index 67fc2a42f316..29ae784e31ea 100644 --- a/docs/release-notes/README.md +++ b/docs/release-notes/README.md @@ -13,6 +13,13 @@ Stay up to date and get an overview of the new features included in the releases +## 14.5.1 + +Release date: 2024-09-24 + +[Release Notes](14-5-1/) + + ## 14.5.0 Release date: 2024-09-11 From b0018c47e01c2d23c1f4b646ab1cca0f6f65a876 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Tue, 24 Sep 2024 12:57:32 +0200 Subject: [PATCH 7/9] Bumped version to 14.5.2 [ci skip] --- lib/open_project/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/open_project/version.rb b/lib/open_project/version.rb index 93d308ae9fff..ecf66671c971 100644 --- a/lib/open_project/version.rb +++ b/lib/open_project/version.rb @@ -33,7 +33,7 @@ module OpenProject module VERSION # :nodoc: MAJOR = 14 MINOR = 5 - PATCH = 1 + PATCH = 2 class << self # Used by semver to define the special version (if any). From 209313b4bea33c6cd9f8aa64c211c7c72a83e378 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Tue, 24 Sep 2024 12:59:35 +0200 Subject: [PATCH 8/9] Update README.md --- docs/release-notes/14-5-1/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/release-notes/14-5-1/README.md b/docs/release-notes/14-5-1/README.md index 37a09e27f62a..46f7b0e9f7fb 100644 --- a/docs/release-notes/14-5-1/README.md +++ b/docs/release-notes/14-5-1/README.md @@ -12,6 +12,9 @@ Release date: 2024-09-24 We released OpenProject [OpenProject 14.5.1](https://community.openproject.org/versions/2118). The release contains several bug fixes and we recommend updating to the newest version. + +If you are using a SAML integration, this release addresses a critical vulnerability in ruby-saml: [CVE-2024-45409](https://github.com/advisories/GHSA-jw9c-mfg7-9rx2) + In these Release Notes, we will give an overview of important feature changes. At the end, you will find a complete list of all changes and bug fixes. From 18d2fe130327beb4bb718c83e1a636403bf067b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Wed, 25 Sep 2024 08:49:49 +0200 Subject: [PATCH 9/9] Add documentation and logo for artifacthub.io https://artifacthub.io/packages/container/openproject-community/community --- .github/workflows/docker.yml | 12 ++++++++---- docker/prod/README.md | 30 ++++++++++++++++++++++++++++++ docker/prod/logo.png | Bin 0 -> 3364 bytes 3 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 docker/prod/README.md create mode 100644 docker/prod/logo.png diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 3db90e894c39..cd9a80911cdd 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -174,8 +174,10 @@ jobs: with: context: git labels: | - io.artifacthub.package.readme-url=https://www.openproject.org/docs/installation-and-operations/installation/docker/ - org.opencontainers.image.documentation=https://www.openproject.org/docs/ + io.artifacthub.package.readme-url=https://raw.githubusercontent.com/opf/openproject/refs/heads/dev/docker/prod/REAMDE.md + io.artifacthub.package.logo-url=https://raw.githubusercontent.com/opf/openproject/refs/heads/dev/docker/prod/logo.png + org.opencontainers.image.source=https://github.com/opf/openproject + org.opencontainers.image.documentation=https://www.openproject.org/docs/installation-and-operations/installation/ org.opencontainers.image.vendor=OpenProject GmbH tags: | type=semver,pattern={{version}},value=${{ needs.setup.outputs.version }} @@ -272,8 +274,10 @@ jobs: with: images: ${{ env.REGISTRY_IMAGE }} labels: | - io.artifacthub.package.readme-url=https://www.openproject.org/docs/installation-and-operations/installation/docker/ - org.opencontainers.image.documentation=https://www.openproject.org/docs/ + io.artifacthub.package.readme-url=https://raw.githubusercontent.com/opf/openproject/refs/heads/dev/docker/prod/REAMDE.md + io.artifacthub.package.logo-url=https://raw.githubusercontent.com/opf/openproject/refs/heads/dev/docker/prod/logo.png + org.opencontainers.image.source=https://github.com/opf/openproject + org.opencontainers.image.documentation=https://www.openproject.org/docs/installation-and-operations/installation/ org.opencontainers.image.vendor=OpenProject GmbH flavor: | latest=false diff --git a/docker/prod/README.md b/docker/prod/README.md new file mode 100644 index 000000000000..f01cb330587c --- /dev/null +++ b/docker/prod/README.md @@ -0,0 +1,30 @@ +# OpenProject Docker images + +OpenProject publishes docker images in two varieties: + +- `dev-slim, MAJOR-slim, MAJOR.MINOR-slim, MAJOR.MINOR.PATCH-slim` for the application container to be used with an external database, proxy. For use in [Docker compose](https://www.openproject.org/docs/installation-and-operations/installation/docker-compose/), [Kubernetes and Helm charts](https://www.openproject.org/docs/installation-and-operations/installation/helm-chart/) installations +- `dev, MAJOR, MAJOR.MINOR, MAJOR.MINOR.PATCH` for the [all-in-one container](https://www.openproject.org/docs/installation-and-operations/installation/docker/). This is meant as a quick start to get OpenProject up-and-running. We recommend to use the slim container for production systems. + + + +## Docker Hub + +All images are being published on Docker Hub. For more information on the available versions, please see https://hub.docker.com/r/openproject/openproject/tags. + + + +## Installation guides + +Please see our upstream documentation guides for installing OpenProject using Docker containers: + +- [**Installation with Docker Compose (recommended)**](https://www.openproject.org/docs/installation-and-operations/installation/docker-compose/): Guide for setting up OpenProject in an isolated manner using Docker Compose +- [**Installation with single Docker container**](https://www.openproject.org/docs/installation-and-operations/installation/docker/): How to setup OpenProject as a single Docker container +- [**Installation with Helm charts (recommended for Kubernetes)**](https://www.openproject.org/docs/installation-and-operations/installation/helm-chart): Set up OpenProject using Helm charts + +OpenProject also provides other means of installation. Please see https://www.openproject.org/docs/installation-and-operations/installation/ for the full reference. + + + +## User guides + +For all information related to using OpenProject, please see our user documentation at https://www.openproject.org/docs/ diff --git a/docker/prod/logo.png b/docker/prod/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9e5b9caadbfaa4d25e6f7e209d89e8783fd67eaa GIT binary patch literal 3364 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 GG5)^|@0o-E literal 0 HcmV?d00001