tebako 0.12.16 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CMakeLists.txt +2 -2
- data/CODE_OF_CONDUCT.adoc +128 -0
- data/CONTRIBUTING.adoc +294 -0
- data/Gemfile +2 -2
- data/INSTALLATION.adoc +233 -0
- data/LICENSE.md +33 -0
- data/README.adoc +387 -528
- data/Rakefile +2 -2
- data/cmake/copy_dir.cmake +1 -1
- data/common.env +1 -1
- data/exe/tebako +2 -2
- data/exe/tebako-packager +2 -2
- data/include/tebako/tebako-fs.h +2 -2
- data/include/tebako/tebako-main.h +2 -2
- data/lib/tebako/build_helpers.rb +2 -2
- data/lib/tebako/cache_manager.rb +2 -2
- data/lib/tebako/cli.rb +19 -10
- data/lib/tebako/cli_helpers.rb +1 -1
- data/lib/tebako/codegen.rb +2 -2
- data/lib/tebako/deploy_helper.rb +9 -8
- data/lib/tebako/error.rb +1 -1
- data/lib/tebako/options_manager.rb +1 -1
- data/lib/tebako/package_descriptor.rb +2 -2
- data/lib/tebako/packager/pass1_patch.rb +1 -1
- data/lib/tebako/packager/pass1a_patch.rb +1 -1
- data/lib/tebako/packager/pass2_patch.rb +1 -1
- data/lib/tebako/packager/pass2_patch_crt.rb +1 -1
- data/lib/tebako/packager/pass2msys_patch.rb +1 -1
- data/lib/tebako/packager/patch.rb +1 -1
- data/lib/tebako/packager/patch_buildsystem.rb +2 -2
- data/lib/tebako/packager/patch_helpers.rb +2 -2
- data/lib/tebako/packager/patch_libraries.rb +9 -10
- data/lib/tebako/packager/patch_literals.rb +1 -1
- data/lib/tebako/packager/patch_main.rb +2 -2
- data/lib/tebako/packager/rubygems_patch.rb +1 -1
- data/lib/tebako/packager.rb +1 -1
- data/lib/tebako/packager_lite.rb +1 -1
- data/lib/tebako/ruby_builder.rb +1 -1
- data/lib/tebako/ruby_version.rb +4 -3
- data/lib/tebako/scenario_manager.rb +1 -1
- data/lib/tebako/stripper.rb +1 -1
- data/lib/tebako/version.rb +2 -2
- data/lib/tebako.rb +2 -2
- data/src/tebako-main.cpp +2 -2
- data/tebako.gemspec +2 -2
- data/tools/.github/workflows/build-containers.yml +190 -0
- data/tools/.github/workflows/lint.yml +3 -3
- data/tools/.github/workflows/test.yml +149 -9
- data/tools/ci-scripts/arm-brew-install.sh +1 -1
- data/tools/ci-scripts/arm-brew-setup.sh +1 -1
- data/tools/ci-scripts/level-up.sh +1 -1
- data/tools/ci-scripts/patch-fbthrift.sh +5 -1
- data/tools/ci-scripts/patch-folly.sh +7 -2
- data/tools/ci-scripts/tools.sh +1 -1
- data/tools/ci-scripts/x86-brew-install.sh +1 -1
- data/tools/ci-scripts/x86-brew-setup.sh +1 -1
- data/tools/cmake-scripts/def-external-project.cmake +1 -1
- data/tools/cmake-scripts/macos-environment.cmake +2 -2
- data/tools/cmake-scripts/msys-environment.cmake +1 -1
- data/tools/cmake-scripts/setup-libarchive.cmake +4 -8
- data/tools/cmake-scripts/setup-libfmt.cmake +1 -1
- data/tools/cmake-scripts/setup-libhowardhinnerdate.cmake +1 -1
- data/tools/cmake-scripts/setup-libutfcpp.cmake +2 -2
- data/tools/cmake-scripts/setup-openssl-1.1.1.cmake +1 -1
- data/tools/docker/alpine-3.17-dev.Dockerfile +49 -0
- data/tools/docker/tools/tools.sh +66 -0
- data/tools/docker/ubuntu-20.04-dev.Dockerfile +51 -0
- data/tools/dwarfs-test-helper/CMakeLists.txt +1 -1
- data/tools/include/pro-statvfs.h +1 -1
- data/tools/tests/cmake/CMakeLists.txt +1 -1
- data/tools/tests/setup-libfmt/CMakeLists.txt +1 -1
- data/tools/tests/setup-libhowardhinnerdate/CMakeLists.txt +1 -1
- data/tools/tests/setup-librachive/CMakeLists.txt +1 -1
- data/tools/tests/setup-libutfcpp/CMakeLists.txt +1 -1
- data/tools/tests/setup-openssl/CMakeLists.txt +1 -1
- metadata +10 -2
data/README.adoc
CHANGED
@@ -1,20 +1,43 @@
|
|
1
1
|
= Tebako: An advanced image packager for interpretive languages
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
.Continuous Integration Status
|
4
|
+
[cols="1,1,3"]
|
5
|
+
|===
|
6
|
+
|*Platform Tests* |Architecture |Status
|
7
|
+
|
8
|
+
|Ubuntu
|
9
|
+
|amd64 + arm64 | image:https://github.com/tamatebako/tebako/actions/workflows/ubuntu.yml/badge.svg["Ubuntu amd64", link="https://github.com/tamatebako/tebako/actions/workflows/ubuntu.yml"]
|
10
|
+
|
11
|
+
|Alpine
|
12
|
+
|amd64 + arm64 |image:https://github.com/tamatebako/tebako/actions/workflows/alpine.yml/badge.svg["Alpine", link="https://github.com/tamatebako/tebako/actions/workflows/alpine.yml"]
|
13
|
+
|
14
|
+
|macOS
|
15
|
+
|amd64 + arm64
|
16
|
+
|image:https://github.com/tamatebako/tebako/actions/workflows/macos.yml/badge.svg["macOS amd64 + arm64", link="https://github.com/tamatebako/tebako/actions/workflows/macos.yml"]
|
17
|
+
|
18
|
+
|Windows MSYS2
|
19
|
+
|amd64 |image:https://github.com/tamatebako/tebako/actions/workflows/windows-msys.yml/badge.svg["Windows MSYS2", link="https://github.com/tamatebako/tebako/actions/workflows/windows-msys.yml"]
|
20
|
+
|
21
|
+
3+|*Tools Tests*
|
22
|
+
|
23
|
+
|Tebako containers
|
24
|
+
| |image:https://github.com/tamatebako/tebako-ci-containers/actions/workflows/build-containers.yml/badge.svg["Tebako containers", link="https://github.com/tamatebako/tebako-ci-containers/actions/workflows/build-containers.yml"]
|
25
|
+
|
26
|
+
|Runtimes
|
27
|
+
| |image:https://github.com/tamatebako/tebako-runtime-ruby/actions/workflows/build-runtime-packages.yml/badge.svg["Ruby runtimes", link="https://github.com/tamatebako/tebako-runtime-ruby/actions/workflows/build-runtime-packages.yml"]
|
8
28
|
|
9
|
-
|
10
|
-
image:https://api.cirrus-ci.com/github/tamatebako/tebako.svg?branch=main&task=ubuntu-aarch64["Ubuntu aarch64", link="https://cirrus-ci.com/github/tamatebako/tebako"]
|
29
|
+
3+|*Quality*
|
11
30
|
|
12
|
-
|
13
|
-
image:https://github.com/tamatebako/tebako
|
31
|
+
|Lint and RSpec
|
32
|
+
| |image:https://github.com/tamatebako/tebako/actions/workflows/lint-and-rspec.yml/badge.svg["Lint and RSpec", link="https://github.com/tamatebako/tebako/actions/workflows/lint-and-rspec.yml"]
|
14
33
|
|
15
|
-
|
16
|
-
image:https://
|
17
|
-
|
34
|
+
|Code Coverage
|
35
|
+
| |image:https://codecov.io/gh/tamatebako/tebako/graph/badge.svg?token=XD3emQ5qsY["Tebako CLI RSpec coverage", link="https://codecov.io/gh/tamatebako/tebako"]
|
36
|
+
|
37
|
+
3+|*Info*
|
38
|
+
|Gem
|
39
|
+
| |image:https://img.shields.io/gem/v/tebako.svg["Version", link="https://rubygems.org/gems/tebako"]
|
40
|
+
|===
|
18
41
|
|
19
42
|
== Purpose
|
20
43
|
|
@@ -56,6 +79,8 @@ architectures.
|
|
56
79
|
|
57
80
|
3+| **Linux**
|
58
81
|
| Ubuntu 20.04 | amd64, aarch64 | gcc/g+\+: 10; clang/clang++: 12
|
82
|
+
| Ubuntu 22.04 | amd64, aarch64 | gcc/g+\+: 10; clang/clang++: 12
|
83
|
+
| Ubuntu 24.04 | amd64, aarch64 | gcc/g+\+: 10; clang/clang++: 12
|
59
84
|
| Alpine 3.17 | amd64 | gcc/g+\+: default; clang/clang++: default
|
60
85
|
|
61
86
|
3+| **macOS**
|
@@ -106,7 +131,7 @@ higher.
|
|
106
131
|
| 3.1.6 | Linux, macOS, Windows
|
107
132
|
| 3.2.{4,5,6,7} | Linux, macOS, Windows
|
108
133
|
| 3.3.{3,4,5,6,7} | Linux, macOS, Windows
|
109
|
-
| 3.4.1 | Linux, macOS, Windows
|
134
|
+
| 3.4.{1,2} | Linux, macOS, Windows
|
110
135
|
|
111
136
|
|===
|
112
137
|
|
@@ -131,7 +156,8 @@ macOS packages are forward portable across different macOS versions.
|
|
131
156
|
A Tebako executable package built on macOS 13 (Ventura) can be executed on
|
132
157
|
macOS 14 (Sonoma), but not vice versa.
|
133
158
|
|
134
|
-
`x86_64`
|
159
|
+
macOS packages compiled on `x86_64` can be run on Apple M (ARM64/aarch64)
|
160
|
+
systems.
|
135
161
|
|
136
162
|
|
137
163
|
=== Linux distributions using `musl`
|
@@ -286,456 +312,80 @@ single, performant, executable binary.
|
|
286
312
|
|===
|
287
313
|
|
288
314
|
|
289
|
-
== Usage
|
290
|
-
|
291
|
-
=== Command-line interface
|
292
|
-
|
293
|
-
Tebako works by packaging your project into a single executable binary that
|
294
|
-
includes all the necessary dependencies.
|
295
|
-
|
296
|
-
The way to work with Tebako is through its command-line interface (CLI).
|
297
|
-
It provides the following commands:
|
298
|
-
|
299
|
-
`setup`::
|
300
|
-
Prepares the Tebako packaging environment.
|
301
|
-
|
302
|
-
`press`::
|
303
|
-
Packages a project into a single executable binary.
|
304
|
-
|
305
|
-
`clean`::
|
306
|
-
Removes Tebako artifacts.
|
307
|
-
|
308
|
-
`clean_ruby`::
|
309
|
-
Removes Tebako Ruby artifacts.
|
310
|
-
|
311
|
-
`hash`::
|
312
|
-
Calculates the Tebako script hash for use as a cache key in CI/CD environments.
|
313
|
-
|
314
|
-
`version`::
|
315
|
-
Displays the Tebako version.
|
316
|
-
|
317
|
-
`help`::
|
318
|
-
Displays the help message.
|
319
|
-
|
320
|
-
|
321
|
-
== Usage
|
322
|
-
|
323
|
-
=== General
|
324
|
-
|
325
|
-
Tebako can be used in two ways:
|
326
|
-
|
327
|
-
* Through the Tebako container
|
328
|
-
* Local installation
|
329
|
-
|
330
|
-
Please refer to the <<installation>> section on how to install Tebako.
|
331
|
-
|
332
|
-
|
333
|
-
[[installation]]
|
334
315
|
== Installation
|
335
316
|
|
336
317
|
=== General
|
337
318
|
|
338
|
-
|
319
|
+
Tebako installation is only required for packaging applications.
|
339
320
|
|
340
|
-
|
321
|
+
Users who run packaged applications do not need to install anything.
|
341
322
|
|
323
|
+
Tebako can be used for packaging in two ways:
|
342
324
|
|
343
|
-
|
344
|
-
|
345
|
-
==== General
|
346
|
-
|
347
|
-
If you have Docker installed and available, the easiest way to run Tebako is
|
348
|
-
through the official Docker containers.
|
349
|
-
|
350
|
-
Docker containers with preinstalled Tebako packaging environments for Ubuntu and
|
351
|
-
Alpine Linux are available at
|
352
|
-
https://github.com/tamatebako/tebako-ci-containers[tebako-ci-containers].
|
353
|
-
|
354
|
-
|
355
|
-
==== Pull the container
|
356
|
-
|
357
|
-
Pull the Tebako container image.
|
358
|
-
|
359
|
-
[source,sh]
|
360
|
-
----
|
361
|
-
docker pull ghcr.io/tamatebako/tebako-<container_tag>:latest
|
362
|
-
----
|
363
|
-
|
364
|
-
`<container_tag>`:: is the desired image tag (e.g., `ubuntu-20.04` or `alpine-3.17`).
|
365
|
-
|
366
|
-
|
367
|
-
==== Running Tebako commands in the container
|
368
|
-
|
369
|
-
Simply prefix the Tebako command with `docker run` and the container image.
|
370
|
-
|
371
|
-
[source,sh]
|
372
|
-
----
|
373
|
-
docker run -v <application_folder>:/mnt/w \
|
374
|
-
-t ghcr.io/tamatebako/tebako-<container_tag>:latest \
|
375
|
-
tebako {command} {parameters}
|
376
|
-
----
|
377
|
-
|
378
|
-
==== Packaging from outside the container
|
379
|
-
|
380
|
-
To package your application from outside the container, just run a single Docker
|
381
|
-
command.
|
382
|
-
|
383
|
-
This command mounts the application folder into the container and runs the
|
384
|
-
`tebako press` command, specifying the application root, entry point, output
|
385
|
-
location, and Ruby version.
|
386
|
-
|
387
|
-
[source,sh]
|
388
|
-
----
|
389
|
-
docker run -v <application_folder>:/mnt/w \
|
390
|
-
-t ghcr.io/tamatebako/tebako-<container_tag>:latest \
|
391
|
-
tebako press <tebako-press-parameters>
|
392
|
-
----
|
393
|
-
|
394
|
-
`<application_folder>`:: is the path to your application folder.
|
395
|
-
|
396
|
-
`<container_tag>`:: is the desired image tag (e.g., `ubuntu-20.04` or `alpine-3.17`).
|
397
|
-
|
398
|
-
|
399
|
-
[example]
|
400
|
-
====
|
401
|
-
Assume that you have a Ruby application in the `fontist` folder of the current
|
402
|
-
directory.
|
403
|
-
|
404
|
-
You can package it to `./fontist-package` using the following command:
|
405
|
-
|
406
|
-
[source,sh]
|
407
|
-
----
|
408
|
-
docker run -v $PWD:/mnt/w \
|
409
|
-
-t ghcr.io/tamatebako/tebako-ubuntu-20.04:latest \
|
410
|
-
tebako press --root=/mnt/w/fontist --entry-point=fontist --output=/mnt/w/fontist-package --Ruby=3.2.4
|
411
|
-
----
|
412
|
-
====
|
413
|
-
|
414
|
-
==== Packaging from inside the container
|
415
|
-
|
416
|
-
It is also possible to package an application from inside the Tebako container.
|
417
|
-
|
418
|
-
Start and enter the container interactively.
|
419
|
-
|
420
|
-
[source,sh]
|
421
|
-
----
|
422
|
-
docker run -it --rm -v <application_folder>:/mnt/w \
|
423
|
-
ghcr.io/tamatebako/tebako-<container_tag>:latest bash
|
424
|
-
----
|
425
|
-
|
426
|
-
`<application_folder>`:: is the path to your application folder.
|
427
|
-
|
428
|
-
`<container_tag>`:: is the desired image tag (e.g., `ubuntu-20.04` or `alpine-3.17`).
|
429
|
-
|
430
|
-
|
431
|
-
Once inside, run the `tebako press` command:
|
432
|
-
|
433
|
-
[source,sh]
|
434
|
-
----
|
435
|
-
tebako press <tebako press parameters>
|
436
|
-
----
|
437
|
-
|
438
|
-
[example]
|
439
|
-
====
|
440
|
-
Assume that you have a Ruby application in the `fontist` folder of the current
|
441
|
-
directory.
|
442
|
-
|
443
|
-
You can package it to `./fontist-package` using the following command:
|
444
|
-
|
445
|
-
[source,sh]
|
446
|
-
----
|
447
|
-
$ docker run -it --rm -v $PWD:/mnt/w ghcr.io/tamatebako/tebako-<container_tag>:latest bash
|
448
|
-
|
449
|
-
# Inside the container:
|
450
|
-
$ tebako press --root=/mnt/w/fontist --entry-point=fontist --output=/mnt/w/fontist-package --Ruby=3.2.4
|
451
|
-
----
|
452
|
-
====
|
325
|
+
* Through the link:https://github.com/tamatebako/tebako-ci-containers[Tebako CI docker containers]
|
326
|
+
* Through local installation
|
453
327
|
|
328
|
+
Installation for both GNU and musl Linux distributions may heavily depend on the OS version,
|
329
|
+
so we recommend using link:https://github.com/tamatebako/tebako-ci-containers[Tebako CI docker containers]
|
330
|
+
for Linux packaging.
|
454
331
|
|
455
332
|
=== Local installation
|
456
333
|
|
457
|
-
|
458
|
-
|
459
|
-
There are cases where Docker may not be suitable for your needs, such as:
|
460
|
-
|
461
|
-
. Admin privileges: Running Docker requires administrative privileges, which
|
462
|
-
means Docker may not be available to users on their machines.
|
463
|
-
|
464
|
-
. Performance penalty: Docker introduces a performance penalty due to the
|
465
|
-
overhead of running containers. This can be a concern when packaging complex
|
466
|
-
applications that require heavy memory usage.
|
467
|
-
|
468
|
-
In such cases, you can choose to install Tebako locally.
|
469
|
-
|
470
|
-
Tebako is distributed as a Ruby gem. A Ruby environment is necessary.
|
471
|
-
|
472
|
-
|
473
|
-
[source,sh]
|
474
|
-
----
|
475
|
-
$ gem install tebako
|
476
|
-
----
|
477
|
-
|
478
|
-
|
479
|
-
==== Prerequisites
|
480
|
-
|
481
|
-
These prerequisites are needed only for users who want to install Tebako on
|
482
|
-
their machine and build all Tebako components locally.
|
483
|
-
|
484
|
-
If you use Docker, there is no need to set up these prerequisites.
|
485
|
-
|
486
|
-
===== Ubuntu 20.04
|
487
|
-
|
488
|
-
====== General
|
489
|
-
|
490
|
-
There are several prerequisites that need to be installed on Ubuntu 20.04 for
|
491
|
-
Tebako to work correctly.
|
492
|
-
|
493
|
-
|
494
|
-
====== GNU C/C++ 10+ or Clang C/C++ 12+
|
495
|
-
|
496
|
-
[source,sh]
|
497
|
-
----
|
498
|
-
apt install -y gcc-10 g++-10
|
499
|
-
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10
|
500
|
-
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10
|
501
|
-
----
|
502
|
-
|
503
|
-
or
|
504
|
-
|
505
|
-
[source,sh]
|
506
|
-
----
|
507
|
-
apt install -y clang-12
|
508
|
-
update-alternatives --install /usr/bin/clang clang /usr/bin/clang-12 150
|
509
|
-
update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-12 150
|
510
|
-
----
|
511
|
-
|
512
|
-
====== CMake version 3.20+
|
513
|
-
|
514
|
-
Tebako requires CMake at a version of at least 3.20+.
|
515
|
-
|
516
|
-
If such CMake version is not available as a default package, set it up as
|
517
|
-
follows.
|
334
|
+
To use Tebako on macOS or Windows, you need to install it locally.
|
518
335
|
|
519
|
-
|
520
|
-
[source,sh]
|
521
|
-
----
|
522
|
-
apt-get remove --purge --auto-remove cmake
|
523
|
-
apt-get update
|
524
|
-
apt-get install -y software-properties-common lsb-release curl
|
525
|
-
apt-get clean all
|
526
|
-
curl https://apt.kitware.com/kitware-archive.sh | bash
|
527
|
-
apt-get install cmake
|
528
|
-
----
|
529
|
-
|
530
|
-
====== Other development tools and libraries
|
531
|
-
|
532
|
-
[source,sh]
|
533
|
-
----
|
534
|
-
apt-get -y install sudo git curl build-essential pkg-config bison flex autoconf \
|
535
|
-
binutils-dev libevent-dev acl-dev libfmt-dev libjemalloc-dev libiberty-dev \
|
536
|
-
libdouble-conversion-dev liblz4-dev liblzma-dev libssl-dev libunwind-dev \
|
537
|
-
libboost-filesystem-dev libboost-program-options-dev libboost-system-dev \
|
538
|
-
libboost-iostreams-dev libboost-date-time-dev libboost-context-dev \
|
539
|
-
libboost-regex-dev libboost-thread-dev libbrotli-dev libdwarf-dev libelf-dev \
|
540
|
-
libgoogle-glog-dev libffi-dev libgdbm-dev libyaml-dev libncurses-dev \
|
541
|
-
libreadline-dev libncurses-dev libreadline-dev ruby-dev ruby-bundler \
|
542
|
-
libutfcpp-dev
|
543
|
-
----
|
544
|
-
|
545
|
-
===== Alpine 3.17
|
546
|
-
|
547
|
-
====== General
|
548
|
-
|
549
|
-
There are several prerequisites that need to be installed on Alpine 3.17 for
|
550
|
-
Tebako to work correctly.
|
551
|
-
|
552
|
-
====== APK packages
|
553
|
-
|
554
|
-
Run the following command to install all prerequisites.
|
555
|
-
|
556
|
-
[source,sh]
|
557
|
-
----
|
558
|
-
apk --no-cache --upgrade add build-base cmake git bash autoconf boost-static \
|
559
|
-
boost-dev flex-dev bison make binutils-dev libevent-dev acl-dev sed python3 \
|
560
|
-
pkgconfig lz4-dev openssl-dev zlib-dev xz ninja zip unzip curl libdwarf-dev \
|
561
|
-
libunwind-dev gflags-dev elfutils-dev libevent-static openssl-libs-static \
|
562
|
-
lz4-static xz-dev zlib-static libunwind-static acl-static tar libffi-dev \
|
563
|
-
gdbm-dev yaml-dev yaml-static ncurses-dev ncurses-static readline-dev \
|
564
|
-
readline-static p7zip ruby-dev gcompat gettext-dev gperf brotli-dev \
|
565
|
-
brotli-static jemalloc-dev fmt-dev xz-static
|
566
|
-
----
|
567
|
-
|
568
|
-
===== macOS
|
569
|
-
|
570
|
-
====== General
|
571
|
-
|
572
|
-
There are several prerequisites that need to be installed on macOS for Tebako to work correctly.
|
573
|
-
|
574
|
-
The following instructions work for:
|
575
|
-
|
576
|
-
* macOS 13 (Ventura) through macOS 15 (Sequoia)
|
577
|
-
|
578
|
-
|
579
|
-
====== Homebrew packages
|
580
|
-
|
581
|
-
We use Homebrew to install the necessary packages on macOS.
|
582
|
-
|
583
|
-
Tebako provides a `Brewfile` at the repository root that you can install all
|
584
|
-
dependencies using the `brew bundle` command.
|
585
|
-
|
586
|
-
[source,sh]
|
587
|
-
----
|
588
|
-
$ brew bundle
|
589
|
-
----
|
590
|
-
|
591
|
-
Alternatively, you can install the packages manually.
|
336
|
+
On Linux, there may be cases where Docker is not suitable for your needs, such as:
|
592
337
|
|
593
|
-
|
594
|
-
|
595
|
-
$ brew update
|
596
|
-
$ brew install gnu-sed bash pkg-config bison flex binutils libffi gdbm zlib \
|
597
|
-
ncurses double-conversion boost jemalloc fmt glog libevent libsodium lz4 xz \
|
598
|
-
libyaml openssl@3
|
599
|
-
----
|
600
|
-
|
601
|
-
====== Bison 3+
|
602
|
-
|
603
|
-
Tebako requires Bison 3+.
|
604
|
-
|
605
|
-
On macOS 14, the default Bison version is 2.3, and the Homebrew formula is
|
606
|
-
keg-only, which means that the full path to the Bison binary must be used to
|
607
|
-
utilize the correct version.
|
608
|
-
|
609
|
-
Run the following command prior to using Tebako, or add it into your shell
|
610
|
-
profile.
|
611
|
-
|
612
|
-
[source,sh]
|
613
|
-
----
|
614
|
-
export PATH="$(brew --prefix bison)/bin:$PATH"
|
615
|
-
----
|
616
|
-
|
617
|
-
====== jemalloc library build
|
618
|
-
|
619
|
-
On macOS, the `libdwarfs` build script creates an additional `jemalloc`
|
620
|
-
installation. This is done to satisfy the magic applied by folly during linking
|
621
|
-
but uses a static library.
|
622
|
-
|
623
|
-
If the `jemalloc` library is built within an emulated environment (QEMU,
|
624
|
-
Rosetta, etc.), there are known issues
|
625
|
-
(link:https://github.com/jemalloc/jemalloc/issues/1997[jemalloc issue #1997])
|
626
|
-
where `jemalloc` incorrectly detects the number of significant virtual address
|
627
|
-
bits and therefore defines them wrongly (`lg-vaddr` parameter).
|
628
|
-
|
629
|
-
Technically, these issues can be fixed by explicitly setting the
|
630
|
-
`--with-lg-vaddr` parameter for the `jemalloc` build. However, we decided not to
|
631
|
-
automate this since we do not feel that we can provide reasonable test coverage.
|
632
|
-
|
633
|
-
Instead, our build script accepts the `LG_VADDR` environment variable and passes
|
634
|
-
it to the jemalloc build as `--with-lg-vaddr=${LG_VADDR}`.
|
338
|
+
1. Administrative privileges: Running Docker requires administrative privileges,
|
339
|
+
which may not be available to all users on their machines.
|
635
340
|
|
636
|
-
|
637
|
-
|
341
|
+
2. Performance impact: Docker introduces performance overhead due to
|
342
|
+
containerization. This can be a concern when packaging complex
|
343
|
+
applications that require significant memory resources.
|
638
344
|
|
639
|
-
|
345
|
+
In such cases, you can choose to install Tebako locally on Linux as well.
|
640
346
|
|
641
|
-
|
347
|
+
Please refer to the separate document link:INSTALLATION.adoc[INSTALLATION.adoc]
|
348
|
+
for instructions on how to install Tebako.
|
642
349
|
|
643
|
-
|
644
|
-
====
|
645
|
-
[source,sh]
|
646
|
-
----
|
647
|
-
#!/bin/bash
|
648
|
-
|
649
|
-
# Check the CPU architecture
|
650
|
-
ARCH=$(uname -m)
|
651
|
-
|
652
|
-
# Check if running under Rosetta 2 emulation
|
653
|
-
if [[ "$ARCH" == "x86_64" && $(sysctl -n sysctl.proc_translated) == "1" ]]; then
|
654
|
-
echo "Running on Apple Silicon under Rosetta 2 emulation"
|
655
|
-
export LG_VADDR=39
|
656
|
-
elif [[ "$ARCH" == "arm64" ]]; then
|
657
|
-
echo "Running on Apple Silicon"
|
658
|
-
export LG_VADDR=39
|
659
|
-
else
|
660
|
-
echo "Running on Intel Silicon"
|
661
|
-
export LG_VADDR=48
|
662
|
-
fi
|
663
|
-
|
664
|
-
echo "Setting lg-vaddr to $LG_VADDR"
|
665
|
-
----
|
666
|
-
====
|
667
|
-
|
668
|
-
|
669
|
-
===== Windows
|
670
|
-
|
671
|
-
====== General
|
350
|
+
== Usage
|
672
351
|
|
673
|
-
|
352
|
+
=== Command-line interface
|
674
353
|
|
675
|
-
|
676
|
-
|
354
|
+
Tebako works by packaging your project into a single executable binary that
|
355
|
+
includes all the necessary dependencies.
|
677
356
|
|
678
|
-
|
357
|
+
You interact with Tebako through its command-line interface (CLI),
|
358
|
+
which provides the following commands:
|
679
359
|
|
680
|
-
|
681
|
-
It is simplest to use the Ruby development environment provided by
|
682
|
-
https://rubyinstaller.org[RubyInstaller].
|
360
|
+
Basic use:
|
683
361
|
|
684
|
-
|
362
|
+
`press`::
|
363
|
+
Packages a project into a single executable binary.
|
364
|
+
See <<press>> section for details.
|
685
365
|
|
686
|
-
|
366
|
+
Advanced use:
|
687
367
|
|
688
|
-
|
368
|
+
`setup`::
|
369
|
+
Runs post-install setup and creates the Tebako packaging environment.
|
370
|
+
See <<setup>> section for details.
|
689
371
|
|
690
|
-
|
372
|
+
`clean`::
|
373
|
+
Removes Tebako artifacts.
|
374
|
+
See <<clean>> section for details.
|
691
375
|
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
$ pacman -S git tar bison flex toolchain make cmake
|
696
|
-
boost diffutils libevent double-conversion
|
697
|
-
fmt glog dlfcn gtest autotools ncurses libyaml
|
698
|
-
----
|
376
|
+
`clean_ruby`::
|
377
|
+
Removes Tebako Ruby artifacts.
|
378
|
+
See <<clean_ruby>> section for details.
|
699
379
|
|
380
|
+
`hash`::
|
381
|
+
Calculates the Tebako script hash for use as a cache key in CI/CD environments.
|
382
|
+
See <<hash>> section for details.
|
700
383
|
|
384
|
+
`help`::
|
385
|
+
Displays the help message.
|
701
386
|
|
702
387
|
== Packaging
|
703
388
|
|
704
|
-
[[root-folder-selection]]
|
705
|
-
=== Tebako root folder (aka prefix) selection
|
706
|
-
|
707
|
-
The Tebako prefix determines the base directory for the tebako packaging environment. It contain build artifacts for
|
708
|
-
Tebako run-time, libraries and other components and is an essential part of configuring how Tebako operates within your system.
|
709
|
-
|
710
|
-
The selection of the Tebako prefix follows a specific order of precedence to
|
711
|
-
ensure flexibility and ease of use:
|
712
|
-
|
713
|
-
. *User-specified prefix*:
|
714
|
-
The most direct way to set the root folder is by specifying it through a
|
715
|
-
command-line argument.
|
716
|
-
|
717
|
-
. *Current Working Directory (PWD)*:
|
718
|
-
If the prefix option is explicitly set to `PWD`, Tebako uses the current working
|
719
|
-
directory as Tebako root folder.
|
720
|
-
|
721
|
-
. *Environment variable (`TEBAKO_PREFIX`)*:
|
722
|
-
In the absence of a user-specified option, Tebako looks for an environment
|
723
|
-
variable named `TEBAKO_PREFIX`. If found, its value is used as the root folder.
|
724
|
-
|
725
|
-
. *Default value*:
|
726
|
-
If no prefix is specified and the `TEBAKO_DIR` environment variable is not set,
|
727
|
-
Tebako defaults to using a directory named `.tebako` in the user's home
|
728
|
-
directory.
|
729
|
-
|
730
|
-
Path Expansion: Regardless of the method used to set the Tebako prefix, Tebako
|
731
|
-
expands the provided path to an absolute path. This expansion includes resolving
|
732
|
-
relative paths based on the current working directory and expanding user
|
733
|
-
directory shortcuts like `~`.
|
734
|
-
|
735
|
-
Please do not use Tebako prefix under your application root (`--root` parameter). It is not an error
|
736
|
-
but it will cause Tebako to place all build-time artifacts to tebako package dramatically increasing its size.
|
737
|
-
You do not need it unless under very special circumstances like tebako packaging tebako itself.
|
738
|
-
|
739
389
|
=== Commands
|
740
390
|
|
741
391
|
Tebako provides several commands to manage the packaging and deployment process.
|
@@ -862,6 +512,8 @@ to be separately packaged.
|
|
862
512
|
`application`::: Create the application package only. The output file is named according to the `-o` option.
|
863
513
|
`runtime`::: Create the runtime package only. The output file is named according to the `-o` option.
|
864
514
|
|
515
|
+
More information on the `mode` option is available in the <<Tebako runtime and application packages. Splitting and bundling.>> section.
|
516
|
+
|
865
517
|
`--ref`::
|
866
518
|
(optional)
|
867
519
|
Defaults to `tebako-runtime`.
|
@@ -895,21 +547,20 @@ tebako press \
|
|
895
547
|
|
896
548
|
==== Setup
|
897
549
|
|
898
|
-
|
550
|
+
Tebako requires post-install setup after gem installation .
|
551
|
+
Post-intall setup is called automatically during the first packaging.
|
552
|
+
There is no need run setup manually unless you need pristine Tebako
|
553
|
+
packaging environment to implement caching strategy.
|
554
|
+
We recommended to build cache based on `tebako setup` output. Building cache
|
555
|
+
based on `tebako press` may create inconsistent environment upon restore.
|
556
|
+
|
899
557
|
|
900
|
-
|
558
|
+
Setup collects required packages, builds the and creates packaging environment. This
|
901
559
|
is a lengthy task that can take significant time, up to 1 hour.
|
902
560
|
|
903
561
|
Tebako supports several configurations at a single system given that their root
|
904
562
|
directories differ and multiple Ruby versions within single configuration
|
905
563
|
|
906
|
-
This command is optional, tebako creates packaging environment automatically
|
907
|
-
upon the first invocation of press command.
|
908
|
-
|
909
|
-
However, if you plan to use tebako in CI/CD environment with caching it is
|
910
|
-
highly recommended to build cache based on `tebako setup` output. Building cache
|
911
|
-
based on `tebako press` may create inconsistent environment upon restore.
|
912
|
-
|
913
564
|
[source,sh]
|
914
565
|
----
|
915
566
|
$ tebako setup \
|
@@ -965,7 +616,7 @@ tebako clean --prefix='~/.tebako'
|
|
965
616
|
----
|
966
617
|
====
|
967
618
|
|
968
|
-
|
619
|
+
<<clean_ruby>>
|
969
620
|
==== Clean Ruby
|
970
621
|
|
971
622
|
This command cleans up only the Ruby artifacts from the specified prefix
|
@@ -1007,6 +658,7 @@ tebako clean_ruby --prefix='~/.tebako'
|
|
1007
658
|
----
|
1008
659
|
====
|
1009
660
|
|
661
|
+
<<hash>>
|
1010
662
|
==== Build script hash
|
1011
663
|
|
1012
664
|
This command outputs a hash value for the Tebako build script, which can be used
|
@@ -1017,6 +669,117 @@ as a cache key in CI/CD pipelines.
|
|
1017
669
|
$ tebako hash
|
1018
670
|
----
|
1019
671
|
|
672
|
+
=== Using Docker
|
673
|
+
|
674
|
+
==== General
|
675
|
+
|
676
|
+
If you have Docker installed and available, the easiest way to run Tebako is
|
677
|
+
through the official Docker containers.
|
678
|
+
|
679
|
+
Docker containers with preinstalled Tebako packaging environments for Ubuntu and
|
680
|
+
Alpine Linux are available at
|
681
|
+
https://github.com/tamatebako/tebako-ci-containers[tebako-ci-containers].
|
682
|
+
|
683
|
+
|
684
|
+
==== Pull the container
|
685
|
+
|
686
|
+
Pull the Tebako container image.
|
687
|
+
|
688
|
+
[source,sh]
|
689
|
+
----
|
690
|
+
docker pull ghcr.io/tamatebako/tebako-<container_tag>:latest
|
691
|
+
----
|
692
|
+
|
693
|
+
`<container_tag>`:: is the desired image tag (e.g., `ubuntu-20.04` or `alpine-3.17`).
|
694
|
+
|
695
|
+
|
696
|
+
==== Running Tebako commands in the container
|
697
|
+
|
698
|
+
Simply prefix the Tebako command with `docker run` and the container image.
|
699
|
+
|
700
|
+
[source,sh]
|
701
|
+
----
|
702
|
+
docker run -v <application_folder>:/mnt/w \
|
703
|
+
-t ghcr.io/tamatebako/tebako-<container_tag>:latest \
|
704
|
+
tebako {command} {parameters}
|
705
|
+
----
|
706
|
+
|
707
|
+
==== Packaging from outside the container
|
708
|
+
|
709
|
+
To package your application from outside the container, just run a single Docker
|
710
|
+
command.
|
711
|
+
|
712
|
+
This command mounts the application folder into the container and runs the
|
713
|
+
`tebako press` command, specifying the application root, entry point, output
|
714
|
+
location, and Ruby version.
|
715
|
+
|
716
|
+
[source,sh]
|
717
|
+
----
|
718
|
+
docker run -v <application_folder>:/mnt/w \
|
719
|
+
-t ghcr.io/tamatebako/tebako-<container_tag>:latest \
|
720
|
+
tebako press <tebako-press-parameters>
|
721
|
+
----
|
722
|
+
|
723
|
+
`<application_folder>`:: is the path to your application folder.
|
724
|
+
|
725
|
+
`<container_tag>`:: is the desired image tag (e.g., `ubuntu-20.04` or `alpine-3.17`).
|
726
|
+
|
727
|
+
|
728
|
+
[example]
|
729
|
+
====
|
730
|
+
Assume that you have a Ruby application in the `fontist` folder of the current
|
731
|
+
directory.
|
732
|
+
|
733
|
+
You can package it to `./fontist-package` using the following command:
|
734
|
+
|
735
|
+
[source,sh]
|
736
|
+
----
|
737
|
+
docker run -v $PWD:/mnt/w \
|
738
|
+
-t ghcr.io/tamatebako/tebako-ubuntu-20.04:latest \
|
739
|
+
tebako press --root=/mnt/w/fontist --entry-point=fontist --output=/mnt/w/fontist-package --Ruby=3.2.4
|
740
|
+
----
|
741
|
+
====
|
742
|
+
|
743
|
+
==== Packaging from inside the container
|
744
|
+
|
745
|
+
It is also possible to package an application from inside the Tebako container.
|
746
|
+
|
747
|
+
Start and enter the container interactively.
|
748
|
+
|
749
|
+
[source,sh]
|
750
|
+
----
|
751
|
+
docker run -it --rm -v <application_folder>:/mnt/w \
|
752
|
+
ghcr.io/tamatebako/tebako-<container_tag>:latest bash
|
753
|
+
----
|
754
|
+
|
755
|
+
`<application_folder>`:: is the path to your application folder.
|
756
|
+
|
757
|
+
`<container_tag>`:: is the desired image tag (e.g., `ubuntu-20.04` or `alpine-3.17`).
|
758
|
+
|
759
|
+
|
760
|
+
Once inside, run the `tebako press` command:
|
761
|
+
|
762
|
+
[source,sh]
|
763
|
+
----
|
764
|
+
tebako press <tebako press parameters>
|
765
|
+
----
|
766
|
+
|
767
|
+
[example]
|
768
|
+
====
|
769
|
+
Assume that you have a Ruby application in the `fontist` folder of the current
|
770
|
+
directory.
|
771
|
+
|
772
|
+
You can package it to `./fontist-package` using the following command:
|
773
|
+
|
774
|
+
[source,sh]
|
775
|
+
----
|
776
|
+
$ docker run -it --rm -v $PWD:/mnt/w ghcr.io/tamatebako/tebako-<container_tag>:latest bash
|
777
|
+
|
778
|
+
# Inside the container:
|
779
|
+
$ tebako press --root=/mnt/w/fontist --entry-point=fontist --output=/mnt/w/fontist-package --Ruby=3.2.4
|
780
|
+
----
|
781
|
+
====
|
782
|
+
|
1020
783
|
=== Tebako configuration file
|
1021
784
|
|
1022
785
|
It is possible to provide all or some options for the `tebako
|
@@ -1047,7 +810,20 @@ options:
|
|
1047
810
|
----
|
1048
811
|
====
|
1049
812
|
|
1050
|
-
|
813
|
+
[[root-folder-selection]]
|
814
|
+
=== Tebako root folder (aka prefix) selection
|
815
|
+
|
816
|
+
The Tebako prefix determines the base directory for the tebako packaging environment. It contain build artifacts for
|
817
|
+
Tebako run-time, libraries and other components and is an essential part of configuring how Tebako operates within your system.
|
818
|
+
|
819
|
+
The selection of the Tebako prefix follows a specific order of precedence to
|
820
|
+
ensure flexibility and ease of use as described in the next section.
|
821
|
+
|
822
|
+
Please do not use Tebako prefix under your application root (`--root` parameter). It is not an error
|
823
|
+
but it will cause Tebako to place all build-time artifacts to tebako package dramatically increasing its size.
|
824
|
+
You do not need it unless under very special circumstances like tebako packaging tebako itself.
|
825
|
+
|
826
|
+
=== Options preference order
|
1051
827
|
|
1052
828
|
Tebako supports several methods to set options. The table below show preference order and limitations for specific options.
|
1053
829
|
samller order means higher proirity.
|
@@ -1139,115 +915,135 @@ and the bundler version requirements specified in the Gemfile.
|
|
1139
915
|
|
1140
916
|
== Packaging scenarios
|
1141
917
|
|
1142
|
-
|
918
|
+
There are two common methods for distributing a Ruby application:
|
1143
919
|
|
1144
|
-
|
920
|
+
* Copying the entire directory tree of the application to the target system.
|
921
|
+
* Creating a Ruby gem from the application and publishing or distributing it
|
922
|
+
as a gem.
|
1145
923
|
|
1146
|
-
|
924
|
+
Tebako supports both methods, but with an important distinction: during
|
925
|
+
packaging, it does not deploy the application to the target system. Instead,
|
926
|
+
it places it in a pristine Ruby environment that functions as an in-memory
|
927
|
+
filesystem ("memfs").
|
1147
928
|
|
1148
|
-
|
929
|
+
Regardless of the packaging scenario, Tebako requires two inputs:
|
930
|
+
|
931
|
+
* A root folder containing the application to be packaged.
|
932
|
+
* An entry point — a Ruby file that will be executed when the packaged
|
933
|
+
application starts.
|
934
|
+
|
935
|
+
The appropriate packaging scenario is determined by the contents of the
|
936
|
+
root folder:
|
937
|
+
|
938
|
+
[cols="3", options="header"]
|
1149
939
|
|===
|
1150
|
-
|
|
940
|
+
| #
|
941
|
+
| Conditions
|
942
|
+
| Scenario Description
|
1151
943
|
|
1152
944
|
| 1
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
| `<mount_point>/local/<entry_point base name>`
|
1156
|
-
| No
|
1157
|
-
| No
|
1158
|
-
| No
|
1159
|
-
|
945
|
+
| No `Gemfile`, `.gemspec`, or `.gem` files
|
946
|
+
| <<1-simple-script,Simple Script>>
|
1160
947
|
|
1161
948
|
| 2
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
| `<mount_point>/bin/<entry_point base name>` (i.e., binstub is expected)
|
1165
|
-
| No
|
1166
|
-
| No
|
1167
|
-
| One
|
1168
|
-
|
949
|
+
| `Gemfile` present, no `.gemspec` files
|
950
|
+
| <<2-bundled-project, Bundled Project>>
|
1169
951
|
|
1170
952
|
| 3
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
. Build the gem using `gem build` command at the host
|
1174
|
-
. Install it with `gem install` to packaged filesystem
|
1175
|
-
|
1176
|
-
| `<mount_point>/bin/<entry_point base name>` (i.e., binstub is expected)
|
1177
|
-
| One
|
1178
|
-
| No
|
1179
|
-
| Any
|
1180
|
-
|
953
|
+
| `.gemspec` present, no `Gemfile`
|
954
|
+
| <<3-gem, Gem>>
|
1181
955
|
|
1182
956
|
| 4
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
. Collect dependencies at the host with `bundle install`
|
1186
|
-
. Build the gem using `gem build` command
|
1187
|
-
. Install it with `gem install` to packaged file system
|
957
|
+
| Both `.gemspec` and `Gemfile` present
|
958
|
+
| <<4-bundled-gem, Bundled Gem>>
|
1188
959
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
| Any
|
960
|
+
| 5
|
961
|
+
| `.gem` files present, no `Gemfile` or `.gemspec`
|
962
|
+
| <<5-prebuilt-gem, Prebuilt Gem>>
|
1193
963
|
|
964
|
+
|===
|
1194
965
|
|
1195
|
-
|
1196
|
-
|
1197
|
-
|
1198
|
-
| -
|
1199
|
-
| No
|
1200
|
-
| No
|
1201
|
-
| Two or more
|
966
|
+
=== 1. Simple Script
|
967
|
+
If the root folder does not contain a `Gemfile`, `.gemspec`, or `.gem`
|
968
|
+
files, Tebako treats the application as a simple script.
|
1202
969
|
|
970
|
+
In this case:
|
1203
971
|
|
1204
|
-
|
1205
|
-
|
1206
|
-
|
1207
|
-
| -
|
1208
|
-
| Two or more
|
1209
|
-
| Any
|
1210
|
-
| Any
|
972
|
+
* The entire root folder (including subdirectories) is copied to
|
973
|
+
`<memfs root>/local`.
|
974
|
+
* On startup, Tebako executes `<memfs root>/local/<entry point>`.
|
1211
975
|
|
1212
|
-
|
976
|
+
=== 2. Bundled Project
|
977
|
+
If the root folder contains a `Gemfile` but no `.gemspec` files, the
|
978
|
+
application is considered a bundled project. This is common for Rails or
|
979
|
+
Sinatra projects.
|
1213
980
|
|
1214
|
-
|
981
|
+
In this scenario, Tebako:
|
1215
982
|
|
1216
|
-
|
983
|
+
* Runs `bundle install` using the provided `Gemfile` within the pristine
|
984
|
+
Ruby environment.
|
985
|
+
* Copies the root folder and all subdirectories to `<memfs root>/local`.
|
986
|
+
* Executes `<memfs root>/local/<entry point>` on startup.
|
1217
987
|
|
1218
|
-
===
|
988
|
+
=== 3. Gem
|
989
|
+
If the root folder contains a `.gemspec` file but no `Gemfile`, Tebako
|
990
|
+
assumes it is packaging a gem.
|
1219
991
|
|
1220
|
-
|
992
|
+
In this case:
|
1221
993
|
|
1222
|
-
|
1223
|
-
====
|
1224
|
-
For example, if the package was created with the following command
|
994
|
+
* Tebako runs the following commands within the pristine Ruby environment:
|
1225
995
|
|
1226
996
|
[source,sh]
|
1227
997
|
----
|
1228
|
-
|
1229
|
-
|
1230
|
-
--entry=start.rb \
|
1231
|
-
--output=/temp/myproject.tebako
|
998
|
+
gem build
|
999
|
+
gem install
|
1232
1000
|
----
|
1233
|
-
running
|
1234
1001
|
|
1235
|
-
|
1236
|
-
|
1237
|
-
|
1238
|
-
|
1002
|
+
* The entry point is assumed to be one of the gem’s executables, placed in
|
1003
|
+
the binary folder during installation. Within Tebako’s in-memory
|
1004
|
+
filesystem, this folder is `<memfs root>/bin`.
|
1005
|
+
* On startup, Tebako executes `<memfs root>/bin/<entry point>`.
|
1239
1006
|
|
1240
|
-
|
1007
|
+
NOTE: Multiple `.gemspec` files in the root folder are not supported.
|
1008
|
+
|
1009
|
+
=== 4. Bundled Gem
|
1010
|
+
If the root folder contains both a `.gemspec` file and a `Gemfile`, Tebako
|
1011
|
+
assumes it is packaging a bundled gem.
|
1012
|
+
|
1013
|
+
In this case:
|
1014
|
+
|
1015
|
+
* Tebako runs the following commands within the pristine Ruby environment:
|
1241
1016
|
|
1242
1017
|
[source,sh]
|
1243
1018
|
----
|
1244
|
-
|
1019
|
+
bundle install
|
1020
|
+
bundle exec gem build
|
1021
|
+
bundle exec gem install
|
1245
1022
|
----
|
1246
|
-
====
|
1247
1023
|
|
1248
|
-
|
1249
|
-
|
1024
|
+
* The entry point follows the same logic as in the Gem Packaging scenario
|
1025
|
+
(`<memfs root>/bin/<entry point>`).
|
1026
|
+
|
1027
|
+
NOTE: Multiple `.gemspec` files in the root folder are not supported.
|
1028
|
+
|
1029
|
+
=== 5. Prebuilt Gem
|
1030
|
+
If the root folder contains `.gem` files but no `Gemfile` or `.gemspec`,
|
1031
|
+
Tebako assumes it is packaging prebuilt gems.
|
1250
1032
|
|
1033
|
+
In this case:
|
1034
|
+
|
1035
|
+
* Tebako runs `gem install` for all `.gem` files in the root folder, in
|
1036
|
+
a random order.
|
1037
|
+
* The entry point follows the same logic as in the Gem Packaging scenario
|
1038
|
+
(`<memfs root>/bin/<entry point>`).
|
1039
|
+
|
1040
|
+
|
1041
|
+
== Tebako runtime and application packages. Splitting and bundling.
|
1042
|
+
|
1043
|
+
=== General
|
1044
|
+
|
1045
|
+
Tebako provides a method either to create a single bundle package that contains Ruby run-time and the application or create separate
|
1046
|
+
reusable runtime package and application package that can be deployed without a runtime.
|
1251
1047
|
|
1252
1048
|
=== Creating a bundle package
|
1253
1049
|
|
@@ -1394,10 +1190,68 @@ Hello, Maxim!
|
|
1394
1190
|
----
|
1395
1191
|
====
|
1396
1192
|
|
1193
|
+
== Packaging Ruby Gems with Post-Installation Requirements
|
1194
|
+
|
1195
|
+
Unlike the traditional approach to Ruby program distribution, Tebako is designed with a clear separation between the build and
|
1196
|
+
target environments. We assume that a Tebako package created in the build environment should remain independent of it and run unchanged
|
1197
|
+
in the target environment.
|
1198
|
+
|
1199
|
+
While this approach is appealing, it imposes certain limitations on some Ruby gems, including Tebako itself. Specifically, gems that
|
1200
|
+
require a post-installation setup step often establish a strong dependency on the target environment. This setup might involve installing
|
1201
|
+
native libraries, linking to existing system components, or otherwise relying on the target system’s configuration.
|
1202
|
+
|
1203
|
+
To be packaged by Tebako, gems that require post-installation setup must meet two additional requirements:
|
1204
|
+
|
1205
|
+
1. *Ability to run post-installation setup from a read-only filesystem, outside the gem installation folder.*
|
1206
|
+
For example, Tebako uses the location specified by the `prefix` parameter to create any necessary files during post-installation.
|
1207
|
+
|
1208
|
+
2. *Automatic execution of the post-installation setup when required.*
|
1209
|
+
For instance, when the `tebako press` command is executed, it first checks whether `tebako setup` has been run and triggers it if necessary.
|
1210
|
+
|
1211
|
+
By adhering to these principles, gems that require post-installation setup will not only be compatible with Tebako but will also provide a more
|
1212
|
+
robust and consistent runtime experience, allowing them to run seamlessly across different environments.
|
1213
|
+
|
1214
|
+
|
1215
|
+
== Run-time options
|
1216
|
+
|
1217
|
+
=== General
|
1218
|
+
|
1219
|
+
Generally, Tebako packages pass command line options to the packaged application.
|
1220
|
+
|
1221
|
+
[example]
|
1222
|
+
====
|
1223
|
+
For example, if the package was created with the following command
|
1224
|
+
|
1225
|
+
[source,sh]
|
1226
|
+
----
|
1227
|
+
tebako press \
|
1228
|
+
--root='~/projects/myproject' \
|
1229
|
+
--entry=start.rb \
|
1230
|
+
--output=/temp/myproject.tebako
|
1231
|
+
----
|
1232
|
+
running
|
1233
|
+
|
1234
|
+
[source,sh]
|
1235
|
+
----
|
1236
|
+
/temp/myproject.tebako --option --parameter value
|
1237
|
+
----
|
1238
|
+
|
1239
|
+
will be translated by Tebako bootstrap code to
|
1240
|
+
|
1241
|
+
[source,sh]
|
1242
|
+
----
|
1243
|
+
myproject --option --parameter value
|
1244
|
+
----
|
1245
|
+
====
|
1246
|
+
|
1247
|
+
However, there are several command-line parameters that are intercepted and processed
|
1248
|
+
by Tebako bootstrap code as described below.
|
1249
|
+
|
1250
|
+
|
1397
1251
|
=== Image extraction (`--tebako-extract` option)
|
1398
1252
|
|
1399
1253
|
Tebako provides an option to extract its DwarFS filesystem from a package to
|
1400
|
-
a local folder for verification or
|
1254
|
+
a local folder for verification or examination.
|
1401
1255
|
|
1402
1256
|
[source,sh]
|
1403
1257
|
----
|
@@ -1450,11 +1304,11 @@ change the paths for temporary files, caches, and sockets.
|
|
1450
1304
|
To address this inevitable limitation for Ruby applications,
|
1451
1305
|
Tebako provides an option to mount a host folder to the memfs tree.
|
1452
1306
|
|
1453
|
-
When using Tebako,
|
1454
|
-
|
1307
|
+
When using Tebako, be aware of how your application's directory structure is packaged,
|
1308
|
+
as this affects which paths may need mounting.
|
1455
1309
|
|
1456
|
-
|
1457
|
-
|
1310
|
+
You can use the `--tebako-extract` option described earlier to better understand
|
1311
|
+
your application's file structure before deciding which folders to mount.
|
1458
1312
|
|
1459
1313
|
[example]
|
1460
1314
|
====
|
@@ -1479,8 +1333,8 @@ The `--tebako-mount` option has the following syntax:
|
|
1479
1333
|
The `--tebako-mount` option can be repeated multiple times to mount more than
|
1480
1334
|
one object. The `memfs path` is relative to the memfs root, and it is
|
1481
1335
|
recommended to use absolute paths for host objects. Both directories and files
|
1482
|
-
can be mounted in this way. Tebako allows
|
1483
|
-
|
1336
|
+
can be mounted in this way. Tebako allows you to overlay host directories on existing memfs objects,
|
1337
|
+
providing a flexible solution for handling read-write requirements in packaged applications.
|
1484
1338
|
|
1485
1339
|
== Trivia: origin of name
|
1486
1340
|
|
@@ -1497,11 +1351,16 @@ Since "tamatebako" is rather long for the non-Japanese speaker, we use "tebako"
|
|
1497
1351
|
|
1498
1352
|
== Contributing
|
1499
1353
|
|
1500
|
-
We welcome contributions!
|
1501
|
-
|
1354
|
+
We welcome contributions!
|
1355
|
+
|
1356
|
+
Please see our link:CONTRIBUTING.adoc[contribution guidelines] and our
|
1357
|
+
link:CODE_OF_CONDUCT.adoc[code of conduct] for more information,.
|
1358
|
+
|
1359
|
+
NOTE: Our guidelines are aligned with the contribution guidelines from the RNP project.
|
1502
1360
|
|
1503
1361
|
== License
|
1504
1362
|
|
1505
1363
|
Copyright Ribose. All rights reserved.
|
1506
1364
|
|
1507
|
-
Tebako is released under the BSD 2-Clause License. See the
|
1365
|
+
Tebako is released under the BSD 2-Clause License. See the
|
1366
|
+
link:LICENSE.md[LICENSE.md] file for details.
|