Skip to content

Commit d5aa65e

Browse files
Migrate to charmcraft 3 poetry plugin (#550)
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 3912348 commit d5aa65e

File tree

8 files changed

+230
-75
lines changed

8 files changed

+230
-75
lines changed

.github/workflows/ci.yaml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ on:
1616
jobs:
1717
lint:
1818
name: Lint
19-
uses: canonical/data-platform-workflows/.github/workflows/lint.yaml@v24.0.6
19+
uses: canonical/data-platform-workflows/.github/workflows/lint.yaml@v26.0.0
2020

2121
unit-test:
2222
name: Unit test charm
@@ -56,9 +56,10 @@ jobs:
5656

5757
build:
5858
name: Build charm
59-
uses: canonical/data-platform-workflows/.github/workflows/build_charm.yaml@v24.0.6
59+
uses: canonical/data-platform-workflows/.github/workflows/build_charm.yaml@v26.0.0
6060
with:
6161
cache: true
62+
charmcraft-snap-channel: latest/beta/data-platform # TODO: remove after charmcraft 3.3 stable release
6263

6364
integration-test:
6465
strategy:
@@ -82,7 +83,7 @@ jobs:
8283
- lint
8384
- unit-test
8485
- build
85-
uses: canonical/data-platform-workflows/.github/workflows/integration_test_charm.yaml@v24.0.6
86+
uses: canonical/data-platform-workflows/.github/workflows/integration_test_charm.yaml@v26.0.0
8687
with:
8788
artifact-prefix: ${{ needs.build.outputs.artifact-prefix }}
8889
architecture: ${{ matrix.architecture }}

.github/workflows/release.yaml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,19 @@ jobs:
3636

3737
build:
3838
name: Build charm
39-
uses: canonical/data-platform-workflows/.github/workflows/[email protected]
39+
uses: canonical/data-platform-workflows/.github/workflows/[email protected]
40+
with:
41+
charmcraft-snap-channel: latest/beta/data-platform # TODO: remove after charmcraft 3.3 stable release
4042

4143
release:
4244
name: Release charm
4345
needs:
4446
- lib-check
4547
- ci-tests
4648
- build
47-
uses: canonical/data-platform-workflows/.github/workflows/release_charm.yaml@v24.0.6
49+
uses: canonical/data-platform-workflows/.github/workflows/release_charm.yaml@v26.0.0
4850
with:
51+
charmcraft-snap-channel: latest/beta/data-platform # TODO: remove after charmcraft 3.3 stable release
4952
channel: 8.0/edge
5053
artifact-prefix: ${{ needs.build.outputs.artifact-prefix }}
5154
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: 79 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,89 @@
1-
# Copyright 2021 Canonical Ltd.
1+
# Copyright 2022 Canonical Ltd.
22
# See LICENSE file for licensing details.
33

44
type: charm
5-
bases:
6-
- name: ubuntu
7-
channel: "22.04"
8-
architectures: [amd64]
9-
- name: ubuntu
10-
channel: "22.04"
11-
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)
1216
parts:
13-
files:
14-
plugin: dump
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
1551
source: .
16-
stage:
17-
# Exclude requirements.txt file during staging
18-
# Workaround for https://github.com/canonical/charmcraft/issues/1389 on charmcraft 2
19-
- -requirements.txt
20-
prime:
21-
- scripts
22-
charm:
23-
build-snaps:
24-
- rustup
52+
after:
53+
- poetry-deps
54+
poetry-export-extra-args: ['--only', 'main,charm-libs']
2555
build-packages:
26-
- libffi-dev
27-
- libssl-dev
28-
- 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
2959
override-build: |
30-
rustup default stable
60+
# Workaround for https://github.com/canonical/charmcraft/issues/2068
61+
# rustup used to install rustc and cargo, which are needed to build Python dependencies with Rust from source
62+
if [[ "$CRAFT_PLATFORM" == [email protected]:* || "$CRAFT_PLATFORM" == [email protected]:* ]]
63+
then
64+
snap install rustup --classic
65+
else
66+
apt-get install rustup -y
67+
fi
68+
69+
# If Ubuntu version < 24.04, rustup was installed from snap instead of from the Ubuntu
70+
# archive—which means the rustup version could be updated at any time. Print rustup version
71+
# to build log to make changes to the snap's rustup version easier to track
72+
rustup --version
3173
32-
# Convert subset of poetry.lock to requirements.txt
33-
curl -sSL https://install.python-poetry.org | python3 -
34-
/root/.local/bin/poetry self add poetry-plugin-export
35-
/root/.local/bin/poetry export --only main,charm-libs --output requirements.txt
74+
# rpds-py (Python package) >=0.19.0 requires rustc >=1.76, which is not available in the
75+
# Ubuntu 22.04 archive. Install rustc and cargo using rustup instead of the Ubuntu archive
76+
rustup set profile minimal
77+
rustup default 1.83.0 # renovate: charmcraft-rust-latest
3678
3779
craftctl default
38-
charm-strict-dependencies: true
39-
charm-requirements: [requirements.txt]
80+
# Include requirements.txt in *.charm artifact for easier debugging
81+
cp requirements.txt "$CRAFT_PART_INSTALL/requirements.txt"
82+
# "files" part name is arbitrary; use for consistency
83+
files:
84+
plugin: dump
85+
source: .
86+
prime:
87+
- LICENSE
88+
- scripts
89+
- templates

0 commit comments

Comments
 (0)