Skip to content

Commit 841b51a

Browse files
alcoclaude
andauthored
chore(sync-service): upgrade Elixir to 1.20.2 and Erlang to 29.0.2 (#3992)
## Summary - Upgrade Erlang/OTP from 28.4 to 29.0.2 - Upgrade Elixir from 1.19.5 to 1.20.2 - Fix all Elixir 1.20 compatibility warnings in Electric source code: - Remove unused `require` statements - Add pin operator (`^`) in bitstring size patterns - Rename `Changes.record()` to `Changes.row()` (new built-in type conflict) - Remove unreachable code flagged by the type checker - Use `apply/3` in telemetry.ex to avoid compile-time conditional type warning - Add a Subject Alternative Name to the integration-test server certificate: since OTP 26 Erlang's `:ssl` no longer falls back to a certificate's CN for hostname verification, so the SAN is required under OTP 29 - Bump postgrex 0.21.1 -> 0.22.2 (+ transitive deps db_connection, telemetry) - Bump the sync-service Docker base image to `hexpm/elixir:1.20.2-erlang-29.0.2-debian-bookworm-20260623-slim` --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent c2ae8bd commit 841b51a

36 files changed

Lines changed: 212 additions & 174 deletions

File tree

.changeset/upgrade-elixir-otp.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
'@core/sync-service': patch
3+
'@core/electric-telemetry': patch
4+
'@core/elixir-client': patch
5+
---
6+
7+
Upgrade Erlang to 29.0.2, Elixir to 1.20.2 and fix new compilation warnings (unused requires, bitstring pin operators, built-in type conflict, dead code).

.github/workflows/electric_telemetry_tests.yml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,23 +33,23 @@ jobs:
3333
uses: actions/cache@v4
3434
with:
3535
path: packages/electric-telemetry/deps
36-
key: ${{ runner.os }}-electric-telemetry-deps-${{ env.MIX_ENV }}-${{ hashFiles('packages/electric-telemetry/mix.lock') }}
36+
key: ${{ runner.os }}-${{ hashFiles('.tool-versions') }}-electric-telemetry-deps-${{ env.MIX_ENV }}-${{ hashFiles('packages/electric-telemetry/mix.lock') }}
3737
restore-keys: |
38-
${{ runner.os }}-electric-telemetry-deps-${{ env.MIX_ENV }}-${{ hashFiles('packages/electric-telemetry/mix.lock') }}
39-
${{ runner.os }}-electric-telemetry-deps-${{ env.MIX_ENV }}
40-
${{ runner.os }}-electric-telemetry-deps
38+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-electric-telemetry-deps-${{ env.MIX_ENV }}-${{ hashFiles('packages/electric-telemetry/mix.lock') }}
39+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-electric-telemetry-deps-${{ env.MIX_ENV }}
40+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-electric-telemetry-deps
4141
4242
- name: Cache compiled code
4343
uses: actions/cache@v4
4444
with:
4545
path: |
4646
packages/electric-telemetry/_build/*/lib
4747
!packages/electric-telemetry/_build/*/lib/electric_telemetry
48-
key: "${{ runner.os }}-electric-telemetry-build-${{ env.MIX_ENV }}-${{ hashFiles('packages/electric-telemetry/mix.lock') }}"
48+
key: "${{ runner.os }}-${{ hashFiles('.tool-versions') }}-electric-telemetry-build-${{ env.MIX_ENV }}-${{ hashFiles('packages/electric-telemetry/mix.lock') }}"
4949
restore-keys: |
50-
${{ runner.os }}-electric-telemetry-build-${{ env.MIX_ENV }}-${{ hashFiles('packages/electric-telemetry/mix.lock') }}
51-
${{ runner.os }}-electric-telemetry-build-${{ env.MIX_ENV }}
52-
${{ runner.os }}-electric-telemetry-build
50+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-electric-telemetry-build-${{ env.MIX_ENV }}-${{ hashFiles('packages/electric-telemetry/mix.lock') }}
51+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-electric-telemetry-build-${{ env.MIX_ENV }}
52+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-electric-telemetry-build
5353
5454
- name: Install dependencies
5555
run: mix do deps.get + deps.compile

.github/workflows/elixir_check_formatting.yml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ jobs:
3737
uses: actions/cache/restore@v4
3838
with:
3939
path: packages/${{ matrix.package }}/deps
40-
key: "${{ runner.os }}-${{ matrix.package }}-deps-${{ env.MIX_ENV }}-${{ hashFiles(format('packages/{0}/mix.lock', matrix.package)) }}"
40+
key: "${{ runner.os }}-${{ hashFiles('.tool-versions') }}-${{ matrix.package }}-deps-${{ env.MIX_ENV }}-${{ hashFiles(format('packages/{0}/mix.lock', matrix.package)) }}"
4141
restore-keys: |
42-
${{ runner.os }}-${{ matrix.package }}-deps-${{ env.MIX_ENV }}-${{ hashFiles(format('packages/{0}/mix.lock', matrix.package)) }}
43-
${{ runner.os }}-${{ matrix.package }}-deps-${{ env.MIX_ENV }}
44-
${{ runner.os }}-${{ matrix.package }}-deps
42+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-${{ matrix.package }}-deps-${{ env.MIX_ENV }}-${{ hashFiles(format('packages/{0}/mix.lock', matrix.package)) }}
43+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-${{ matrix.package }}-deps-${{ env.MIX_ENV }}
44+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-${{ matrix.package }}-deps
4545
4646
- name: Restore compiled code
4747
uses: actions/cache/restore@v4
@@ -51,11 +51,11 @@ jobs:
5151
!packages/${{ matrix.package }}/_build/*/lib/electric
5252
!packages/${{ matrix.package }}/_build/*/lib/electric_client
5353
!packages/${{ matrix.package }}/_build/*/lib/electric_telemetry
54-
key: "${{ runner.os }}-${{ matrix.package }}-build-${{ env.MIX_ENV }}-${{ hashFiles(format('packages/{0}/mix.lock', matrix.package)) }}"
54+
key: "${{ runner.os }}-${{ hashFiles('.tool-versions') }}-${{ matrix.package }}-build-${{ env.MIX_ENV }}-${{ hashFiles(format('packages/{0}/mix.lock', matrix.package)) }}"
5555
restore-keys: |
56-
${{ runner.os }}-${{ matrix.package }}-build-${{ env.MIX_ENV }}-${{ hashFiles(format('packages/{0}/mix.lock', matrix.package)) }}
57-
${{ runner.os }}-${{ matrix.package }}-build-${{ env.MIX_ENV }}
58-
${{ runner.os }}-${{ matrix.package }}-build
56+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-${{ matrix.package }}-build-${{ env.MIX_ENV }}-${{ hashFiles(format('packages/{0}/mix.lock', matrix.package)) }}
57+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-${{ matrix.package }}-build-${{ env.MIX_ENV }}
58+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-${{ matrix.package }}-build
5959
6060
- name: Install dependencies
6161
run: mix deps.get

.github/workflows/elixir_client_tests.yml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,23 +47,23 @@ jobs:
4747
uses: actions/cache@v4
4848
with:
4949
path: packages/elixir-client/deps
50-
key: ${{ runner.os }}-elixir-client-deps-${{ env.MIX_ENV }}-${{ hashFiles('packages/elixir-client/mix.lock') }}
50+
key: ${{ runner.os }}-${{ hashFiles('.tool-versions') }}-elixir-client-deps-${{ env.MIX_ENV }}-${{ hashFiles('packages/elixir-client/mix.lock') }}
5151
restore-keys: |
52-
${{ runner.os }}-elixir-client-deps-${{ env.MIX_ENV }}-${{ hashFiles('packages/elixir-client/mix.lock') }}
53-
${{ runner.os }}-elixir-client-deps-${{ env.MIX_ENV }}
54-
${{ runner.os }}-elixir-client-deps
52+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-elixir-client-deps-${{ env.MIX_ENV }}-${{ hashFiles('packages/elixir-client/mix.lock') }}
53+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-elixir-client-deps-${{ env.MIX_ENV }}
54+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-elixir-client-deps
5555
5656
- name: Cache compiled code
5757
uses: actions/cache@v4
5858
with:
5959
path: |
6060
packages/elixir-client/_build/*/lib
6161
!packages/elixir-client/_build/*/lib/electric_client
62-
key: "${{ runner.os }}-elixir-client-build-${{ env.MIX_ENV }}-${{ hashFiles('packages/elixir-client/mix.lock') }}"
62+
key: "${{ runner.os }}-${{ hashFiles('.tool-versions') }}-elixir-client-build-${{ env.MIX_ENV }}-${{ hashFiles('packages/elixir-client/mix.lock') }}"
6363
restore-keys: |
64-
${{ runner.os }}-elixir-client-build-${{ env.MIX_ENV }}-${{ hashFiles('packages/elixir-client/mix.lock') }}
65-
${{ runner.os }}-elixir-client-build-${{ env.MIX_ENV }}
66-
${{ runner.os }}-elixir-client-build
64+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-elixir-client-build-${{ env.MIX_ENV }}-${{ hashFiles('packages/elixir-client/mix.lock') }}
65+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-elixir-client-build-${{ env.MIX_ENV }}
66+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-elixir-client-build
6767
6868
- name: Install dependencies
6969
run: mix do deps.get + deps.compile

.github/workflows/integration_tests.yml

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,23 +43,23 @@ jobs:
4343
uses: actions/cache@v4
4444
with:
4545
path: packages/sync-service/deps
46-
key: "${{ runner.os }}-sync-service-deps-${{ env.MIX_TARGET }}-${{ env.MIX_ENV }}-${{ hashFiles('packages/sync-service/mix.lock') }}"
46+
key: "${{ runner.os }}-${{ hashFiles('.tool-versions') }}-sync-service-deps-${{ env.MIX_TARGET }}-${{ env.MIX_ENV }}-${{ hashFiles('packages/sync-service/mix.lock') }}"
4747
restore-keys: |
48-
${{ runner.os }}-sync-service-deps-${{ env.MIX_TARGET }}-${{ env.MIX_ENV }}-${{ hashFiles('packages/sync-service/mix.lock') }}
49-
${{ runner.os }}-sync-service-deps-${{ env.MIX_TARGET }}-${{ env.MIX_ENV }}-
50-
${{ runner.os }}-sync-service-deps-
48+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-sync-service-deps-${{ env.MIX_TARGET }}-${{ env.MIX_ENV }}-${{ hashFiles('packages/sync-service/mix.lock') }}
49+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-sync-service-deps-${{ env.MIX_TARGET }}-${{ env.MIX_ENV }}-
50+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-sync-service-deps-
5151
5252
- name: Cache compiled code
5353
uses: actions/cache@v4
5454
with:
5555
path: |
5656
packages/sync-service/_build/*/lib
5757
!packages/sync-service/_build/*/lib/electric
58-
key: "${{ runner.os }}-sync-service-build-${{ env.MIX_TARGET }}-${{ env.MIX_ENV }}-${{ hashFiles('packages/sync-service/mix.lock') }}"
58+
key: "${{ runner.os }}-${{ hashFiles('.tool-versions') }}-sync-service-build-${{ env.MIX_TARGET }}-${{ env.MIX_ENV }}-${{ hashFiles('packages/sync-service/mix.lock') }}"
5959
restore-keys: |
60-
${{ runner.os }}-sync-service-build-${{ env.MIX_TARGET }}-${{ env.MIX_ENV }}-${{ hashFiles('packages/sync-service/mix.lock') }}
61-
${{ runner.os }}-sync-service-build-${{ env.MIX_TARGET }}-${{ env.MIX_ENV }}-
62-
${{ runner.os }}-sync-service-build-
60+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-sync-service-build-${{ env.MIX_TARGET }}-${{ env.MIX_ENV }}-${{ hashFiles('packages/sync-service/mix.lock') }}
61+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-sync-service-build-${{ env.MIX_TARGET }}-${{ env.MIX_ENV }}-
62+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-sync-service-build-
6363
6464
- name: Install dependencies
6565
run: mix do deps.get + deps.compile
@@ -73,10 +73,10 @@ jobs:
7373
uses: actions/cache@v4
7474
with:
7575
path: integration-tests/lux
76-
key: '${{ runner.os }}-lux-${{ steps.setup_beam.outputs.otp-version }}'
76+
key: '${{ runner.os }}-lux-629e45c-${{ steps.setup_beam.outputs.otp-version }}'
7777
restore-keys: |
78-
${{ runner.os }}-lux-${{ steps.setup_beam.outputs.otp-version }}
79-
${{ runner.os }}-lux
78+
${{ runner.os }}-lux-629e45c-${{ steps.setup_beam.outputs.otp-version }}
79+
${{ runner.os }}-lux-629e45c
8080
8181
- name: Setup lux
8282
run: make

.github/workflows/sync_service_tests.yml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,11 @@ jobs:
7777
uses: actions/cache@v4
7878
with:
7979
path: packages/sync-service/deps
80-
key: "${{ runner.os }}-sync-service-deps-${{ env.MIX_ENV }}-${{ hashFiles('packages/sync-service/mix.lock') }}"
80+
key: "${{ runner.os }}-${{ hashFiles('.tool-versions') }}-sync-service-deps-${{ env.MIX_ENV }}-${{ hashFiles('packages/sync-service/mix.lock') }}"
8181
restore-keys: |
82-
${{ runner.os }}-sync-service-deps-${{ env.MIX_ENV }}-${{ hashFiles('packages/sync-service/mix.lock') }}
83-
${{ runner.os }}-sync-service-deps-${{ env.MIX_ENV }}
84-
${{ runner.os }}-sync-service-deps
82+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-sync-service-deps-${{ env.MIX_ENV }}-${{ hashFiles('packages/sync-service/mix.lock') }}
83+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-sync-service-deps-${{ env.MIX_ENV }}
84+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-sync-service-deps
8585
8686
- &cache_compiled_code
8787
name: Cache compiled code
@@ -91,11 +91,11 @@ jobs:
9191
packages/sync-service/_build/*/lib
9292
!packages/sync-service/_build/*/lib/electric
9393
!packages/sync-service/_build/*/lib/electric_telemetry
94-
key: "${{ runner.os }}-sync-service-build-${{ env.MIX_ENV }}-${{ hashFiles('packages/sync-service/mix.lock') }}"
94+
key: "${{ runner.os }}-${{ hashFiles('.tool-versions') }}-sync-service-build-${{ env.MIX_ENV }}-${{ hashFiles('packages/sync-service/mix.lock') }}"
9595
restore-keys: |
96-
${{ runner.os }}-sync-service-build-${{ env.MIX_ENV }}-${{ hashFiles('packages/sync-service/mix.lock') }}
97-
${{ runner.os }}-sync-service-build-${{ env.MIX_ENV }}
98-
${{ runner.os }}-sync-service-build
96+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-sync-service-build-${{ env.MIX_ENV }}-${{ hashFiles('packages/sync-service/mix.lock') }}
97+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-sync-service-build-${{ env.MIX_ENV }}
98+
${{ runner.os }}-${{ hashFiles('.tool-versions') }}-sync-service-build
9999
100100
- &install_dependencies
101101
name: Install dependencies

.tool-versions

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
caddy 2.10.0
2-
elixir 1.19.5
3-
erlang 28.4
2+
elixir 1.20.2
3+
erlang 29.0.2
44
nodejs 24.11.1
55
pnpm 10.12.1

integration-tests/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
LUX_BIN="$SCRIPT_DIR/lux/bin/lux"
22

33
lux:
4-
git clone https://github.com/electric-sql/lux.git && \
4+
git clone https://github.com/hawk/lux.git && \
55
cd lux && \
6-
git checkout otp-27 && \
6+
git checkout 629e45c59a352ec49e0b51dde95d4247b579bfa9 && \
77
autoconf && \
88
./configure && \
99
make

integration-tests/scripts/gen_certs.sh

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,18 @@ openssl ecparam -out "$SUPPORT_DIR/server.key" -name prime256v1 -genkey
2222
echo
2323
echo ">>> Generating server certificate"
2424

25+
# A Subject Alternative Name is required for hostname verification: since
26+
# OTP 26 Erlang's :ssl no longer falls back to the certificate's CN, so a
27+
# server certificate without a matching SAN fails with
28+
# {hostname_check_failed, missing_subject_altnames}.
29+
cat > "$TMP_DIR/server.ext" <<'EXT'
30+
subjectAltName = DNS:localhost, IP:127.0.0.1
31+
EXT
32+
2533
# Generate the server certificate
2634
openssl req -new -sha256 -subj "/C=XX/CN=localhost" -key "$SUPPORT_DIR/server.key" -out "$TMP_DIR/server.csr"
2735
openssl x509 -req -in "$TMP_DIR/server.csr" -CA "$SUPPORT_DIR/root.crt" -CAkey "$TMP_DIR/root.key" \
36+
-extfile "$TMP_DIR/server.ext" \
2837
-out "$SUPPORT_DIR/server.crt" -days 365 -sha256
2938

3039
rm -r "$TMP_DIR"
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
-----BEGIN CERTIFICATE-----
2-
MIIBWzCCAQGgAwIBAgIUbn8zeNw/weVt40I3lDyhx154xaEwCgYIKoZIzj0EAwIw
3-
HDELMAkGA1UEBhMCWFgxDTALBgNVBAMMBHJvb3QwHhcNMjUwODA3MTM0NzA3WhcN
4-
MjYwODA3MTM0NzA3WjAcMQswCQYDVQQGEwJYWDENMAsGA1UEAwwEcm9vdDBZMBMG
5-
ByqGSM49AgEGCCqGSM49AwEHA0IABKaK8ws8Xww3oBtVoM0jbvroaqApIB8lvJUT
6-
HGAztdKUMsP58j2mCdLVCUbw4gl7WP0tx5l+XivoQxj9IsXAfx2jITAfMB0GA1Ud
7-
DgQWBBS6Z9vgpI0SYVK57GW1Btek7V4/4DAKBggqhkjOPQQDAgNIADBFAiBMZSYU
8-
8SPjRA3/uSmf8O8tWdOGAohwgOuA2G7se/duxQIhAMbaQGDbs5J7UH7ONXha/GP5
9-
wtMCXSYzwMP+gMP15Y65
2+
MIIBWzCCAQGgAwIBAgIUOsoylBixwNlrw/+npFpxQjg1TG8wCgYIKoZIzj0EAwIw
3+
HDELMAkGA1UEBhMCWFgxDTALBgNVBAMMBHJvb3QwHhcNMjYwNjEwMTIwMTI1WhcN
4+
MjcwNjEwMTIwMTI1WjAcMQswCQYDVQQGEwJYWDENMAsGA1UEAwwEcm9vdDBZMBMG
5+
ByqGSM49AgEGCCqGSM49AwEHA0IABC0fMWrn1BUTzI+iG9NVSDLXxIvSKGKFf7MF
6+
XcaAMaOVZMvxopVAuXb7t+i/2YbU+gbWcM2oB9mlV93679xYgXejITAfMB0GA1Ud
7+
DgQWBBT4buCJck//o9Fcy+mUbbmj0U1Z5TAKBggqhkjOPQQDAgNIADBFAiEAzI+t
8+
c/6kif31OzdQWt6Fc8qv/NcWIKho25HSYMoo/XACIDmuFr1dStVlsc04NBDXlrR1
9+
KbR5hTz9yWweZuDSzLRU
1010
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)