Merge current 'v3.0' into master

This commit is contained in:
mmatur 2024-06-11 09:50:40 +02:00
commit 3f48e6f8ef
No known key found for this signature in database
GPG key ID: 2FFE42FC256CFF8E
38 changed files with 180 additions and 106 deletions

View file

@ -20,9 +20,21 @@ jobs:
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Setup node
uses: actions/setup-node@v4
with:
node-version-file: webui/.nvmrc
cache: yarn
cache-dependency-path: webui/yarn.lock
- name: Build webui - name: Build webui
working-directory: ./webui
run: |
yarn install
yarn build
- name: Package webui
run: | run: |
make clean-webui generate-webui
tar czvf webui.tar.gz ./webui/static/ tar czvf webui.tar.gz ./webui/static/
- name: Artifact webui - name: Artifact webui

View file

@ -25,9 +25,18 @@ jobs:
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Setup node
uses: actions/setup-node@v4
with:
node-version-file: webui/.nvmrc
cache: yarn
cache-dependency-path: webui/yarn.lock
- name: Build webui - name: Build webui
working-directory: ./webui
run: | run: |
make clean-webui generate-webui yarn install
yarn build
- name: Set up Go ${{ env.GO_VERSION }} - name: Set up Go ${{ env.GO_VERSION }}
uses: actions/setup-go@v5 uses: actions/setup-go@v5

View file

@ -39,7 +39,7 @@ jobs:
fail-fast: true fail-fast: true
matrix: matrix:
parallel: [12] parallel: [12]
index: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11] index: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
steps: steps:
- name: Check out code - name: Check out code

View file

@ -29,3 +29,24 @@ jobs:
- name: Tests - name: Tests
run: make test-unit run: make test-unit
test-ui-unit:
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version-file: webui/.nvmrc
cache: 'yarn'
cache-dependency-path: webui/yarn.lock
- name: UI unit tests
run: |
yarn --cwd webui install
yarn --cwd webui test:unit:ci

View file

@ -8,7 +8,7 @@ on:
env: env:
GO_VERSION: '1.22' GO_VERSION: '1.22'
GOLANGCI_LINT_VERSION: v1.59.0 GOLANGCI_LINT_VERSION: v1.59.0
MISSSPELL_VERSION: v0.4.1 MISSSPELL_VERSION: v0.6.0
jobs: jobs:

View file

@ -1,3 +1,32 @@
## [v3.0.2](https://github.com/traefik/traefik/tree/v3.0.2) (2024-06-10)
[All Commits](https://github.com/traefik/traefik/compare/v3.0.1...v3.0.2)
**Bug fixes:**
- **[logs]** Bump OTel dependencies ([#10763](https://github.com/traefik/traefik/pull/10763) by [DrFaust92](https://github.com/DrFaust92))
- **[logs]** Append to log file if it exists ([#10756](https://github.com/traefik/traefik/pull/10756) by [lbenguigui](https://github.com/lbenguigui))
- **[metrics]** Fix service name label_replace in Grafana ([#10758](https://github.com/traefik/traefik/pull/10758) by [xdavidwu](https://github.com/xdavidwu))
- **[middleware]** Forward the correct status code when compression is disabled within the Brotli handler ([#10780](https://github.com/traefik/traefik/pull/10780) by [rtribotte](https://github.com/rtribotte))
- **[middleware]** Support Accept-Encoding header weights with Compress middleware ([#10777](https://github.com/traefik/traefik/pull/10777) by [ldez](https://github.com/ldez))
**Documentation:**
- Update v2 > v3 migration guide ([#10728](https://github.com/traefik/traefik/pull/10728) by [0anas01](https://github.com/0anas01))
**Misc:**
- Merge current v2.11 into v3.0 ([#10796](https://github.com/traefik/traefik/pull/10796) by [kevinpollet](https://github.com/kevinpollet))
- Merge current v2.11 into v3.0 ([#10781](https://github.com/traefik/traefik/pull/10781) by [ldez](https://github.com/ldez))
## [v2.11.4](https://github.com/traefik/traefik/tree/v2.11.4) (2024-06-10)
[All Commits](https://github.com/traefik/traefik/compare/v2.11.3...v2.11.4)
**Bug fixes:**
- **[acme]** Update go-acme/lego to v4.17.3 ([#10768](https://github.com/traefik/traefik/pull/10768) by [ldez](https://github.com/ldez))
**Documentation:**
- **[acme]** Fix .com and .org domain examples ([#10635](https://github.com/traefik/traefik/pull/10635) by [rptaylor](https://github.com/rptaylor))
- **[middleware]** Add a note about the Ratelimit middleware's behavior when the sourceCriterion header is missing ([#10752](https://github.com/traefik/traefik/pull/10752) by [dgutzmann](https://github.com/dgutzmann))
- Add user guides link to getting started ([#10785](https://github.com/traefik/traefik/pull/10785) by [norlinhenrik](https://github.com/norlinhenrik))
- Remove helm default repo warning as repo has been long deprecated ([#10772](https://github.com/traefik/traefik/pull/10772) by [corneliusroemer](https://github.com/corneliusroemer))
## [v3.0.1](https://github.com/traefik/traefik/tree/v3.0.1) (2024-05-22) ## [v3.0.1](https://github.com/traefik/traefik/tree/v3.0.1) (2024-05-22)
[All Commits](https://github.com/traefik/traefik/compare/v3.0.0...v3.0.1) [All Commits](https://github.com/traefik/traefik/compare/v3.0.0...v3.0.1)

View file

@ -88,7 +88,7 @@ crossbinary-default: generate generate-webui
.PHONY: test .PHONY: test
#? test: Run the unit and integration tests #? test: Run the unit and integration tests
test: test-unit test-integration test: test-ui-unit test-unit test-integration
.PHONY: test-unit .PHONY: test-unit
#? test-unit: Run the unit tests #? test-unit: Run the unit tests
@ -105,6 +105,13 @@ test-integration: binary
test-gateway-api-conformance: build-image-dirty test-gateway-api-conformance: build-image-dirty
GOOS=$(GOOS) GOARCH=$(GOARCH) go test ./integration -v -test.run K8sConformanceSuite -k8sConformance $(TESTFLAGS) GOOS=$(GOOS) GOARCH=$(GOARCH) go test ./integration -v -test.run K8sConformanceSuite -k8sConformance $(TESTFLAGS)
.PHONY: test-ui-unit
#? test-ui-unit: Run the unit tests for the webui
test-ui-unit:
$(MAKE) build-webui-image
docker run --rm -v "$(PWD)/webui/static":'/src/webui/static' traefik-webui yarn --cwd webui install
docker run --rm -v "$(PWD)/webui/static":'/src/webui/static' traefik-webui yarn --cwd webui test:unit:ci
.PHONY: pull-images .PHONY: pull-images
#? pull-images: Pull all Docker images to avoid timeout during integration tests #? pull-images: Pull all Docker images to avoid timeout during integration tests
pull-images: pull-images:

View file

@ -1,4 +1,4 @@
FROM alpine:3.18 as alpine FROM alpine:3.20
RUN apk --no-cache --no-progress add \ RUN apk --no-cache --no-progress add \
build-base \ build-base \

View file

@ -119,6 +119,6 @@ IP: 172.27.0.4
!!! question "Where to Go Next?" !!! question "Where to Go Next?"
Now that you have a basic understanding of how Traefik can automatically create the routes to your services and load balance them, it is time to dive into [the documentation](/ "Link to the docs landing page") and let Traefik work for you! Now that you have a basic understanding of how Traefik can automatically create the routes to your services and load balance them, it is time to dive into [the user guides](../../user-guides/docker-compose/basic-example/ "Link to the user guides") and [the documentation](/ "Link to the docs landing page") and let Traefik work for you!
{!traefik-for-business-applications.md!} {!traefik-for-business-applications.md!}

View file

@ -1,10 +1,12 @@
FROM alpine:3.14 FROM alpine:3.20
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/.local/bin ENV PATH="${PATH}:/venv/bin"
COPY requirements.txt /mkdocs/ COPY requirements.txt /mkdocs/
WORKDIR /mkdocs WORKDIR /mkdocs
VOLUME /mkdocs VOLUME /mkdocs
RUN apk --no-cache --no-progress add py3-pip gcc musl-dev python3-dev \ RUN apk --no-cache --no-progress add py3-pip gcc musl-dev python3-dev \
&& pip3 install --user -r requirements.txt && python3 -m venv /venv \
&& source /venv/bin/activate \
&& pip3 install -r requirements.txt

View file

@ -1,45 +1,23 @@
mkdocs==1.2.2 markdown-include==0.5.1
mkdocs==1.2.4
mkdocs-exclude==1.0.2
mkdocs-traefiklabs>=100.0.7 mkdocs-traefiklabs>=100.0.7
appdirs==1.4.4 click==8.1.7
CacheControl==0.12.6 colorama==0.4.6
certifi==2020.12.5 ghp-import==2.1.0
chardet==4.0.0 importlib_metadata==7.1.0
click==8.0.4 Jinja2==3.1.3
colorama==0.4.4
contextlib2==0.6.0
distlib==0.3.1
distro==1.5.0
ghp-import==2.0.2
html5lib==1.1
idna==3.2
importlib-metadata==4.11.3
Jinja2==3.0.0
lockfile==0.12.2
Markdown==3.3.6 Markdown==3.3.6
markdown-include==0.5.1 MarkupSafe==2.1.5
MarkupSafe==2.1.1
mergedeep==1.3.4 mergedeep==1.3.4
mkdocs-bootswatch==1.0 mkdocs-material-extensions==1.3.1
mkdocs-exclude==1.0.2 packaging==24.0
mkdocs-material-extensions==1.0.3 Pygments==2.18.0
msgpack==1.0.2
ordered-set==4.0.2
packaging==20.9
pep517==0.10.0
progress==1.5
Pygments==2.11.2
pymdown-extensions==7.0 pymdown-extensions==7.0
pyparsing==2.4.7 python-dateutil==2.9.0.post0
python-dateutil==2.8.2
PyYAML==6.0.1 PyYAML==6.0.1
pyyaml-env-tag==0.1 pyyaml_env_tag==0.1
requests==2.25.1 six==1.16.0
retrying==1.3.3 watchdog==4.0.0
six==1.15.0 zipp==3.18.1
toml==0.10.2
urllib3==1.26.5
watchdog==2.1.7
webencodings==0.5.1
zipp==3.7.0

View file

@ -1 +0,0 @@
3.7

View file

@ -4,11 +4,11 @@ RepositoryName = "traefik"
OutputType = "file" OutputType = "file"
FileName = "traefik_changelog.md" FileName = "traefik_changelog.md"
# example new bugfix v3.0.1 # example new bugfix v3.0.2
CurrentRef = "v3.0" CurrentRef = "v3.0"
PreviousRef = "v3.0.0" PreviousRef = "v3.0.1"
BaseBranch = "v3.0" BaseBranch = "v3.0"
FutureCurrentRefName = "v3.0.1" FutureCurrentRefName = "v3.0.2"
ThresholdPreviousRef = 10 ThresholdPreviousRef = 10
ThresholdCurrentRef = 10 ThresholdCurrentRef = 10

View file

@ -1,4 +1,4 @@
FROM node:20.11 FROM node:20.14
# Current Active LTS release according to (https://nodejs.org/en/about/releases/) # Current Active LTS release according to (https://nodejs.org/en/about/releases/)
ENV WEBUI_DIR /src/webui ENV WEBUI_DIR /src/webui

View file

@ -8,10 +8,10 @@
"scripts": { "scripts": {
"transfer": "node dev/scripts/transfer.js", "transfer": "node dev/scripts/transfer.js",
"lint": "eslint --ext .js,.vue src", "lint": "eslint --ext .js,.vue src",
"dev": "export APP_ENV='development' && quasar dev", "dev": "APP_ENV=development quasar dev",
"build-quasar": "quasar build", "build-quasar": "quasar build",
"build-staging": "export NODE_ENV='production' && export APP_ENV='development' && yarn build-quasar", "build-staging": "NODE_ENV=production APP_ENV=development yarn build-quasar",
"build": "export NODE_ENV='production' && export APP_ENV='production' && yarn build-quasar && yarn transfer spa", "build": "NODE_ENV=production APP_ENV=production yarn build-quasar && yarn transfer spa",
"build:nc": "yarn build", "build:nc": "yarn build",
"test": "echo \"See package.json => scripts for available tests.\" && exit 0", "test": "echo \"See package.json => scripts for available tests.\" && exit 0",
"test:unit": "vitest", "test:unit": "vitest",
@ -56,6 +56,7 @@
"engines": { "engines": {
"node": "^20 || ^18 || ^16", "node": "^20 || ^18 || ^16",
"npm": ">= 6.13.4", "npm": ">= 6.13.4",
"yarn": ">= 1.21.1" "yarn": ">= 1.22.22"
} },
"packageManager": "yarn@1.22.22"
} }

View file

@ -20,7 +20,7 @@ make clean-webui generate-webui # Generate static contents in `webui/static/` fo
## How to build (only for frontend developer) ## How to build (only for frontend developer)
- prerequisite: [Node 20.11+](https://nodejs.org) [Yarn 1.22.19](https://yarnpkg.com/) - prerequisite: [Node 20.14+](https://nodejs.org) [Yarn 1.22.22](https://yarnpkg.com/)
- Go to the `webui/` directory - Go to the `webui/` directory

View file

@ -24,7 +24,7 @@ import { defineComponent } from 'vue'
export default defineComponent({ export default defineComponent({
name: 'AvatarState', name: 'AvatarState',
props: { props: {
state: String state: { type: String, default: undefined, required: false }
} }
}) })
</script> </script>

View file

@ -128,13 +128,14 @@ export default defineComponent({
QPageScroller QPageScroller
}, },
props: { props: {
data: Object, data: { type: Object, default: undefined, required: false },
columns: Array[Object], columns: Array[Object],
loading: Boolean, loading: Boolean,
onLoadMore: Function, onLoadMore: { type: Function, default: undefined, required: false },
endReached: Boolean, endReached: Boolean,
onRowClick: Function onRowClick: { type: Function, default: undefined, required: false }
}, },
emits: ['update:currentSort', 'update:currentSortDir'],
data () { data () {
return { return {
currentSort: 'name', currentSort: 'name',

View file

@ -137,7 +137,7 @@ export default {
filters: { filters: {
}, },
props: { props: {
data: Object, data: { type: Object, default: undefined, required: false },
dense: Boolean dense: Boolean
}, },
computed: { computed: {

View file

@ -75,8 +75,8 @@
ERRORS ERRORS
</div> </div>
<q-chip <q-chip
v-for="(errorMsg, index) in middleware.error" v-for="(errorMsg, errorIndex) in middleware.error"
:key="index" :key="errorIndex"
class="app-chip app-chip-error" class="app-chip app-chip-error"
> >
{{ errorMsg }} {{ errorMsg }}

View file

@ -70,7 +70,7 @@
export default { export default {
name: 'PanelMirroringServices', name: 'PanelMirroringServices',
props: { props: {
data: Object, data: { type: Object, default: undefined, required: false },
dense: Boolean dense: Boolean
}, },
computed: { computed: {

View file

@ -146,8 +146,8 @@ export default defineComponent({
AvatarState AvatarState
}, },
props: { props: {
data: Object, data: { type: Object, default: undefined, required: false },
protocol: String protocol: { type: String, default: undefined, required: false }
}, },
computed: { computed: {
getProviderLogoPath () { getProviderLogoPath () {

View file

@ -102,7 +102,7 @@ export default defineComponent({
AvatarState AvatarState
}, },
props: { props: {
data: Object, data: { type: Object, default: undefined, required: false },
dense: Boolean, dense: Boolean,
hasStatus: Boolean hasStatus: Boolean
}, },

View file

@ -155,7 +155,7 @@ export default defineComponent({
StickyServiceDetails StickyServiceDetails
}, },
props: { props: {
data: Object, data: { type: Object, default: undefined, required: false },
dense: Boolean dense: Boolean
}, },
computed: { computed: {

View file

@ -77,12 +77,12 @@
{{ domain.main }} {{ domain.main }}
</q-chip> </q-chip>
<q-chip <q-chip
v-for="(domain, key) in domain.sans" v-for="(sanDomain, sanKey) in domain.sans"
:key="key" :key="sanKey"
dense dense
class="app-chip app-chip-entry-points" class="app-chip app-chip-entry-points"
> >
{{ domain }} {{ sanDomain }}
</q-chip> </q-chip>
</div> </div>
</div> </div>
@ -130,8 +130,8 @@ export default defineComponent({
BooleanState BooleanState
}, },
props: { props: {
data: Object, data: { type: Object, default: undefined, required: false },
protocol: String protocol: { type: String, default: undefined, required: false }
} }
}) })
</script> </script>

View file

@ -66,7 +66,7 @@ export default defineComponent({
name: 'PanelWeightedServices', name: 'PanelWeightedServices',
components: {}, components: {},
props: { props: {
data: Object, data: { type: Object, default: undefined, required: false },
dense: Boolean dense: Boolean
}, },
computed: { computed: {

View file

@ -9,7 +9,7 @@ import { defineComponent } from 'vue'
export default defineComponent({ export default defineComponent({
props: { props: {
name: String name: { type: String, default: undefined, required: false }
}, },
computed: { computed: {
getLogoPath () { getLogoPath () {

View file

@ -23,6 +23,7 @@ export default defineComponent({
props: { props: {
isOpen: Boolean isOpen: Boolean
}, },
emits: ['onClose'],
methods: { methods: {
close () { close () {
this.$emit('onClose') this.$emit('onClose')

View file

@ -10,20 +10,20 @@ export default {
name: 'SkeletonBox', name: 'SkeletonBox',
props: { props: {
maxWidth: { maxWidth: {
default: 100, type: Number,
type: Number default: 100
}, },
minWidth: { minWidth: {
default: 80, type: Number,
type: Number default: 80
}, },
height: { height: {
default: '2em', type: String,
type: String default: '2em'
}, },
width: { width: {
default: null, type: String,
type: String default: null
} }
}, },
computed: { computed: {

View file

@ -55,7 +55,7 @@ export default defineComponent({
BooleanState BooleanState
}, },
props: { props: {
sticky: Object, sticky: { type: Object, default: undefined, required: false },
dense: Boolean dense: Boolean
} }
}) })

View file

@ -42,9 +42,10 @@ import Helps from '../../_helpers/Helps'
export default defineComponent({ export default defineComponent({
name: 'ToolBarTable', name: 'ToolBarTable',
props: { props: {
status: String, status: { type: String, default: undefined, required: false },
filter: String filter: { type: String, default: undefined, required: false }
}, },
emits: ['update:status', 'update:filter'],
computed: { computed: {
getStatus: { getStatus: {
get () { get () {

View file

@ -118,9 +118,9 @@ export default defineComponent({
AvatarState AvatarState
}, },
props: { props: {
name: String, name: { type: String, default: undefined, required: false },
data: Object, data: { type: Object, default: undefined, required: false },
type: String type: { type: String, default: undefined, required: false }
}, },
data () { data () {
return { return {

View file

@ -28,11 +28,11 @@ import { defineComponent } from 'vue'
export default defineComponent({ export default defineComponent({
name: 'PanelEntry', name: 'PanelEntry',
props: { props: {
address: String, address: { type: String, default: undefined, required: false },
name: String, name: { type: String, default: undefined, required: false },
type: String, type: { type: String, default: undefined, required: false },
focus: Boolean, focus: Boolean,
exSize: Number exSize: { type: Number, default: undefined, required: false }
} }
}) })
</script> </script>

View file

@ -28,7 +28,10 @@
<script> <script>
export default { export default {
name: 'PanelFeature', name: 'PanelFeature',
props: ['featureKey', 'featureVal'], props: {
featureKey: { type: String, default: undefined, required: false },
featureVal: { type: [String, Boolean], default: undefined, required: false }
},
computed: { computed: {
isString () { isString () {
return typeof this.featureVal === 'string' return typeof this.featureVal === 'string'

View file

@ -6,7 +6,10 @@
<q-card-section> <q-card-section>
<div class="row items-center no-wrap"> <div class="row items-center no-wrap">
<div class="col text-center"> <div class="col text-center">
<q-avatar class="provider-logo" font-size="inherit"> <q-avatar
class="provider-logo"
font-size="inherit"
>
<q-icon :name="`img:${getLogoPath}`" /> <q-icon :name="`img:${getLogoPath}`" />
</q-avatar> </q-avatar>
</div> </div>
@ -27,8 +30,9 @@ export default defineComponent({
name: 'PanelProvider', name: 'PanelProvider',
props: { props: {
name: { name: {
type: String,
default: '', default: '',
type: String required: false
} }
}, },
computed: { computed: {

View file

@ -116,12 +116,14 @@ export default defineComponent({
mixins: [GetTablePropsMixin], mixins: [GetTablePropsMixin],
props: { props: {
name: { name: {
type: String,
default: '', default: '',
type: String required: false
}, },
type: { type: {
type: String,
default: '', default: '',
type: String required: false
} }
}, },
data () { data () {

View file

@ -282,12 +282,14 @@ export default defineComponent({
}, },
props: { props: {
name: { name: {
type: String,
default: '', default: '',
type: String required: false
}, },
type: { type: {
type: String,
default: '', default: '',
type: String required: false
} }
}, },
data () { data () {

View file

@ -227,12 +227,14 @@ export default defineComponent({
mixins: [GetTablePropsMixin], mixins: [GetTablePropsMixin],
props: { props: {
name: { name: {
type: String,
default: '', default: '',
type: String required: false
}, },
type: { type: {
type: String,
default: '', default: '',
type: String required: false
} }
}, },
data () { data () {