Re-enable disabled lint rules and right-size CI runners (#18461)

## Summary

- Re-enable one lint rule that was temporarily disabled during the
ESLint-to-Oxlint migration:
- **`twenty/sort-css-properties-alphabetically`** in twenty-front — 578
violations auto-fixed across 390 files
- Document why **`typescript/consistent-type-imports`** cannot be
auto-fixed in twenty-server: NestJS relies on `emitDecoratorMetadata`
for DI, so converting constructor parameter imports to `import type`
erases them at compile time and breaks dependency injection at runtime
- Right-size CI runners, reducing 8-core usage from 18 jobs to 3:

| Change | Jobs | Rationale |
|--------|------|-----------|
| **Keep 8-core** | `ci-merge-queue/e2e-test`,
`ci-front/front-sb-build`, `ci-front/front-build` | Heavy builds needing
max CPU + memory (10GB NODE_OPTIONS, full Storybook webpack bundling) |
| **8-core → 4-core** | `ci-server` (build, lint-typecheck, validation,
test, integration-test), `ci-front/front-sb-test`,
`ci-zapier/server-setup`, `ci-sdk/sdk-e2e-test` | Already sharded into
10-12 parallel instances, I/O-bound (DB/Redis), or moderate single
builds |
| **8-core → 2-core** | `ci-emails/emails-test` | Trivially lightweight
(build + curl health check) |
| **Removed** | `ci-front/front-chromatic-deployment` | Dead code —
permanently disabled with `if: false` |

- Fix merge queue CI issues:
- **Concurrency**: Use `merge_group.base_ref` instead of unique merge
group ref so new queue entries cancel previous runs
- **Required status checks**: Add `merge_group` trigger to all 6
required CI workflows (front, server, shared, website, docker-compose,
sdk) with `changed-files-check` auto-skipped for merge_group events —
status check jobs auto-pass without re-running full CI
- **Build caching**: Add Nx build cache restore/save to E2E test job
with fallback to `main` branch cache for faster frontend and server
builds

## Test plan

- [ ] CI passes on this PR (verifies lint rule auto-fix works)
- [ ] Verify 4-core runner jobs complete within their 30-minute timeouts
- [ ] Verify merge queue status checks auto-pass (ci-front-status-check,
ci-server-status-check, etc.)
- [ ] Verify merge queue E2E concurrency cancels previous runs when a
new PR enters the queue
This commit is contained in:
Charles Bochet
2026-03-06 14:33:02 +01:00
committed by GitHub
parent 9f9a6a45dd
commit ef499b6d47
404 changed files with 1755 additions and 1738 deletions
@@ -16,20 +16,20 @@ type AdvancedSettingsContentWrapperWithDotProps = {
};
const StyledDotContainer = styled.div<{ dotPosition: DotPosition }>`
align-items: ${({ dotPosition }) =>
dotPosition === 'top' ? 'stretch' : 'center'};
display: flex;
position: absolute;
height: 100%;
left: calc(-1 * ${themeCssVariables.spacing[5]});
position: absolute;
top: ${({ dotPosition }) => (dotPosition === 'top' ? '0' : 'auto')};
align-items: ${({ dotPosition }) =>
dotPosition === 'top' ? 'stretch' : 'center'};
`;
const StyledIconPointContainer = styled.span`
margin-right: 0;
display: flex;
align-items: center;
display: flex;
margin-right: 0;
`;
export const AdvancedSettingsContentWrapperWithDot = ({
@@ -29,10 +29,10 @@ const StyledTextInputContainer = styled.div`
width: ${themeCssVariables.spacing[16]};
> * input {
width: ${themeCssVariables.spacing[16]};
font-weight: ${themeCssVariables.font.weight.medium};
height: ${themeCssVariables.spacing[6]};
text-align: center;
font-weight: ${themeCssVariables.font.weight.medium};
width: ${themeCssVariables.spacing[16]};
}
`;
@@ -14,14 +14,14 @@ const OBJECT_MOBILE_WIDTH = 150;
const ACTION_MOBILE_WIDTH = 140;
const StyledFilterRow = styled.div<{ isMobile: boolean }>`
align-items: center;
display: grid;
gap: ${themeCssVariables.spacing[2]};
grid-template-columns: ${({ isMobile }) =>
isMobile
? `${OBJECT_MOBILE_WIDTH}px ${ACTION_MOBILE_WIDTH}px auto`
: `${OBJECT_DROPDOWN_WIDTH}px ${ACTION_DROPDOWN_WIDTH}px auto`};
gap: ${themeCssVariables.spacing[2]};
margin-bottom: ${themeCssVariables.spacing[2]};
align-items: center;
`;
const StyledPlaceholder = styled.div`
@@ -30,8 +30,8 @@ type SettingsDnsRecordsTableProps = {
const StyledTableRowContainer = styled.div`
> * > * {
min-width: 0;
max-width: 100%;
min-width: 0;
overflow: hidden;
}
`;
@@ -17,10 +17,10 @@ type SettingsItemTypeTagProps = {
const StyledContainer = styled.div`
align-items: center;
color: ${themeCssVariables.font.color.secondary};
display: flex;
font-size: ${themeCssVariables.font.size.sm};
gap: ${themeCssVariables.spacing[1]};
color: ${themeCssVariables.font.color.secondary};
`;
export const SettingsItemTypeTag = ({
@@ -22,13 +22,13 @@ const StyledButton = styled.button`
border: none;
border-radius: ${themeCssVariables.border.radius.sm};
color: ${themeCssVariables.font.color.secondary};
gap: ${themeCssVariables.spacing[2]};
padding: 0 ${themeCssVariables.spacing[1]};
padding-left: ${themeCssVariables.spacing[2]};
cursor: pointer;
display: flex;
flex: 1 0 0;
gap: ${themeCssVariables.spacing[2]};
height: ${themeCssVariables.spacing[8]};
padding: 0 ${themeCssVariables.spacing[1]};
padding-left: ${themeCssVariables.spacing[2]};
width: 100%;
&:hover {
@@ -13,9 +13,9 @@ const StyledRowContainer = styled.div`
font-size: ${themeCssVariables.font.size.sm};
font-weight: ${themeCssVariables.font.weight.medium};
gap: ${themeCssVariables.spacing[2]};
min-height: ${themeCssVariables.spacing[6]};
padding: ${themeCssVariables.spacing[2]};
padding-left: ${themeCssVariables.spacing[3]};
min-height: ${themeCssVariables.spacing[6]};
}
`;
@@ -26,8 +26,8 @@ const StyledRightContainer = styled.div`
`;
const StyledContent = styled.div`
flex: 1 1 0;
display: flex;
flex: 1 1 0;
gap: ${themeCssVariables.spacing[1]};
min-width: 0;
overflow: hidden;
@@ -9,22 +9,22 @@ type StyledCardContentProps = {
export const StyledSettingsCardContent = styled.div<StyledCardContentProps>`
align-items: ${({ alignItems }) => alignItems ?? 'center'};
background-color: ${themeCssVariables.background.secondary};
display: flex;
gap: ${themeCssVariables.spacing[3]};
background-color: ${themeCssVariables.background.secondary};
height: ${({ fullHeight }) => (fullHeight ? '100%' : 'auto')};
padding: ${themeCssVariables.spacing[4]};
`;
export const StyledSettingsCardIcon = styled.div`
align-items: center;
background-color: ${themeCssVariables.background.primary};
border: 2px solid ${themeCssVariables.border.color.light};
border-radius: ${themeCssVariables.border.radius.sm};
background-color: ${themeCssVariables.background.primary};
display: flex;
height: ${themeCssVariables.spacing[7]};
justify-content: center;
width: ${themeCssVariables.spacing[7]};
min-width: ${themeCssVariables.icon.size.md};
width: ${themeCssVariables.spacing[7]};
`;
export const StyledSettingsCardTitle = styled.div`
@@ -41,13 +41,13 @@ export const StyledSettingsCardTextContainer = styled.div`
export const StyledSettingsCardDescription = styled.div`
color: ${themeCssVariables.font.color.secondary};
font-size: ${themeCssVariables.font.size.sm};
overflow: hidden;
line-height: 1.5;
overflow: hidden;
a {
pointer-events: auto;
position: relative;
z-index: 1;
pointer-events: auto;
}
`;
@@ -17,13 +17,13 @@ import { ThemeContext, themeCssVariables } from 'twenty-ui/theme-constants';
const StyledSettingsCardToggleContent = styled.div<{ disabled?: boolean }>`
align-items: center;
background-color: ${themeCssVariables.background.secondary};
cursor: ${({ disabled }) => (disabled ? 'default' : 'pointer')};
display: flex;
gap: ${themeCssVariables.spacing[3]};
background-color: ${themeCssVariables.background.secondary};
padding: ${themeCssVariables.spacing[4]};
cursor: ${({ disabled }) => (disabled ? 'default' : 'pointer')};
position: relative;
pointer-events: ${({ disabled }) => (disabled ? 'none' : 'auto')};
position: relative;
&:hover {
background: ${themeCssVariables.background.transparent.lighter};
@@ -10,8 +10,8 @@ type SettingsOptionIconCustomizerProps = {
};
const StyledIconCustomizer = styled.div<{ zoom: number; rotate: number }>`
display: inline-flex;
align-items: center;
display: inline-flex;
justify-content: center;
transform: scale(${({ zoom }) => zoom}) rotate(${({ rotate }) => rotate}deg);
`;
@@ -19,6 +19,7 @@ const StyledSettingsPageContainer = styled.div<{
overflow: auto;
padding: ${themeCssVariables.spacing[6]} ${themeCssVariables.spacing[8]}
${themeCssVariables.spacing[8]};
padding-bottom: ${themeCssVariables.spacing[20]};
width: ${({ width, isMobile }) => {
if (isDefined(width)) {
return width + 'px';
@@ -28,7 +29,6 @@ const StyledSettingsPageContainer = styled.div<{
}
return OBJECT_SETTINGS_WIDTH + 'px';
}};
padding-bottom: ${themeCssVariables.spacing[20]};
`;
export const SettingsPageContainer = ({
@@ -7,14 +7,14 @@ import { ThemeContext, themeCssVariables } from 'twenty-ui/theme-constants';
const StyledRadioCardContentContainer = styled.div`
> * {
display: flex;
align-items: center;
padding: ${themeCssVariables.spacing[2]};
border: 1px solid ${themeCssVariables.border.color.medium};
border-radius: ${themeCssVariables.border.radius.sm};
cursor: pointer;
display: flex;
flex-grow: 1;
gap: ${themeCssVariables.spacing[2]};
cursor: pointer;
padding: ${themeCssVariables.spacing[2]};
&:hover {
background: ${themeCssVariables.background.transparent.lighter};
@@ -13,8 +13,8 @@ const StyledCardContentContainer = styled.div`
align-items: center;
display: flex;
gap: ${themeCssVariables.spacing[2]};
padding: ${themeCssVariables.spacing[2]};
min-height: ${themeCssVariables.spacing[6]};
padding: ${themeCssVariables.spacing[2]};
}
`;