Skip to content

Commit efa20a4

Browse files
Migrate to charmcraft 3 poetry plugin (#815)
data-platform-workflows and charmcraftcache are migrating from charmcraft 2 to 3 to enable 24.04 based charms & to enable use of the poetry plugin, which fixes several longstanding issues with charmcraft (e.g. canonical/charmcraft#1077)
1 parent f2e6fc1 commit efa20a4

File tree

8 files changed

+231
-58
lines changed

8 files changed

+231
-58
lines changed

.github/workflows/ci.yaml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ on:
2323
jobs:
2424
lint:
2525
name: Lint
26-
uses: canonical/data-platform-workflows/.github/workflows/lint.yaml@v24.0.6
26+
uses: canonical/data-platform-workflows/.github/workflows/lint.yaml@v26.0.0
2727

2828
unit-test:
2929
name: Unit test charm
@@ -45,9 +45,10 @@ jobs:
4545

4646
build:
4747
name: Build charm
48-
uses: canonical/data-platform-workflows/.github/workflows/build_charm.yaml@v24.0.6
48+
uses: canonical/data-platform-workflows/.github/workflows/build_charm.yaml@v26.0.0
4949
with:
5050
cache: true
51+
charmcraft-snap-channel: latest/beta/data-platform # TODO: remove after charmcraft 3.3 stable release
5152

5253
integration-test:
5354
strategy:
@@ -71,7 +72,7 @@ jobs:
7172
- lint
7273
- unit-test
7374
- build
74-
uses: canonical/data-platform-workflows/.github/workflows/integration_test_charm.yaml@v24.0.6
75+
uses: canonical/data-platform-workflows/.github/workflows/integration_test_charm.yaml@v26.0.0
7576
with:
7677
artifact-prefix: ${{ needs.build.outputs.artifact-prefix }}
7778
architecture: ${{ matrix.architecture }}

.github/workflows/release.yaml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,18 @@ jobs:
4242

4343
build:
4444
name: Build charm
45-
uses: canonical/data-platform-workflows/.github/workflows/[email protected]
45+
uses: canonical/data-platform-workflows/.github/workflows/[email protected]
46+
with:
47+
charmcraft-snap-channel: latest/beta/data-platform # TODO: remove after charmcraft 3.3 stable release
4648

4749
release:
4850
name: Release charm
4951
needs:
5052
- ci-tests
5153
- build
52-
uses: canonical/data-platform-workflows/.github/workflows/release_charm.yaml@v24.0.6
54+
uses: canonical/data-platform-workflows/.github/workflows/release_charm.yaml@v26.0.0
5355
with:
56+
charmcraft-snap-channel: latest/beta/data-platform # TODO: remove after charmcraft 3.3 stable release
5457
channel: 14/edge
5558
artifact-prefix: ${{ needs.build.outputs.artifact-prefix }}
5659
secrets:

.github/workflows/sync_docs.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ on:
1010
jobs:
1111
sync-docs:
1212
name: Sync docs from Discourse
13-
uses: canonical/data-platform-workflows/.github/workflows/sync_docs.yaml@v24.0.6
13+
uses: canonical/data-platform-workflows/.github/workflows/sync_docs.yaml@v26.0.0
1414
with:
1515
reviewers: a-velasco
1616
permissions:

charmcraft.yaml

Lines changed: 81 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,92 @@
1+
# Copyright 2022 Canonical Ltd.
2+
# See LICENSE file for licensing details.
3+
14
type: charm
2-
bases:
3-
- name: ubuntu
4-
channel: "22.04"
5-
architectures: [amd64]
6-
- name: ubuntu
7-
channel: "22.04"
8-
architectures: [arm64]
5+
platforms:
6+
7+
8+
# Files implicitly created by charmcraft without a part:
9+
# - dispatch (https://github.com/canonical/charmcraft/pull/1898)
10+
# - manifest.yaml
11+
# (https://github.com/canonical/charmcraft/blob/9ff19c328e23b50cc06f04e8a5ad4835740badf4/charmcraft/services/package.py#L259)
12+
# Files implicitly copied/"primed" by charmcraft without a part:
13+
# - actions.yaml, config.yaml, metadata.yaml
14+
# (https://github.com/canonical/charmcraft/blob/9ff19c328e23b50cc06f04e8a5ad4835740badf4/charmcraft/services/package.py#L290-L293
15+
# https://github.com/canonical/charmcraft/blob/9ff19c328e23b50cc06f04e8a5ad4835740badf4/charmcraft/services/package.py#L156-L157)
916
parts:
10-
charm:
11-
build-snaps:
12-
- rustup
17+
# "poetry-deps" part name is a magic constant
18+
# https://github.com/canonical/craft-parts/pull/901
19+
poetry-deps:
20+
plugin: nil
21+
build-packages:
22+
- curl
23+
override-build: |
24+
# Use environment variable instead of `--break-system-packages` to avoid failing on older
25+
# versions of pip that do not recognize `--break-system-packages`
26+
# `--user` needed (in addition to `--break-system-packages`) for Ubuntu >=24.04
27+
PIP_BREAK_SYSTEM_PACKAGES=true python3 -m pip install --user --upgrade pip==24.3.1 # renovate: charmcraft-pip-latest
28+
29+
# Use uv to install poetry so that a newer version of Python can be installed if needed by poetry
30+
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/uv/releases/download/0.5.15/uv-installer.sh | sh # renovate: charmcraft-uv-latest
31+
# poetry 2.0.0 requires Python >=3.9
32+
if ! "$HOME/.local/bin/uv" python find '>=3.9'
33+
then
34+
# Use first Python version that is >=3.9 and available in an Ubuntu LTS
35+
# (to reduce the number of Python versions we use)
36+
"$HOME/.local/bin/uv" python install 3.10.12 # renovate: charmcraft-python-ubuntu-22.04
37+
fi
38+
"$HOME/.local/bin/uv" tool install --no-python-downloads --python '>=3.9' poetry==2.0.0 --with poetry-plugin-export==1.8.0 # renovate: charmcraft-poetry-latest
39+
40+
ln -sf "$HOME/.local/bin/poetry" /usr/local/bin/poetry
41+
# "charm-poetry" part name is arbitrary; use for consistency
42+
# Avoid using "charm" part name since that has special meaning to charmcraft
43+
charm-poetry:
44+
# By default, the `poetry` plugin creates/primes these directories:
45+
# - lib, src
46+
# (https://github.com/canonical/charmcraft/blob/9ff19c328e23b50cc06f04e8a5ad4835740badf4/charmcraft/parts/plugins/_poetry.py#L76-L78)
47+
# - venv
48+
# (https://github.com/canonical/charmcraft/blob/9ff19c328e23b50cc06f04e8a5ad4835740badf4/charmcraft/parts/plugins/_poetry.py#L95
49+
# https://github.com/canonical/craft-parts/blob/afb0d652eb330b6aaad4f40fbd6e5357d358de47/craft_parts/plugins/base.py#L270)
50+
plugin: poetry
51+
source: .
52+
after:
53+
- poetry-deps
54+
poetry-export-extra-args: ['--only', 'main,charm-libs']
1355
build-packages:
14-
- libffi-dev
15-
- libssl-dev
16-
- pkg-config
56+
- libffi-dev # Needed to build Python dependencies with Rust from source
57+
- libssl-dev # Needed to build Python dependencies with Rust from source
58+
- pkg-config # Needed to build Python dependencies with Rust from source
1759
- libpq-dev
1860
override-build: |
19-
rustup default stable
61+
# Workaround for https://github.com/canonical/charmcraft/issues/2068
62+
# rustup used to install rustc and cargo, which are needed to build Python dependencies with Rust from source
63+
if [[ "$CRAFT_PLATFORM" == [email protected]:* || "$CRAFT_PLATFORM" == [email protected]:* ]]
64+
then
65+
snap install rustup --classic
66+
else
67+
apt-get install rustup -y
68+
fi
69+
70+
# If Ubuntu version < 24.04, rustup was installed from snap instead of from the Ubuntu
71+
# archive—which means the rustup version could be updated at any time. Print rustup version
72+
# to build log to make changes to the snap's rustup version easier to track
73+
rustup --version
2074
21-
# Convert subset of poetry.lock to requirements.txt
22-
curl -sSL https://install.python-poetry.org | python3 -
23-
/root/.local/bin/poetry self add poetry-plugin-export
24-
/root/.local/bin/poetry export --only main,charm-libs --output requirements.txt
75+
# rpds-py (Python package) >=0.19.0 requires rustc >=1.76, which is not available in the
76+
# Ubuntu 22.04 archive. Install rustc and cargo using rustup instead of the Ubuntu archive
77+
rustup set profile minimal
78+
rustup default 1.83.0 # renovate: charmcraft-rust-latest
2579
2680
craftctl default
27-
charm-strict-dependencies: true
28-
charm-requirements: [requirements.txt]
81+
# Include requirements.txt in *.charm artifact for easier debugging
82+
cp requirements.txt "$CRAFT_PART_INSTALL/requirements.txt"
83+
# "files" part name is arbitrary; use for consistency
84+
files:
85+
plugin: dump
86+
source: .
87+
prime:
88+
- LICENSE
89+
- templates
2990
libpq:
3091
build-packages:
3192
- libpq-dev

0 commit comments

Comments
 (0)