mirror of
https://github.com/gotenberg/gotenberg.git
synced 2026-08-08 00:22:14 +01:00
Compare commits
823 Commits
v7.1.0
...
9ec7be4687
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9ec7be4687 | ||
|
|
de7f335791 | ||
|
|
815f586315 | ||
|
|
b71df026f6 | ||
|
|
8d29638b74 | ||
|
|
63c9a36599 | ||
|
|
31fa392db2 | ||
|
|
bb0b874d16 | ||
|
|
60f5a7b996 | ||
|
|
8b559eb699 | ||
|
|
50e8e44bc1 | ||
|
|
b243283c9b | ||
|
|
a0d5e93ced | ||
|
|
7568fc379b | ||
|
|
5b21dbf1a9 | ||
|
|
0a62359691 | ||
|
|
7418b5cab3 | ||
|
|
337a5cca64 | ||
|
|
387fce2cf6 | ||
|
|
c89991cc0d | ||
|
|
0c8d681c35 | ||
|
|
3d300c2a09 | ||
|
|
8aa5a4f0e7 | ||
|
|
a92a7fedba | ||
|
|
d0e3991d16 | ||
|
|
d67ef724f9 | ||
|
|
68a0a9e5c1 | ||
|
|
b5f77c3b73 | ||
|
|
be5dcf943d | ||
|
|
9ca1e302bd | ||
|
|
3617bc6587 | ||
|
|
874adf076c | ||
|
|
9d83255ecd | ||
|
|
3b43bfbf33 | ||
|
|
7614964109 | ||
|
|
7b054da4e7 | ||
|
|
98fc403478 | ||
|
|
808a96f3d0 | ||
|
|
d4c20c6b39 | ||
|
|
2050b4ae6b | ||
|
|
c0ed2dee3c | ||
|
|
f8905bac8c | ||
|
|
3b1e4cbac4 | ||
|
|
287ee5be72 | ||
|
|
9ab39b6fca | ||
|
|
5558e43821 | ||
|
|
40666529f9 | ||
|
|
0f5e1b794a | ||
|
|
3ab8c5920b | ||
|
|
54853e2cbd | ||
|
|
5c6a5c64b5 | ||
|
|
60482a5cdf | ||
|
|
a6faa892a8 | ||
|
|
4ebd977d97 | ||
|
|
a82dd9f031 | ||
|
|
8668a1d710 | ||
|
|
e7c8a6a50c | ||
|
|
11ab93aef6 | ||
|
|
1498473495 | ||
|
|
c24883b8a1 | ||
|
|
f6069ef84f | ||
|
|
7465166de7 | ||
|
|
de572fe6b5 | ||
|
|
2b20399a80 | ||
|
|
7c630ecc6e | ||
|
|
bbebad1175 | ||
|
|
387728f09a | ||
|
|
65e8bf20d4 | ||
|
|
e1c28d8450 | ||
|
|
c63dd5ce1e | ||
|
|
7a439632da | ||
|
|
525102b991 | ||
|
|
8e1ab0110f | ||
|
|
a5efccd4cc | ||
|
|
0b0e817ca5 | ||
|
|
f5b26c0b2c | ||
|
|
8003109012 | ||
|
|
a0ec46a764 | ||
|
|
b32545e589 | ||
|
|
cb461bb1fe | ||
|
|
190cad0ee2 | ||
|
|
1d0c9acb2a | ||
|
|
08181f8550 | ||
|
|
9ea0e82525 | ||
|
|
7967035981 | ||
|
|
3d891edee4 | ||
|
|
320ad62e7b | ||
|
|
27e70fde46 | ||
|
|
2a9bf6bf11 | ||
|
|
7f9c3e171c | ||
|
|
13c5b99962 | ||
|
|
6671b5e5d3 | ||
|
|
f9a01c9fb3 | ||
|
|
26d373854a | ||
|
|
93d0103585 | ||
|
|
c1cdcbdaab | ||
|
|
fe1b0020b8 | ||
|
|
b47b9f45d8 | ||
|
|
8c0ad887f2 | ||
|
|
45b9f32351 | ||
|
|
ace379a92c | ||
|
|
4998870723 | ||
|
|
64c28dd45e | ||
|
|
68e0f88d5b | ||
|
|
cc97cb7e59 | ||
|
|
200334197f | ||
|
|
ce9c48b2b0 | ||
|
|
05465b3a74 | ||
|
|
1c0ff24c4b | ||
|
|
8f711b0f99 | ||
|
|
430f95f79f | ||
|
|
259d80bb68 | ||
|
|
7a914fce65 | ||
|
|
a2a8c42457 | ||
|
|
4b192b1498 | ||
|
|
c204cadfc5 | ||
|
|
35f1a990a6 | ||
|
|
7729bd0590 | ||
|
|
2980ca97a3 | ||
|
|
bb95b9b7f3 | ||
|
|
62d98fef79 | ||
|
|
db51f9026d | ||
|
|
3187980ead | ||
|
|
eff9444294 | ||
|
|
999dd2db40 | ||
|
|
f44d59d514 | ||
|
|
092b526ab5 | ||
|
|
0b5eaff8d9 | ||
|
|
46e190970f | ||
|
|
55d19522a8 | ||
|
|
924576d3d4 | ||
|
|
405d8d1c2b | ||
|
|
1b1e100107 | ||
|
|
c3b4702424 | ||
|
|
866ae53436 | ||
|
|
53e6a0ecf8 | ||
|
|
eab3d2da12 | ||
|
|
3f01ca18d3 | ||
|
|
405f1069c0 | ||
|
|
f1d1215c7c | ||
|
|
9bf12e7cb9 | ||
|
|
b87a6d4dfb | ||
|
|
a80191a288 | ||
|
|
e4a43434dc | ||
|
|
4811a00543 | ||
|
|
cfb48d9af4 | ||
|
|
8b65315a09 | ||
|
|
20522fd1ac | ||
|
|
e28e2ebf0f | ||
|
|
15050a311b | ||
|
|
c99eb471f9 | ||
|
|
53c2f97008 | ||
|
|
61cadd0e6a | ||
|
|
813926cd47 | ||
|
|
f447e31ae2 | ||
|
|
00c6ed0387 | ||
|
|
cdf861bcfd | ||
|
|
5279d73928 | ||
|
|
e6d2a5640b | ||
|
|
4387a4f122 | ||
|
|
bf0d0a4f40 | ||
|
|
f8809b3943 | ||
|
|
9e5b05ad3c | ||
|
|
452a500955 | ||
|
|
1ab0117943 | ||
|
|
5be574081c | ||
|
|
6430bc6a5c | ||
|
|
e0eff40f74 | ||
|
|
385cbe6590 | ||
|
|
043b1588de | ||
|
|
e5d861def3 | ||
|
|
72bc6f895a | ||
|
|
7549a69f71 | ||
|
|
ebf0548d19 | ||
|
|
d3a65a587c | ||
|
|
8f7c1c98ad | ||
|
|
40d75882a2 | ||
|
|
bb91259829 | ||
|
|
0b33be17a4 | ||
|
|
3a78b89c97 | ||
|
|
c72be765b0 | ||
|
|
4e9f63004d | ||
|
|
08088c15f4 | ||
|
|
8625a4e899 | ||
|
|
06b2b2e10c | ||
|
|
bd6d92be9b | ||
|
|
ed22f1e5e6 | ||
|
|
8e3acc8d0a | ||
|
|
51afa5ba85 | ||
|
|
d67500ee05 | ||
|
|
0bec14c6ac | ||
|
|
3b0eb06991 | ||
|
|
410c1dfd7f | ||
|
|
b98378311f | ||
|
|
e6306e7c2f | ||
|
|
0663e5f92b | ||
|
|
21e300fcec | ||
|
|
7fb4c89832 | ||
|
|
1e26fdd35b | ||
|
|
19db80bc2e | ||
|
|
4ac493250c | ||
|
|
ec9d960538 | ||
|
|
5fa6603fa4 | ||
|
|
d81517bf26 | ||
|
|
9af0f2896c | ||
|
|
f619ce09d6 | ||
|
|
58c41dd01f | ||
|
|
ec3e415bf0 | ||
|
|
230cb8da2c | ||
|
|
59f96358c4 | ||
|
|
874e78c6cd | ||
|
|
caea81501d | ||
|
|
1578253fb1 | ||
|
|
fec6437c5d | ||
|
|
edff24913a | ||
|
|
5120b49639 | ||
|
|
0e13cc3ed8 | ||
|
|
cb49e8e4d1 | ||
|
|
3113e034f6 | ||
|
|
85291fdec3 | ||
|
|
57e1b7efda | ||
|
|
be78a71bb7 | ||
|
|
2baa59cb3a | ||
|
|
aea7c5952a | ||
|
|
cbde321d3b | ||
|
|
aa5de988cf | ||
|
|
fd485a0d3e | ||
|
|
aea06a98b7 | ||
|
|
82401bdfdd | ||
|
|
12c25a2d21 | ||
|
|
241d5077c9 | ||
|
|
37757315d0 | ||
|
|
1195c37508 | ||
|
|
3d9b2deb59 | ||
|
|
32d948554f | ||
|
|
b7a6b7aba2 | ||
|
|
05e15a1d06 | ||
|
|
f57ecb6ef2 | ||
|
|
45318497d2 | ||
|
|
b762143d75 | ||
|
|
ba1a730d3a | ||
|
|
463bb2f91c | ||
|
|
e14cab0c8b | ||
|
|
3220ca4140 | ||
|
|
92de0cf6fe | ||
|
|
d111591c8b | ||
|
|
935686b9e3 | ||
|
|
b1ad21c7d3 | ||
|
|
4f800c8a76 | ||
|
|
5c498219ed | ||
|
|
0b211c39eb | ||
|
|
77b9776d9c | ||
|
|
04e596b616 | ||
|
|
9fba76fe5c | ||
|
|
8b9858aa66 | ||
|
|
2f7218b09c | ||
|
|
0a05091241 | ||
|
|
507d0cb2e2 | ||
|
|
fb61948244 | ||
|
|
15fdc99ec0 | ||
|
|
dd07c73c28 | ||
|
|
43354cafb1 | ||
|
|
b2c3187690 | ||
|
|
4a788ce9d8 | ||
|
|
f9ad8bd2d5 | ||
|
|
4429aea8a4 | ||
|
|
7a60e82d03 | ||
|
|
3544e9c355 | ||
|
|
ca4f0141c6 | ||
|
|
fcaa26a84d | ||
|
|
ea103d3070 | ||
|
|
286efbe548 | ||
|
|
a0ee800002 | ||
|
|
f4d3fba306 | ||
|
|
d5a58cfcb5 | ||
|
|
0e6bb27ecf | ||
|
|
83fdc01df1 | ||
|
|
c7ccabc6cb | ||
|
|
3eefe33e64 | ||
|
|
c44dc7f0ab | ||
|
|
1639d82348 | ||
|
|
b31e520731 | ||
|
|
e85d4143c0 | ||
|
|
da20f04e25 | ||
|
|
9a49ea426e | ||
|
|
c0c4c21682 | ||
|
|
c7424dfcb3 | ||
|
|
e33ca6af12 | ||
|
|
9dc6e308b6 | ||
|
|
4fe2ff5553 | ||
|
|
e5ccb82db8 | ||
|
|
63ae987010 | ||
|
|
efa0d3fd75 | ||
|
|
fd5930bc56 | ||
|
|
a057c6253b | ||
|
|
ed5d1fa891 | ||
|
|
76d36d18be | ||
|
|
a78c433a60 | ||
|
|
aff7530cb0 | ||
|
|
e7e7267fc2 | ||
|
|
9aaab2de3b | ||
|
|
8f0121a92d | ||
|
|
beb1e386c2 | ||
|
|
5b84a5e0e9 | ||
|
|
a9613651a5 | ||
|
|
d6ebc7f230 | ||
|
|
84ca118524 | ||
|
|
0ad6623e24 | ||
|
|
ba944f9dc2 | ||
|
|
99307befdd | ||
|
|
638c4e6b23 | ||
|
|
18bb7ef00d | ||
|
|
3dd9ce1fcd | ||
|
|
fd4814194c | ||
|
|
4d526fe419 | ||
|
|
50d1b187bb | ||
|
|
f54f78d186 | ||
|
|
97ec4949d7 | ||
|
|
f08b9d389b | ||
|
|
4fc94cae24 | ||
|
|
8cab8230e6 | ||
|
|
b7afa49c9f | ||
|
|
e0b5ccb41d | ||
|
|
fb63ffb919 | ||
|
|
cb98b0c937 | ||
|
|
bee56cfd99 | ||
|
|
9e130614ce | ||
|
|
2f487d2e83 | ||
|
|
1ff4b3a4fc | ||
|
|
e86d38c52c | ||
|
|
d371ae8ceb | ||
|
|
a9d10b2bf3 | ||
|
|
d6ffd193d3 | ||
|
|
2635213947 | ||
|
|
d496cbfb53 | ||
|
|
db8f0ad9ee | ||
|
|
8d795a4317 | ||
|
|
1a9ae456dd | ||
|
|
4e9d7a3f8c | ||
|
|
087967befb | ||
|
|
02ad6c7834 | ||
|
|
fc11f557fa | ||
|
|
f299f3ed20 | ||
|
|
94c831cd05 | ||
|
|
53b4c70e4b | ||
|
|
6ff5109b00 | ||
|
|
339afe614c | ||
|
|
911fdd3067 | ||
|
|
588e27e6d1 | ||
|
|
3a71032d62 | ||
|
|
59a091e7dc | ||
|
|
0e250a99ed | ||
|
|
f73b72753f | ||
|
|
00a85b0d90 | ||
|
|
e79d7e6fb5 | ||
|
|
ef745dc378 | ||
|
|
ac5dfb7ff0 | ||
|
|
51b0841171 | ||
|
|
57264da21b | ||
|
|
16f740b318 | ||
|
|
2ba70141cc | ||
|
|
e945329d91 | ||
|
|
ffeb4703fd | ||
|
|
fcf41187fa | ||
|
|
f0fc704efc | ||
|
|
aa58615650 | ||
|
|
b0a84bcbf7 | ||
|
|
cf2d413a28 | ||
|
|
9226b78b0c | ||
|
|
a635fd8a7b | ||
|
|
6f714277f7 | ||
|
|
4aff4982b0 | ||
|
|
8634989497 | ||
|
|
a50e60b2a0 | ||
|
|
8875f4dfc4 | ||
|
|
61c8217ed5 | ||
|
|
f75912033e | ||
|
|
1d8630810b | ||
|
|
ce155fb43e | ||
|
|
67ebe17fcb | ||
|
|
f13a6c0a3b | ||
|
|
e1870429b9 | ||
|
|
5aa1cd7f40 | ||
|
|
de1b887d29 | ||
|
|
e662f5ce0b | ||
|
|
790b69a32e | ||
|
|
9aaab97d6a | ||
|
|
66317197b6 | ||
|
|
91757335ac | ||
|
|
be3145aae9 | ||
|
|
79425af848 | ||
|
|
45b47a1071 | ||
|
|
4b30567c39 | ||
|
|
1ed33a7400 | ||
|
|
ca1d11006c | ||
|
|
71f1f3dd22 | ||
|
|
64add9a542 | ||
|
|
a7c02438e4 | ||
|
|
910af7a44c | ||
|
|
05f9ac3745 | ||
|
|
5c43eefe46 | ||
|
|
b63f4c53d2 | ||
|
|
3d652bc829 | ||
|
|
c78ef8771d | ||
|
|
9a38f16219 | ||
|
|
e5363205a7 | ||
|
|
088b3274f2 | ||
|
|
fabe323e34 | ||
|
|
a731bf034e | ||
|
|
3cbf772acf | ||
|
|
9701f88ae3 | ||
|
|
7ca1d118a1 | ||
|
|
a7dfa21cbf | ||
|
|
ab81444773 | ||
|
|
02c4343dfd | ||
|
|
1bfe86738f | ||
|
|
7fe0e05050 | ||
|
|
10588efe25 | ||
|
|
bf4607d368 | ||
|
|
45f04ae8d4 | ||
|
|
674f1de183 | ||
|
|
368c4fa1a7 | ||
|
|
c737579b7f | ||
|
|
0b7c51a323 | ||
|
|
e7c77b7bf3 | ||
|
|
6c727b7e51 | ||
|
|
a9754d6a1c | ||
|
|
218052d5dd | ||
|
|
f112cb748f | ||
|
|
67a65c66b6 | ||
|
|
cd6add14a0 | ||
|
|
33f9f1ddf4 | ||
|
|
2131de77b0 | ||
|
|
0febb60a3f | ||
|
|
820b914291 | ||
|
|
536d3ee70d | ||
|
|
2544d82486 | ||
|
|
ea6854fadc | ||
|
|
147e3b1173 | ||
|
|
8252142e65 | ||
|
|
6e2270632e | ||
|
|
7d14546d3b | ||
|
|
b31024c362 | ||
|
|
85eaef05ad | ||
|
|
16e4c10862 | ||
|
|
904e0f61a8 | ||
|
|
70953aa66e | ||
|
|
d41de5d270 | ||
|
|
d8603f4f34 | ||
|
|
b13a8094ea | ||
|
|
28e07bad54 | ||
|
|
81cc483166 | ||
|
|
8d7cc55c28 | ||
|
|
083e0e307a | ||
|
|
80f3f89a89 | ||
|
|
3dc8c18849 | ||
|
|
0a6a97cf07 | ||
|
|
7676d7a239 | ||
|
|
679715f896 | ||
|
|
d5aa880336 | ||
|
|
08daa86766 | ||
|
|
f0c1952dfe | ||
|
|
198d9115cc | ||
|
|
6b0c01bd3e | ||
|
|
a1848d3c75 | ||
|
|
a1596f7c62 | ||
|
|
740e701ad3 | ||
|
|
71d571a25c | ||
|
|
2293300182 | ||
|
|
85c7f2806f | ||
|
|
27ecb4fe49 | ||
|
|
7afeefe84f | ||
|
|
651922194f | ||
|
|
1d1b4fb04d | ||
|
|
b418f1eb05 | ||
|
|
a9b44ee39e | ||
|
|
cb48355898 | ||
|
|
6ce47e3a20 | ||
|
|
09e511bc49 | ||
|
|
66ade27383 | ||
|
|
d96058d589 | ||
|
|
8631a15933 | ||
|
|
c0bf81ad7c | ||
|
|
8fd1fa203e | ||
|
|
51b907bcf5 | ||
|
|
ecb5d974c5 | ||
|
|
19c91aff19 | ||
|
|
8e0cc7dd2f | ||
|
|
6478528ebc | ||
|
|
3e3b24f611 | ||
|
|
6dc7d70a1f | ||
|
|
a6f4c5651c | ||
|
|
291a4d39fe | ||
|
|
e639a1dd73 | ||
|
|
e3a961623b | ||
|
|
1ca27fdba2 | ||
|
|
f72428056a | ||
|
|
bdb3f11ac7 | ||
|
|
2f69af1a52 | ||
|
|
984cf77ee0 | ||
|
|
1762596fce | ||
|
|
910eb9b770 | ||
|
|
16807bd57f | ||
|
|
8bc29ad92d | ||
|
|
51a913a5e4 | ||
|
|
c30da805b3 | ||
|
|
42ee593708 | ||
|
|
1b49b35365 | ||
|
|
333ab7066c | ||
|
|
66dbdc09b5 | ||
|
|
79f396f6ff | ||
|
|
62ba4877ac | ||
|
|
e65a5e6d22 | ||
|
|
711b43070d | ||
|
|
b2f957d1d8 | ||
|
|
249745f256 | ||
|
|
8ff9d3bcf1 | ||
|
|
99c328c302 | ||
|
|
8a9f0a245e | ||
|
|
9daecc127a | ||
|
|
119bba4f04 | ||
|
|
bf205c579d | ||
|
|
aa57b17254 | ||
|
|
7df786c5c6 | ||
|
|
b315464e98 | ||
|
|
1252ea076b | ||
|
|
d970e446a8 | ||
|
|
fe40f3727b | ||
|
|
10a290b065 | ||
|
|
0abb11b42a | ||
|
|
1eb6eb729a | ||
|
|
e371a4a3c3 | ||
|
|
f2b6bd3d4b | ||
|
|
d21f87b543 | ||
|
|
b8cdee4f45 | ||
|
|
b06d7445d9 | ||
|
|
2aa9cceb32 | ||
|
|
ae2a2a8a07 | ||
|
|
286555411b | ||
|
|
3c42aec180 | ||
|
|
a203ae00c6 | ||
|
|
68784616a4 | ||
|
|
5cd8c6a5da | ||
|
|
a3647fea8a | ||
|
|
300e73f07d | ||
|
|
03ced23f05 | ||
|
|
da8eeb5d8f | ||
|
|
16cf02896f | ||
|
|
c9f10d248e | ||
|
|
3297e41289 | ||
|
|
4e1b347797 | ||
|
|
4602332dbb | ||
|
|
e1f69ee533 | ||
|
|
d90e431b5b | ||
|
|
45a9eca0ce | ||
|
|
af202f4871 | ||
|
|
7b32fa35f3 | ||
|
|
0c40b230dc | ||
|
|
2baba67bfc | ||
|
|
b1e69a9059 | ||
|
|
f87362ec1b | ||
|
|
84dc57373a | ||
|
|
b3f4a02658 | ||
|
|
50304dbefe | ||
|
|
bf01af0bf3 | ||
|
|
0e3fe3463b | ||
|
|
3956763825 | ||
|
|
d6fe895f6e | ||
|
|
697fa08d8b | ||
|
|
669a35afef | ||
|
|
b1d94a3845 | ||
|
|
06869cf491 | ||
|
|
ed67d8514c | ||
|
|
07ec2f3d7b | ||
|
|
73d02e85c4 | ||
|
|
c1cf1eb37a | ||
|
|
7aecc94049 | ||
|
|
b55fbfeb8e | ||
|
|
20b8991fa4 | ||
|
|
e50de4201d | ||
|
|
ba2b876ee4 | ||
|
|
9b1399c9d5 | ||
|
|
020a2f00c2 | ||
|
|
8713946f35 | ||
|
|
bed8c25e40 | ||
|
|
7c51a09068 | ||
|
|
0f0a6ce042 | ||
|
|
a890968ee4 | ||
|
|
2267c5be00 | ||
|
|
e853cfb98a | ||
|
|
f89a0db471 | ||
|
|
1d66b43da1 | ||
|
|
75c4a4f253 | ||
|
|
6a9c95b3b1 | ||
|
|
c11a2d0081 | ||
|
|
43a13ff2c5 | ||
|
|
8454d163eb | ||
|
|
4a11f6a39f | ||
|
|
c63235cd3d | ||
|
|
f4ce196a34 | ||
|
|
e644b27201 | ||
|
|
d2b14582ee | ||
|
|
ca9194fd96 | ||
|
|
773d3ab13c | ||
|
|
a02a4a07a5 | ||
|
|
0a8625227f | ||
|
|
dc613aa2bf | ||
|
|
2008ac5663 | ||
|
|
da326f1925 | ||
|
|
71911cb1a7 | ||
|
|
31e7582216 | ||
|
|
91f63047e0 | ||
|
|
c9aa4938f4 | ||
|
|
b9e6a38037 | ||
|
|
eb054146d2 | ||
|
|
a780373cfc | ||
|
|
5ad90ccdb8 | ||
|
|
ef97d81ca8 | ||
|
|
c9f7b642c5 | ||
|
|
770962be3f | ||
|
|
d6c857f4a8 | ||
|
|
7b7ffb427d | ||
|
|
b80318d1b6 | ||
|
|
3997d69e49 | ||
|
|
4af41b33c0 | ||
|
|
0f8bbead66 | ||
|
|
804fcff5b6 | ||
|
|
d18e6920fc | ||
|
|
c95174ff11 | ||
|
|
c70329c22b | ||
|
|
34f69263a2 | ||
|
|
bf5056f8fe | ||
|
|
c47f5b06ba | ||
|
|
63055e3df2 | ||
|
|
8ee555140b | ||
|
|
859f78e986 | ||
|
|
366eebb68c | ||
|
|
25ce0b9aee | ||
|
|
376a7db545 | ||
|
|
f906ed741d | ||
|
|
ad152e62e5 | ||
|
|
7f3a61ef43 | ||
|
|
a7ba8c8213 | ||
|
|
b1f3d6d4c0 | ||
|
|
5707ae027f | ||
|
|
770208024d | ||
|
|
975a9f5344 | ||
|
|
a45008411e | ||
|
|
9091ffd1b3 | ||
|
|
089f161d1e | ||
|
|
e6d7131701 | ||
|
|
ed82170c2c | ||
|
|
3472d42cdd | ||
|
|
b8926350b9 | ||
|
|
e5194b313d | ||
|
|
94228375ad | ||
|
|
0e8385a5a7 | ||
|
|
afd3763d96 | ||
|
|
1122f09093 | ||
|
|
1123af15c9 | ||
|
|
b2f6e865a7 | ||
|
|
93b9ac2d13 | ||
|
|
64af65b0e7 | ||
|
|
390c8437c5 | ||
|
|
cc65ca9b6a | ||
|
|
4bd7cba247 | ||
|
|
92e2f7f8b7 | ||
|
|
98054ddff6 | ||
|
|
4e5c1aba2e | ||
|
|
5eb44320ae | ||
|
|
f751269289 | ||
|
|
0e836622ec | ||
|
|
a6ac0a813d | ||
|
|
21c47f60f2 | ||
|
|
66142b1dd8 | ||
|
|
3a28f4a0cb | ||
|
|
71eeca96ee | ||
|
|
b56cde47ca | ||
|
|
793e65bac0 | ||
|
|
4d1a569269 | ||
|
|
5c56317d50 | ||
|
|
32491ae2ad | ||
|
|
28aeb11565 | ||
|
|
61eb3ff908 | ||
|
|
ff5455881e | ||
|
|
143b7ce678 | ||
|
|
9c3dfc78df | ||
|
|
017872c5ef | ||
|
|
b9ad67d147 | ||
|
|
62ea3b1a1a | ||
|
|
325b668d00 | ||
|
|
9ce6bf8e14 | ||
|
|
052448c59a | ||
|
|
c8b318b315 | ||
|
|
54daac329e | ||
|
|
b5a59e4de0 | ||
|
|
258876d13f | ||
|
|
9cc8e16d64 | ||
|
|
85d1254638 | ||
|
|
45eb261dcd | ||
|
|
8b2ff5f269 | ||
|
|
79ab568c80 | ||
|
|
382b1737cb | ||
|
|
c9b3a83592 | ||
|
|
0b21ce7ce9 | ||
|
|
523bf8c689 | ||
|
|
8ead5a9d1f | ||
|
|
46e3199438 | ||
|
|
d94e614a54 | ||
|
|
9f459867bf | ||
|
|
f5ce319c24 | ||
|
|
6b9c02d42a | ||
|
|
e2e06a8f83 | ||
|
|
8402f73d52 | ||
|
|
84334ace6a | ||
|
|
43e2518fbf | ||
|
|
13098713e9 | ||
|
|
77c6e541d6 | ||
|
|
bbd49f9372 | ||
|
|
015be517bf | ||
|
|
8faa936a68 | ||
|
|
39922cca5e | ||
|
|
63dd68081a | ||
|
|
3694b19a97 | ||
|
|
c58b2a5e45 | ||
|
|
5b8562f5bd | ||
|
|
67020426f6 | ||
|
|
3840894201 | ||
|
|
888f3feaff | ||
|
|
2e339d7457 | ||
|
|
fd0ff633e6 | ||
|
|
02923fe9ce | ||
|
|
875f97813e | ||
|
|
6a29385762 | ||
|
|
fbc9f9dec9 | ||
|
|
4607ade8e9 | ||
|
|
e4a553c022 | ||
|
|
bc733bab0c | ||
|
|
1a522ddf48 | ||
|
|
1de0f4c4fa | ||
|
|
71eb5c25b5 | ||
|
|
ea34979a29 | ||
|
|
1f784ad44c | ||
|
|
f89726752f | ||
|
|
921b6b7ba4 | ||
|
|
6c5cc7a0ce | ||
|
|
f851e2f2cf | ||
|
|
b73207f29a | ||
|
|
8d8f0b55ea | ||
|
|
0e1e9b9cf3 | ||
|
|
ab4eed78af | ||
|
|
8a36c15d5c | ||
|
|
bd895286bc | ||
|
|
b76990ec16 | ||
|
|
9bc93c5cf5 | ||
|
|
1d8ae79f84 | ||
|
|
4269aa2422 | ||
|
|
c887dc1ec8 | ||
|
|
8bbacd691d | ||
|
|
d8f3f85fb7 | ||
|
|
159c0b3350 | ||
|
|
45788f3235 | ||
|
|
4c85c6ccdf | ||
|
|
08408ae005 | ||
|
|
d470279fb7 | ||
|
|
8260458f8f | ||
|
|
0512dd1e86 | ||
|
|
4972019cb9 | ||
|
|
5e615cab52 | ||
|
|
64ea2b6d3b | ||
|
|
27018fa8e2 | ||
|
|
263d634801 | ||
|
|
c61c33f71c | ||
|
|
bfb30b8fed | ||
|
|
ca3e27937e | ||
|
|
50c34a4186 | ||
|
|
84875aaf82 | ||
|
|
b7a8b95820 | ||
|
|
5cad5ca11a | ||
|
|
7598de29dd | ||
|
|
af6ffe67c8 | ||
|
|
6944c4b3bf | ||
|
|
24817d5707 | ||
|
|
3d855712ee | ||
|
|
872263d253 | ||
|
|
1c491fb1c5 | ||
|
|
29374c579a | ||
|
|
206d7b6ca9 | ||
|
|
ab6ca8c894 | ||
|
|
e7f5fde051 | ||
|
|
030b358b0e | ||
|
|
4b1791d35c | ||
|
|
b788cf823d | ||
|
|
11cbc0288f | ||
|
|
2269c80b02 | ||
|
|
c922cc042e | ||
|
|
9cb6f44f72 | ||
|
|
f376cd5ab1 | ||
|
|
8b8a02b68c | ||
|
|
5759b1336a | ||
|
|
76f17cb6d7 | ||
|
|
7149c421cf | ||
|
|
353c599767 | ||
|
|
285c43dab7 | ||
|
|
bd5933f4c2 | ||
|
|
0faac08237 | ||
|
|
14f94b1566 | ||
|
|
415e2ff265 | ||
|
|
26e97358d1 | ||
|
|
0ed6fb33c5 | ||
|
|
df98e7512b | ||
|
|
99ede6477f | ||
|
|
ee0debe14a | ||
|
|
dd1e11f102 | ||
|
|
ed47493459 | ||
|
|
5b8391067d | ||
|
|
4f41a59ceb | ||
|
|
4525cb38e4 | ||
|
|
704dfc25e6 | ||
|
|
7022ebe4ca | ||
|
|
094863f0ea | ||
|
|
a6282125cf | ||
|
|
63387a09af |
86
.bruno/Chromium/Convert/HTML to PDF.bru
Normal file
86
.bruno/Chromium/Convert/HTML to PDF.bru
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
meta {
|
||||||
|
name: HTML to PDF
|
||||||
|
type: http
|
||||||
|
seq: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/chromium/convert/html
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
files: @file(../test/integration/testdata/page-1-html/index.html)
|
||||||
|
~landscape: false
|
||||||
|
~printBackground: false
|
||||||
|
~scale: 1.0
|
||||||
|
~singlePage: false
|
||||||
|
~paperWidth: 8.5
|
||||||
|
~paperHeight: 11
|
||||||
|
~marginTop: 0.39
|
||||||
|
~marginBottom: 0.39
|
||||||
|
~marginLeft: 0.39
|
||||||
|
~marginRight: 0.39
|
||||||
|
~nativePageRanges: 1-2
|
||||||
|
~preferCssPageSize: false
|
||||||
|
~generateDocumentOutline: false
|
||||||
|
~generateTaggedPdf: false
|
||||||
|
~skipNetworkIdleEvent: false
|
||||||
|
~failOnHttpStatusCodes: [499,599]
|
||||||
|
~failOnResourceHttpStatusCodes: []
|
||||||
|
~ignoreResourceHttpStatusDomains: []
|
||||||
|
~failOnResourceLoadingFailed: false
|
||||||
|
~failOnConsoleExceptions: false
|
||||||
|
~waitDelay: 0s
|
||||||
|
~waitWindowStatus:
|
||||||
|
~waitForExpression:
|
||||||
|
~waitForSelector:
|
||||||
|
~cookies: [{"name":"my_cookie","value":"my_value","domain":"example.com"}]
|
||||||
|
~userAgent:
|
||||||
|
~extraHttpHeaders: {"X-Custom-Header":"value"}
|
||||||
|
~emulatedMediaType: print
|
||||||
|
~emulatedMediaFeatures: {"prefers-color-scheme":"dark"}
|
||||||
|
~omitBackground: false
|
||||||
|
~splitMode: intervals
|
||||||
|
~splitSpan: 1
|
||||||
|
~splitUnify: false
|
||||||
|
~pdfa: PDF/A-1b
|
||||||
|
~pdfua: true
|
||||||
|
~metadata: {"Author":"Bruno","Title":"Test"}
|
||||||
|
~userPassword:
|
||||||
|
~ownerPassword:
|
||||||
|
~allowPrinting: false
|
||||||
|
~allowCopying: false
|
||||||
|
~allowModifying: false
|
||||||
|
~allowAnnotating: false
|
||||||
|
~allowFillingForms: false
|
||||||
|
~allowAssembling: false
|
||||||
|
~embeds: @file(../test/integration/testdata/embed_1.xml)
|
||||||
|
~embeds: @file(../test/integration/testdata/embed_2.xml)
|
||||||
|
~embedsMetadata: {"embed_1.xml":{"mimeType":"text/xml","relationship":"Data"}, "embed_2.xml":{"mimeType":"text/xml","relationship":"Data"}}
|
||||||
|
~facturxXml: @file(../test/integration/testdata/embed_1.xml)
|
||||||
|
~facturxConformanceLevel: EN 16931
|
||||||
|
~facturxDocumentType: INVOICE
|
||||||
|
~facturxVersion: 1.0
|
||||||
|
~watermarkSource: text
|
||||||
|
~watermarkExpression: CONFIDENTIAL
|
||||||
|
~watermarkPages:
|
||||||
|
~watermarkOptions: {"scale":"0.5 abs","rot":"45","fillcolor":"#FF0000"}
|
||||||
|
~stampSource: text
|
||||||
|
~stampExpression: DRAFT
|
||||||
|
~stampPages:
|
||||||
|
~stampOptions: {"scale":"0.5 abs","rot":"45"}
|
||||||
|
~rotateAngle: 90
|
||||||
|
~rotatePages:
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Output-Filename: my-file
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
87
.bruno/Chromium/Convert/Markdown to PDF.bru
Normal file
87
.bruno/Chromium/Convert/Markdown to PDF.bru
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
meta {
|
||||||
|
name: Markdown to PDF
|
||||||
|
type: http
|
||||||
|
seq: 3
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/chromium/convert/markdown
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
files: @file(../../test/integration/testdata/page-1-markdown/index.html)
|
||||||
|
files: @file(../../test/integration/testdata/page-1-markdown/page_1.md)
|
||||||
|
~landscape: false
|
||||||
|
~printBackground: false
|
||||||
|
~scale: 1.0
|
||||||
|
~singlePage: false
|
||||||
|
~paperWidth: 8.5
|
||||||
|
~paperHeight: 11
|
||||||
|
~marginTop: 0.39
|
||||||
|
~marginBottom: 0.39
|
||||||
|
~marginLeft: 0.39
|
||||||
|
~marginRight: 0.39
|
||||||
|
~nativePageRanges: 1-2
|
||||||
|
~preferCssPageSize: false
|
||||||
|
~generateDocumentOutline: false
|
||||||
|
~generateTaggedPdf: false
|
||||||
|
~skipNetworkIdleEvent: false
|
||||||
|
~failOnHttpStatusCodes: [499,599]
|
||||||
|
~failOnResourceHttpStatusCodes: []
|
||||||
|
~ignoreResourceHttpStatusDomains: []
|
||||||
|
~failOnResourceLoadingFailed: false
|
||||||
|
~failOnConsoleExceptions: false
|
||||||
|
~waitDelay: 0s
|
||||||
|
~waitWindowStatus:
|
||||||
|
~waitForExpression:
|
||||||
|
~waitForSelector:
|
||||||
|
~cookies: [{"name":"my_cookie","value":"my_value","domain":"example.com"}]
|
||||||
|
~userAgent:
|
||||||
|
~extraHttpHeaders: {"X-Custom-Header":"value"}
|
||||||
|
~emulatedMediaType: print
|
||||||
|
~emulatedMediaFeatures: {"prefers-color-scheme":"dark"}
|
||||||
|
~omitBackground: false
|
||||||
|
~splitMode: intervals
|
||||||
|
~splitSpan: 1
|
||||||
|
~splitUnify: false
|
||||||
|
~pdfa: PDF/A-1b
|
||||||
|
~pdfua: true
|
||||||
|
~metadata: {"Author":"Bruno","Title":"Test"}
|
||||||
|
~userPassword:
|
||||||
|
~ownerPassword:
|
||||||
|
~allowPrinting: false
|
||||||
|
~allowCopying: false
|
||||||
|
~allowModifying: false
|
||||||
|
~allowAnnotating: false
|
||||||
|
~allowFillingForms: false
|
||||||
|
~allowAssembling: false
|
||||||
|
~embeds: @file(../test/integration/testdata/embed_1.xml)
|
||||||
|
~embeds: @file(../test/integration/testdata/embed_2.xml)
|
||||||
|
~embedsMetadata: {"embed_1.xml":{"mimeType":"text/xml","relationship":"Data"}, "embed_2.xml":{"mimeType":"text/xml","relationship":"Data"}}
|
||||||
|
~facturxXml: @file(../../test/integration/testdata/embed_1.xml)
|
||||||
|
~facturxConformanceLevel: EN 16931
|
||||||
|
~facturxDocumentType: INVOICE
|
||||||
|
~facturxVersion: 1.0
|
||||||
|
~watermarkSource: text
|
||||||
|
~watermarkExpression: CONFIDENTIAL
|
||||||
|
~watermarkPages:
|
||||||
|
~watermarkOptions: {"scale":"0.5 abs","rot":"45","fillcolor":"#FF0000"}
|
||||||
|
~stampSource: text
|
||||||
|
~stampExpression: DRAFT
|
||||||
|
~stampPages:
|
||||||
|
~stampOptions: {"scale":"0.5 abs","rot":"45"}
|
||||||
|
~rotateAngle: 90
|
||||||
|
~rotatePages:
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Output-Filename: my-file
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
86
.bruno/Chromium/Convert/URL to PDF.bru
Normal file
86
.bruno/Chromium/Convert/URL to PDF.bru
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
meta {
|
||||||
|
name: URL to PDF
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/chromium/convert/url
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
url: https://example.com
|
||||||
|
~landscape: false
|
||||||
|
~printBackground: false
|
||||||
|
~scale: 1.0
|
||||||
|
~singlePage: false
|
||||||
|
~paperWidth: 8.5
|
||||||
|
~paperHeight: 11
|
||||||
|
~marginTop: 0.39
|
||||||
|
~marginBottom: 0.39
|
||||||
|
~marginLeft: 0.39
|
||||||
|
~marginRight: 0.39
|
||||||
|
~nativePageRanges: 1-2
|
||||||
|
~preferCssPageSize: false
|
||||||
|
~generateDocumentOutline: false
|
||||||
|
~generateTaggedPdf: false
|
||||||
|
~skipNetworkIdleEvent: false
|
||||||
|
~failOnHttpStatusCodes: [499,599]
|
||||||
|
~failOnResourceHttpStatusCodes: []
|
||||||
|
~ignoreResourceHttpStatusDomains: []
|
||||||
|
~failOnResourceLoadingFailed: false
|
||||||
|
~failOnConsoleExceptions: false
|
||||||
|
~waitDelay: 0s
|
||||||
|
~waitWindowStatus:
|
||||||
|
~waitForExpression:
|
||||||
|
~waitForSelector:
|
||||||
|
~cookies: [{"name":"my_cookie","value":"my_value","domain":"example.com"}]
|
||||||
|
~userAgent:
|
||||||
|
~extraHttpHeaders: {"X-Custom-Header":"value"}
|
||||||
|
~emulatedMediaType: print
|
||||||
|
~emulatedMediaFeatures: {"prefers-color-scheme":"dark"}
|
||||||
|
~omitBackground: false
|
||||||
|
~splitMode: intervals
|
||||||
|
~splitSpan: 1
|
||||||
|
~splitUnify: false
|
||||||
|
~pdfa: PDF/A-1b
|
||||||
|
~pdfua: true
|
||||||
|
~metadata: {"Author":"Bruno","Title":"Test"}
|
||||||
|
~userPassword:
|
||||||
|
~ownerPassword:
|
||||||
|
~allowPrinting: false
|
||||||
|
~allowCopying: false
|
||||||
|
~allowModifying: false
|
||||||
|
~allowAnnotating: false
|
||||||
|
~allowFillingForms: false
|
||||||
|
~allowAssembling: false
|
||||||
|
~embeds: @file(../test/integration/testdata/embed_1.xml)
|
||||||
|
~embeds: @file(../test/integration/testdata/embed_2.xml)
|
||||||
|
~embedsMetadata: {"embed_1.xml":{"mimeType":"text/xml","relationship":"Data"}, "embed_2.xml":{"mimeType":"text/xml","relationship":"Data"}}
|
||||||
|
~facturxXml: @file(../test/integration/testdata/embed_1.xml)
|
||||||
|
~facturxConformanceLevel: EN 16931
|
||||||
|
~facturxDocumentType: INVOICE
|
||||||
|
~facturxVersion: 1.0
|
||||||
|
~watermarkSource: text
|
||||||
|
~watermarkExpression: CONFIDENTIAL
|
||||||
|
~watermarkPages:
|
||||||
|
~watermarkOptions: {"scale":"0.5 abs","rot":"45","fillcolor":"#FF0000"}
|
||||||
|
~stampSource: text
|
||||||
|
~stampExpression: DRAFT
|
||||||
|
~stampPages:
|
||||||
|
~stampOptions: {"scale":"0.5 abs","rot":"45"}
|
||||||
|
~rotateAngle: 90
|
||||||
|
~rotatePages:
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Output-Filename: my-file
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
48
.bruno/Chromium/Screenshot/HTML Screenshot.bru
Normal file
48
.bruno/Chromium/Screenshot/HTML Screenshot.bru
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
meta {
|
||||||
|
name: HTML Screenshot
|
||||||
|
type: http
|
||||||
|
seq: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/chromium/screenshot/html
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
files: @file(../../test/integration/testdata/page-1-html/index.html)
|
||||||
|
~width: 800
|
||||||
|
~height: 600
|
||||||
|
~clip: false
|
||||||
|
~format: png
|
||||||
|
~quality: 100
|
||||||
|
~optimizeForSpeed: false
|
||||||
|
~skipNetworkIdleEvent: false
|
||||||
|
~failOnHttpStatusCodes: [499,599]
|
||||||
|
~failOnResourceHttpStatusCodes: []
|
||||||
|
~ignoreResourceHttpStatusDomains: []
|
||||||
|
~failOnResourceLoadingFailed: false
|
||||||
|
~failOnConsoleExceptions: false
|
||||||
|
~waitDelay: 0s
|
||||||
|
~waitWindowStatus:
|
||||||
|
~waitForExpression:
|
||||||
|
~waitForSelector:
|
||||||
|
~cookies: [{"name":"my_cookie","value":"my_value","domain":"example.com"}]
|
||||||
|
~userAgent:
|
||||||
|
~extraHttpHeaders: {"X-Custom-Header":"value"}
|
||||||
|
~emulatedMediaType: screen
|
||||||
|
~emulatedMediaFeatures: {"prefers-color-scheme":"dark"}
|
||||||
|
~omitBackground: false
|
||||||
|
~deviceScaleFactor: 1.0
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Output-Filename: my-screenshot
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
49
.bruno/Chromium/Screenshot/Markdown Screenshot.bru
Normal file
49
.bruno/Chromium/Screenshot/Markdown Screenshot.bru
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
meta {
|
||||||
|
name: Markdown Screenshot
|
||||||
|
type: http
|
||||||
|
seq: 3
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/chromium/screenshot/markdown
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
files: @file(../../test/integration/testdata/page-1-markdown/index.html)
|
||||||
|
files: @file(../../test/integration/testdata/page-1-markdown/page_1.md)
|
||||||
|
~width: 800
|
||||||
|
~height: 600
|
||||||
|
~clip: false
|
||||||
|
~format: png
|
||||||
|
~quality: 100
|
||||||
|
~optimizeForSpeed: false
|
||||||
|
~skipNetworkIdleEvent: false
|
||||||
|
~failOnHttpStatusCodes: [499,599]
|
||||||
|
~failOnResourceHttpStatusCodes: []
|
||||||
|
~ignoreResourceHttpStatusDomains: []
|
||||||
|
~failOnResourceLoadingFailed: false
|
||||||
|
~failOnConsoleExceptions: false
|
||||||
|
~waitDelay: 0s
|
||||||
|
~waitWindowStatus:
|
||||||
|
~waitForExpression:
|
||||||
|
~waitForSelector:
|
||||||
|
~cookies: [{"name":"my_cookie","value":"my_value","domain":"example.com"}]
|
||||||
|
~userAgent:
|
||||||
|
~extraHttpHeaders: {"X-Custom-Header":"value"}
|
||||||
|
~emulatedMediaType: screen
|
||||||
|
~emulatedMediaFeatures: {"prefers-color-scheme":"dark"}
|
||||||
|
~omitBackground: false
|
||||||
|
~deviceScaleFactor: 1.0
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Output-Filename: my-screenshot
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
48
.bruno/Chromium/Screenshot/URL Screenshot.bru
Normal file
48
.bruno/Chromium/Screenshot/URL Screenshot.bru
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
meta {
|
||||||
|
name: URL Screenshot
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/chromium/screenshot/url
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
url: https://example.com
|
||||||
|
~width: 800
|
||||||
|
~height: 600
|
||||||
|
~clip: false
|
||||||
|
~format: png
|
||||||
|
~quality: 100
|
||||||
|
~optimizeForSpeed: false
|
||||||
|
~skipNetworkIdleEvent: false
|
||||||
|
~failOnHttpStatusCodes: [499,599]
|
||||||
|
~failOnResourceHttpStatusCodes: []
|
||||||
|
~ignoreResourceHttpStatusDomains: []
|
||||||
|
~failOnResourceLoadingFailed: false
|
||||||
|
~failOnConsoleExceptions: false
|
||||||
|
~waitDelay: 0s
|
||||||
|
~waitWindowStatus:
|
||||||
|
~waitForExpression:
|
||||||
|
~waitForSelector:
|
||||||
|
~cookies: [{"name":"my_cookie","value":"my_value","domain":"example.com"}]
|
||||||
|
~userAgent:
|
||||||
|
~extraHttpHeaders: {"X-Custom-Header":"value"}
|
||||||
|
~emulatedMediaType: screen
|
||||||
|
~emulatedMediaFeatures: {"prefers-color-scheme":"dark"}
|
||||||
|
~omitBackground: false
|
||||||
|
~deviceScaleFactor: 1.0
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Output-Filename: my-screenshot
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
11
.bruno/Health & Info/Debug.bru
Normal file
11
.bruno/Health & Info/Debug.bru
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
meta {
|
||||||
|
name: Debug
|
||||||
|
type: http
|
||||||
|
seq: 3
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{baseUrl}}/debug
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
11
.bruno/Health & Info/Health.bru
Normal file
11
.bruno/Health & Info/Health.bru
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
meta {
|
||||||
|
name: Health
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{baseUrl}}/health
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
11
.bruno/Health & Info/Prometheus Metrics.bru
Normal file
11
.bruno/Health & Info/Prometheus Metrics.bru
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
meta {
|
||||||
|
name: Prometheus Metrics
|
||||||
|
type: http
|
||||||
|
seq: 4
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{baseUrl}}/prometheus/metrics
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
11
.bruno/Health & Info/Version.bru
Normal file
11
.bruno/Health & Info/Version.bru
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
meta {
|
||||||
|
name: Version
|
||||||
|
type: http
|
||||||
|
seq: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{baseUrl}}/version
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
103
.bruno/LibreOffice/Convert to PDF.bru
Normal file
103
.bruno/LibreOffice/Convert to PDF.bru
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
meta {
|
||||||
|
name: Convert to PDF
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/libreoffice/convert
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
files: @file(../test/integration/testdata/page_1.docx)
|
||||||
|
~password:
|
||||||
|
~landscape: false
|
||||||
|
~nativePageRanges:
|
||||||
|
~updateIndexes: false
|
||||||
|
~exportFormFields: true
|
||||||
|
~allowDuplicateFieldNames: false
|
||||||
|
~exportBookmarks: true
|
||||||
|
~exportBookmarksToPdfDestination: false
|
||||||
|
~exportPlaceholders: false
|
||||||
|
~exportNotes: false
|
||||||
|
~exportNotesPages: false
|
||||||
|
~exportOnlyNotesPages: false
|
||||||
|
~exportNotesInMargin: false
|
||||||
|
~convertOooTargetToPdfTarget: false
|
||||||
|
~exportLinksRelativeFsys: false
|
||||||
|
~exportHiddenSlides: false
|
||||||
|
~skipEmptyPages: false
|
||||||
|
~addOriginalDocumentAsStream: false
|
||||||
|
~singlePageSheets: false
|
||||||
|
~initialView: 0
|
||||||
|
~initialPage: 1
|
||||||
|
~magnification: 0
|
||||||
|
~zoom: 100
|
||||||
|
~pageLayout: 0
|
||||||
|
~firstPageOnLeft: false
|
||||||
|
~resizeWindowToInitialPage: false
|
||||||
|
~centerWindow: false
|
||||||
|
~openInFullScreenMode: false
|
||||||
|
~displayPDFDocumentTitle: true
|
||||||
|
~hideViewerMenubar: false
|
||||||
|
~hideViewerToolbar: false
|
||||||
|
~hideViewerWindowControls: false
|
||||||
|
~useTransitionEffects: true
|
||||||
|
~openBookmarkLevels: -1
|
||||||
|
~losslessImageCompression: false
|
||||||
|
~quality: 90
|
||||||
|
~reduceImageResolution: false
|
||||||
|
~maxImageResolution: 300
|
||||||
|
~nativeWatermarkText:
|
||||||
|
~nativeWatermarkColor: 0
|
||||||
|
~nativeWatermarkFontHeight: 0
|
||||||
|
~nativeWatermarkRotateAngle: 0
|
||||||
|
~nativeWatermarkFontName:
|
||||||
|
~nativeTiledWatermarkText:
|
||||||
|
~nativePdfFormats: true
|
||||||
|
~merge: false
|
||||||
|
~flatten: false
|
||||||
|
~splitMode: intervals
|
||||||
|
~splitSpan: 1
|
||||||
|
~splitUnify: false
|
||||||
|
~pdfa: PDF/A-1b
|
||||||
|
~pdfua: true
|
||||||
|
~metadata: {"Author":"Bruno","Title":"Test"}
|
||||||
|
~userPassword:
|
||||||
|
~ownerPassword:
|
||||||
|
~allowPrinting: false
|
||||||
|
~allowCopying: false
|
||||||
|
~allowModifying: false
|
||||||
|
~allowAnnotating: false
|
||||||
|
~allowFillingForms: false
|
||||||
|
~allowAssembling: false
|
||||||
|
~embeds: @file(../test/integration/testdata/embed_1.xml)
|
||||||
|
~embeds: @file(../test/integration/testdata/embed_2.xml)
|
||||||
|
~embedsMetadata: {"embed_1.xml":{"mimeType":"text/xml","relationship":"Data"}, "embed_2.xml":{"mimeType":"text/xml","relationship":"Data"}}
|
||||||
|
~facturxXml: @file(../test/integration/testdata/embed_1.xml)
|
||||||
|
~facturxConformanceLevel: EN 16931
|
||||||
|
~facturxDocumentType: INVOICE
|
||||||
|
~facturxVersion: 1.0
|
||||||
|
~watermarkSource: text
|
||||||
|
~watermarkExpression: CONFIDENTIAL
|
||||||
|
~watermarkPages:
|
||||||
|
~watermarkOptions: {"scale":"0.5 abs","rot":"45","fillcolor":"#FF0000"}
|
||||||
|
~stampSource: text
|
||||||
|
~stampExpression: DRAFT
|
||||||
|
~stampPages:
|
||||||
|
~stampOptions: {"scale":"0.5 abs","rot":"45"}
|
||||||
|
~rotateAngle: 90
|
||||||
|
~rotatePages:
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Output-Filename: my-file
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
24
.bruno/PDF Engines/Bookmarks/Read Bookmarks.bru
Normal file
24
.bruno/PDF Engines/Bookmarks/Read Bookmarks.bru
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
meta {
|
||||||
|
name: Read Bookmarks
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/pdfengines/bookmarks/read
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
files: @file(../../test/integration/testdata/page_1.pdf)
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
26
.bruno/PDF Engines/Bookmarks/Write Bookmarks.bru
Normal file
26
.bruno/PDF Engines/Bookmarks/Write Bookmarks.bru
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
meta {
|
||||||
|
name: Write Bookmarks
|
||||||
|
type: http
|
||||||
|
seq: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/pdfengines/bookmarks/write
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
files: @file(../../test/integration/testdata/page_1.pdf)
|
||||||
|
bookmarks: [{"title":"Chapter 1","page":1,"children":[{"title":"Section 1.1","page":1}]}]
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Output-Filename: with-bookmarks
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
27
.bruno/PDF Engines/Convert/Convert PDF.bru
Normal file
27
.bruno/PDF Engines/Convert/Convert PDF.bru
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
meta {
|
||||||
|
name: Convert PDF
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/pdfengines/convert
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
files: @file(../../test/integration/testdata/page_1.pdf)
|
||||||
|
pdfa: PDF/A-1b
|
||||||
|
~pdfua: true
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Output-Filename: converted
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
33
.bruno/PDF Engines/Embed/Embed Files.bru
Normal file
33
.bruno/PDF Engines/Embed/Embed Files.bru
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
meta {
|
||||||
|
name: Embed Files
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/pdfengines/embed
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
files: @file(../test/integration/testdata/page_1.pdf)
|
||||||
|
embeds: @file(../test/integration/testdata/embed_1.xml)
|
||||||
|
embeds: @file(../test/integration/testdata/embed_2.xml)
|
||||||
|
embedsMetadata: {"embed_1.xml":{"mimeType":"text/xml","relationship":"Data"}, "embed_2.xml":{"mimeType":"text/xml","relationship":"Data"}}
|
||||||
|
~facturxXml: @file(../test/integration/testdata/embed_1.xml)
|
||||||
|
~facturxConformanceLevel: EN 16931
|
||||||
|
~facturxDocumentType: INVOICE
|
||||||
|
~facturxVersion: 1.0
|
||||||
|
~downloadFrom: [{"url":"https://example.com/attachment.xml","embedded":true}]
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Output-Filename: with-embeds
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
33
.bruno/PDF Engines/Encrypt/Encrypt PDF.bru
Normal file
33
.bruno/PDF Engines/Encrypt/Encrypt PDF.bru
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
meta {
|
||||||
|
name: Encrypt PDF
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/pdfengines/encrypt
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
files: @file(../../test/integration/testdata/page_1.pdf)
|
||||||
|
userPassword: secret123
|
||||||
|
~ownerPassword: owner456
|
||||||
|
~allowPrinting: false
|
||||||
|
~allowCopying: false
|
||||||
|
~allowModifying: false
|
||||||
|
~allowAnnotating: false
|
||||||
|
~allowFillingForms: false
|
||||||
|
~allowAssembling: false
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Output-Filename: encrypted
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
29
.bruno/PDF Engines/Factur-X/Inject Factur-X XMP.bru
Normal file
29
.bruno/PDF Engines/Factur-X/Inject Factur-X XMP.bru
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
meta {
|
||||||
|
name: Inject Factur-X XMP
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/pdfengines/factur-x
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
files: @file(../../test/integration/testdata/page_1.pdf)
|
||||||
|
facturxXml: @file(../../test/integration/testdata/embed_1.xml)
|
||||||
|
facturxConformanceLevel: EN 16931
|
||||||
|
~facturxDocumentType: INVOICE
|
||||||
|
~facturxVersion: 1.0
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Output-Filename: factur-x
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
25
.bruno/PDF Engines/Flatten/Flatten PDF.bru
Normal file
25
.bruno/PDF Engines/Flatten/Flatten PDF.bru
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
meta {
|
||||||
|
name: Flatten PDF
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/pdfengines/flatten
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
files: @file(../../test/integration/testdata/page_1.pdf)
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Output-Filename: flattened
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
54
.bruno/PDF Engines/Merge/Merge PDFs.bru
Normal file
54
.bruno/PDF Engines/Merge/Merge PDFs.bru
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
meta {
|
||||||
|
name: Merge PDFs
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/pdfengines/merge
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
files: @file(../../test/integration/testdata/page_1.pdf)
|
||||||
|
files: @file(../../test/integration/testdata/page_2.pdf)
|
||||||
|
~flatten: false
|
||||||
|
~autoIndexBookmarks: false
|
||||||
|
~pdfa: PDF/A-1b
|
||||||
|
~pdfua: true
|
||||||
|
~metadata: {"Author":"Bruno","Title":"Test"}
|
||||||
|
~bookmarks: [{"title":"Page 1","page":1},{"title":"Page 2","page":2}]
|
||||||
|
~userPassword:
|
||||||
|
~ownerPassword:
|
||||||
|
~allowPrinting: false
|
||||||
|
~allowCopying: false
|
||||||
|
~allowModifying: false
|
||||||
|
~allowAnnotating: false
|
||||||
|
~allowFillingForms: false
|
||||||
|
~allowAssembling: false
|
||||||
|
~watermarkSource: text
|
||||||
|
~watermarkExpression: CONFIDENTIAL
|
||||||
|
~watermarkPages:
|
||||||
|
~watermarkOptions: {"scale":"0.5 abs","rot":"45","fillcolor":"#FF0000"}
|
||||||
|
~stampSource: text
|
||||||
|
~stampExpression: DRAFT
|
||||||
|
~stampPages:
|
||||||
|
~stampOptions: {"scale":"0.5 abs","rot":"45"}
|
||||||
|
~rotateAngle: 90
|
||||||
|
~rotatePages:
|
||||||
|
~facturxXml: @file(../../test/integration/testdata/embed_1.xml)
|
||||||
|
~facturxConformanceLevel: EN 16931
|
||||||
|
~facturxDocumentType: INVOICE
|
||||||
|
~facturxVersion: 1.0
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Output-Filename: merged
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
24
.bruno/PDF Engines/Metadata/Read Metadata.bru
Normal file
24
.bruno/PDF Engines/Metadata/Read Metadata.bru
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
meta {
|
||||||
|
name: Read Metadata
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/pdfengines/metadata/read
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
files: @file(../../test/integration/testdata/page_1.pdf)
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
26
.bruno/PDF Engines/Metadata/Write Metadata.bru
Normal file
26
.bruno/PDF Engines/Metadata/Write Metadata.bru
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
meta {
|
||||||
|
name: Write Metadata
|
||||||
|
type: http
|
||||||
|
seq: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/pdfengines/metadata/write
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
files: @file(../../test/integration/testdata/page_1.pdf)
|
||||||
|
metadata: {"Author":"Bruno","Copyright":"Bruno","Creator":"Gotenberg","Keywords":["test"],"Marked":true,"Producer":"Gotenberg","Subject":"Test","Title":"Test Document","Trapped":"Unknown"}
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Output-Filename: with-metadata
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
27
.bruno/PDF Engines/Rotate/Rotate PDF.bru
Normal file
27
.bruno/PDF Engines/Rotate/Rotate PDF.bru
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
meta {
|
||||||
|
name: Rotate PDF
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/pdfengines/rotate
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
files: @file(../../test/integration/testdata/page_1.pdf)
|
||||||
|
rotateAngle: 90
|
||||||
|
~rotatePages: 1-2
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Output-Filename: rotated
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
54
.bruno/PDF Engines/Split/Split PDF.bru
Normal file
54
.bruno/PDF Engines/Split/Split PDF.bru
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
meta {
|
||||||
|
name: Split PDF
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/pdfengines/split
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
files: @file(../../test/integration/testdata/pages_3.pdf)
|
||||||
|
splitMode: intervals
|
||||||
|
splitSpan: 1
|
||||||
|
~splitUnify: false
|
||||||
|
~flatten: false
|
||||||
|
~pdfa: PDF/A-1b
|
||||||
|
~pdfua: true
|
||||||
|
~metadata: {"Author":"Bruno","Title":"Test"}
|
||||||
|
~userPassword:
|
||||||
|
~ownerPassword:
|
||||||
|
~allowPrinting: false
|
||||||
|
~allowCopying: false
|
||||||
|
~allowModifying: false
|
||||||
|
~allowAnnotating: false
|
||||||
|
~allowFillingForms: false
|
||||||
|
~allowAssembling: false
|
||||||
|
~watermarkSource: text
|
||||||
|
~watermarkExpression: CONFIDENTIAL
|
||||||
|
~watermarkPages:
|
||||||
|
~watermarkOptions: {"scale":"0.5 abs","rot":"45","fillcolor":"#FF0000"}
|
||||||
|
~stampSource: text
|
||||||
|
~stampExpression: DRAFT
|
||||||
|
~stampPages:
|
||||||
|
~stampOptions: {"scale":"0.5 abs","rot":"45"}
|
||||||
|
~rotateAngle: 90
|
||||||
|
~rotatePages:
|
||||||
|
~facturxXml: @file(../../test/integration/testdata/embed_1.xml)
|
||||||
|
~facturxConformanceLevel: EN 16931
|
||||||
|
~facturxDocumentType: INVOICE
|
||||||
|
~facturxVersion: 1.0
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Output-Filename: split
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
31
.bruno/PDF Engines/Stamp/Stamp PDF.bru
Normal file
31
.bruno/PDF Engines/Stamp/Stamp PDF.bru
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
meta {
|
||||||
|
name: Stamp PDF
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/pdfengines/stamp
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
files: @file(../../test/integration/testdata/page_1.pdf)
|
||||||
|
stampSource: text
|
||||||
|
stampExpression: APPROVED
|
||||||
|
~stampPages: 1-2
|
||||||
|
~stampOptions: {"font":"Helvetica","fontSize":"48","color":"#00FF00","opacity":"0.5","rotation":"0"}
|
||||||
|
~stamp: @file(../../test/integration/testdata/watermark.png)
|
||||||
|
~downloadFrom: [{"url":"https://example.com/stamp.png","field":"stamp"}]
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Output-Filename: stamped
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
31
.bruno/PDF Engines/Watermark/Watermark PDF.bru
Normal file
31
.bruno/PDF Engines/Watermark/Watermark PDF.bru
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
meta {
|
||||||
|
name: Watermark PDF
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/pdfengines/watermark
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
files: @file(../../test/integration/testdata/page_1.pdf)
|
||||||
|
watermarkSource: text
|
||||||
|
watermarkExpression: CONFIDENTIAL
|
||||||
|
~watermarkPages: 1-2
|
||||||
|
~watermarkOptions: {"font":"Helvetica","fontSize":"48","color":"#FF0000","opacity":"0.3","rotation":"45"}
|
||||||
|
~watermark: @file(../../test/integration/testdata/watermark.png)
|
||||||
|
~downloadFrom: [{"url":"https://example.com/watermark.png","field":"watermark"}]
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Output-Filename: watermarked
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Events-Url: http://localhost:8080/webhook/events
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
65
.bruno/README.md
Normal file
65
.bruno/README.md
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
# Bruno API Collection
|
||||||
|
|
||||||
|
[Bruno](https://www.usebruno.com/) collection mirroring every Gotenberg route. Update the collection when adding or modifying a route.
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
.bruno/
|
||||||
|
├── bruno.json # Collection config
|
||||||
|
├── collection.bru # Collection-level defaults (Gotenberg-Trace header)
|
||||||
|
├── environments/
|
||||||
|
│ ├── Local.bru # baseUrl: http://localhost:3000
|
||||||
|
│ └── Demo.bru # baseUrl: https://demo.gotenberg.dev
|
||||||
|
├── Health & Info/ # GET routes
|
||||||
|
├── Chromium/Convert/ # POST routes grouped by module
|
||||||
|
├── Chromium/Screenshot/
|
||||||
|
├── LibreOffice/
|
||||||
|
└── PDF Engines/<Feature>/ # One folder per feature (Merge, Split, Rotate, ...)
|
||||||
|
```
|
||||||
|
|
||||||
|
## `.bru` file format
|
||||||
|
|
||||||
|
```bru
|
||||||
|
meta {
|
||||||
|
name: <Human-readable name>
|
||||||
|
type: http
|
||||||
|
seq: <order within folder>
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{baseUrl}}/forms/<path>
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
files: @file(../../test/integration/testdata/<file>)
|
||||||
|
<mandatoryField>: <value>
|
||||||
|
~<optionalField>: <value>
|
||||||
|
}
|
||||||
|
|
||||||
|
headers {
|
||||||
|
~Gotenberg-Output-Filename: <name>
|
||||||
|
~Gotenberg-Webhook-Url: http://localhost:8080/webhook
|
||||||
|
~Gotenberg-Webhook-Error-Url: http://localhost:8080/webhook/error
|
||||||
|
~Gotenberg-Webhook-Method: POST
|
||||||
|
~Gotenberg-Webhook-Error-Method: POST
|
||||||
|
~Gotenberg-Webhook-Extra-Http-Headers: {"X-Custom":"value"}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Conventions
|
||||||
|
|
||||||
|
- Mandatory fields have no prefix. Optional fields use `~` (disabled by default in Bruno).
|
||||||
|
- File references use relative paths to `test/integration/testdata/`.
|
||||||
|
- Webhook and output filename headers appear on every POST route as optional (`~`).
|
||||||
|
- One `.bru` file per request. For routes with read/write variants (e.g., bookmarks, metadata), create separate files in the same folder.
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
|
||||||
|
1. Create or update the `.bru` file in the matching folder under `.bruno/`.
|
||||||
|
2. Include all form fields from the route handler. Check `FormData*` calls in the route function.
|
||||||
|
3. For file upload fields (`files`, `watermark`, `stamp`, `embeds`), use `@file(...)` with a suitable test file.
|
||||||
|
4. Verify the URL path matches the route's `Path` field exactly.
|
||||||
|
5. For new module folders, keep the naming consistent (e.g., `PDF Engines/Rotate/`).
|
||||||
6
.bruno/bruno.json
Normal file
6
.bruno/bruno.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"version": "1",
|
||||||
|
"name": "Gotenberg",
|
||||||
|
"type": "collection",
|
||||||
|
"ignore": ["node_modules", ".git"]
|
||||||
|
}
|
||||||
3
.bruno/collection.bru
Normal file
3
.bruno/collection.bru
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
headers {
|
||||||
|
Gotenberg-Trace: {{traceId}}
|
||||||
|
}
|
||||||
4
.bruno/environments/Demo.bru
Normal file
4
.bruno/environments/Demo.bru
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
vars {
|
||||||
|
baseUrl: https://demo.gotenberg.dev
|
||||||
|
traceId: bruno-demo
|
||||||
|
}
|
||||||
4
.bruno/environments/Local.bru
Normal file
4
.bruno/environments/Local.bru
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
vars {
|
||||||
|
baseUrl: http://localhost:3000
|
||||||
|
traceId: bruno-local
|
||||||
|
}
|
||||||
@@ -1 +1 @@
|
|||||||
.git
|
.git
|
||||||
|
|||||||
6
.env
Normal file
6
.env
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
GOTENBERG_VERSION=snapshot
|
||||||
|
DOCKER_REGISTRY=gotenberg
|
||||||
|
DOCKER_REPOSITORY=gotenberg
|
||||||
|
DOCKERFILE=build/Dockerfile
|
||||||
|
DOCKER_BUILD_CONTEXT='.'
|
||||||
|
TARGET=gotenberg
|
||||||
1
.github/FUNDING.yml
vendored
Normal file
1
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
github: [gulien]
|
||||||
130
.github/actions/build-test-push/action.yml
vendored
Normal file
130
.github/actions/build-test-push/action.yml
vendored
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
name: Build Test Push
|
||||||
|
description: Build, test and push Docker images for a given platform
|
||||||
|
author: Julien Neuhart
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
github_token:
|
||||||
|
description: The GitHub token
|
||||||
|
required: true
|
||||||
|
default: ${{ github.token }}
|
||||||
|
docker_hub_username:
|
||||||
|
description: The Docker Hub username
|
||||||
|
required: true
|
||||||
|
docker_hub_password:
|
||||||
|
description: The Docker Hub password
|
||||||
|
required: true
|
||||||
|
platform:
|
||||||
|
description: linux/amd64, linux/ppc64le, linux/386, linux/arm64, linux/arm/v7
|
||||||
|
required: true
|
||||||
|
version:
|
||||||
|
description: Gotenberg version
|
||||||
|
required: true
|
||||||
|
skip_integrations_tests:
|
||||||
|
description: Define whether to skip integration testing
|
||||||
|
default: false
|
||||||
|
alternate_repository:
|
||||||
|
description: Alternate repository to push the tags to
|
||||||
|
dry_run:
|
||||||
|
description: Dry run this action
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
tags:
|
||||||
|
description: Comma separated list of full variant tags
|
||||||
|
value: ${{ steps.build.outputs.tags }}
|
||||||
|
tags_chromium:
|
||||||
|
description: Comma separated list of Chromium variant tags
|
||||||
|
value: ${{ steps.build.outputs.tags_chromium }}
|
||||||
|
tags_libreoffice:
|
||||||
|
description: Comma separated list of LibreOffice variant tags
|
||||||
|
value: ${{ steps.build.outputs.tags_libreoffice }}
|
||||||
|
tags_cloud_run:
|
||||||
|
description: Comma separated list of Cloud Run full variant tags (linux/amd64 only)
|
||||||
|
value: ${{ steps.build.outputs.tags_cloud_run }}
|
||||||
|
tags_cloud_run_chromium:
|
||||||
|
description: Comma separated list of Cloud Run Chromium variant tags (linux/amd64 only)
|
||||||
|
value: ${{ steps.build.outputs.tags_cloud_run_chromium }}
|
||||||
|
tags_cloud_run_libreoffice:
|
||||||
|
description: Comma separated list of Cloud Run LibreOffice variant tags (linux/amd64 only)
|
||||||
|
value: ${{ steps.build.outputs.tags_cloud_run_libreoffice }}
|
||||||
|
tags_aws_lambda:
|
||||||
|
description: Comma separated list of AWS Lambda full variant tags (linux/amd64 and linux/arm64 only)
|
||||||
|
value: ${{ steps.build.outputs.tags_aws_lambda }}
|
||||||
|
tags_aws_lambda_chromium:
|
||||||
|
description: Comma separated list of AWS Lambda Chromium variant tags (linux/amd64 and linux/arm64 only)
|
||||||
|
value: ${{ steps.build.outputs.tags_aws_lambda_chromium }}
|
||||||
|
tags_aws_lambda_libreoffice:
|
||||||
|
description: Comma separated list of AWS Lambda LibreOffice variant tags (linux/amd64 and linux/arm64 only)
|
||||||
|
value: ${{ steps.build.outputs.tags_aws_lambda_libreoffice }}
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v3
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Check out code
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
|
- name: Log in to Docker Hub
|
||||||
|
if: inputs.docker_hub_username != ''
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ inputs.docker_hub_username }}
|
||||||
|
password: ${{ inputs.docker_hub_password }}
|
||||||
|
|
||||||
|
- name: Build ${{ inputs.platform }}
|
||||||
|
id: build
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
INPUT_VERSION: ${{ inputs.version }}
|
||||||
|
INPUT_PLATFORM: ${{ inputs.platform }}
|
||||||
|
INPUT_ALTERNATE_REPOSITORY: ${{ inputs.alternate_repository }}
|
||||||
|
INPUT_DRY_RUN: ${{ inputs.dry_run }}
|
||||||
|
run: |
|
||||||
|
.github/actions/build-test-push/build.sh \
|
||||||
|
--version "$INPUT_VERSION" \
|
||||||
|
--platform "$INPUT_PLATFORM" \
|
||||||
|
--alternate-repository "$INPUT_ALTERNATE_REPOSITORY" \
|
||||||
|
--dry-run "$INPUT_DRY_RUN"
|
||||||
|
|
||||||
|
- name: Run integration tests
|
||||||
|
if: inputs.skip_integrations_tests != 'true'
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
INPUT_VERSION: ${{ inputs.version }}
|
||||||
|
INPUT_PLATFORM: ${{ inputs.platform }}
|
||||||
|
INPUT_ALTERNATE_REPOSITORY: ${{ inputs.alternate_repository }}
|
||||||
|
INPUT_DRY_RUN: ${{ inputs.dry_run }}
|
||||||
|
run: |
|
||||||
|
.github/actions/build-test-push/test.sh \
|
||||||
|
--version "$INPUT_VERSION" \
|
||||||
|
--platform "$INPUT_PLATFORM" \
|
||||||
|
--alternate-repository "$INPUT_ALTERNATE_REPOSITORY" \
|
||||||
|
--dry-run "$INPUT_DRY_RUN"
|
||||||
|
|
||||||
|
- name: Push
|
||||||
|
if: inputs.docker_hub_username != ''
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
INPUT_TAGS: ${{ steps.build.outputs.tags }},${{ steps.build.outputs.tags_chromium }},${{ steps.build.outputs.tags_libreoffice }},${{ steps.build.outputs.tags_cloud_run }},${{ steps.build.outputs.tags_cloud_run_chromium }},${{ steps.build.outputs.tags_cloud_run_libreoffice }},${{ steps.build.outputs.tags_aws_lambda }},${{ steps.build.outputs.tags_aws_lambda_chromium }},${{ steps.build.outputs.tags_aws_lambda_libreoffice }}
|
||||||
|
INPUT_DRY_RUN: ${{ inputs.dry_run }}
|
||||||
|
run: |
|
||||||
|
.github/actions/build-test-push/push.sh \
|
||||||
|
--tags "$INPUT_TAGS" \
|
||||||
|
--dry-run "$INPUT_DRY_RUN"
|
||||||
|
|
||||||
|
- name: Outputs
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "tags=${{ steps.build.outputs.tags }}"
|
||||||
|
echo "tags_chromium=${{ steps.build.outputs.tags_chromium }}"
|
||||||
|
echo "tags_libreoffice=${{ steps.build.outputs.tags_libreoffice }}"
|
||||||
|
echo "tags_cloud_run=${{ steps.build.outputs.tags_cloud_run }}"
|
||||||
|
echo "tags_cloud_run_chromium=${{ steps.build.outputs.tags_cloud_run_chromium }}"
|
||||||
|
echo "tags_cloud_run_libreoffice=${{ steps.build.outputs.tags_cloud_run_libreoffice }}"
|
||||||
|
echo "tags_aws_lambda=${{ steps.build.outputs.tags_aws_lambda }}"
|
||||||
|
echo "tags_aws_lambda_chromium=${{ steps.build.outputs.tags_aws_lambda_chromium }}"
|
||||||
|
echo "tags_aws_lambda_libreoffice=${{ steps.build.outputs.tags_aws_lambda_libreoffice }}"
|
||||||
304
.github/actions/build-test-push/build.sh
vendored
Executable file
304
.github/actions/build-test-push/build.sh
vendored
Executable file
@@ -0,0 +1,304 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Exit early.
|
||||||
|
# See: https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#The-Set-Builtin.
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Source dot env file.
|
||||||
|
source .env
|
||||||
|
|
||||||
|
# Arguments.
|
||||||
|
version=""
|
||||||
|
platform=""
|
||||||
|
alternate_repository=""
|
||||||
|
dry_run=""
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
--version)
|
||||||
|
version="${2//v/}"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--platform)
|
||||||
|
platform="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--alternate-repository)
|
||||||
|
alternate_repository="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--dry-run)
|
||||||
|
dry_run="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown option $1"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Build and push 👷"
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo "Gotenberg version: $version"
|
||||||
|
echo "Target platform: $platform"
|
||||||
|
|
||||||
|
if [ -n "$alternate_repository" ]; then
|
||||||
|
DOCKER_REPOSITORY=$alternate_repository
|
||||||
|
echo "⚠️ Using $alternate_repository for DOCKER_REPOSITORY"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$dry_run" = "true" ]; then
|
||||||
|
echo "🚧 Dry run"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Build tags arrays.
|
||||||
|
tags=()
|
||||||
|
tags_chromium=()
|
||||||
|
tags_libreoffice=()
|
||||||
|
tags_cloud_run=()
|
||||||
|
tags_cloud_run_chromium=()
|
||||||
|
tags_cloud_run_libreoffice=()
|
||||||
|
tags_aws_lambda=()
|
||||||
|
tags_aws_lambda_chromium=()
|
||||||
|
tags_aws_lambda_libreoffice=()
|
||||||
|
|
||||||
|
IFS='/' read -ra arch <<< "$platform"
|
||||||
|
IFS='.' read -ra semver <<< "$version"
|
||||||
|
|
||||||
|
if [ "${#semver[@]}" -eq 3 ]; then
|
||||||
|
echo
|
||||||
|
echo "Semver version detected"
|
||||||
|
|
||||||
|
major="${semver[0]}"
|
||||||
|
minor="${semver[1]}"
|
||||||
|
patch="${semver[2]}"
|
||||||
|
|
||||||
|
for suffix in "latest" "$major" "$major.$minor" "$major.$minor.$patch"; do
|
||||||
|
tags+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$suffix-${arch[1]}")
|
||||||
|
tags_chromium+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$suffix-chromium-${arch[1]}")
|
||||||
|
tags_libreoffice+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$suffix-libreoffice-${arch[1]}")
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$platform" = "linux/amd64" ]; then
|
||||||
|
for suffix in "latest" "$major" "$major.$minor" "$major.$minor.$patch"; do
|
||||||
|
tags_cloud_run+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$suffix-cloudrun")
|
||||||
|
tags_cloud_run_chromium+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$suffix-chromium-cloudrun")
|
||||||
|
tags_cloud_run_libreoffice+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$suffix-libreoffice-cloudrun")
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$platform" = "linux/amd64" ] || [ "$platform" = "linux/arm64" ]; then
|
||||||
|
for suffix in "latest" "$major" "$major.$minor" "$major.$minor.$patch"; do
|
||||||
|
tags_aws_lambda+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$suffix-aws-lambda-${arch[1]}")
|
||||||
|
tags_aws_lambda_chromium+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$suffix-chromium-aws-lambda-${arch[1]}")
|
||||||
|
tags_aws_lambda_libreoffice+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$suffix-libreoffice-aws-lambda-${arch[1]}")
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo
|
||||||
|
echo "Non-semver version detected, fallback to $version"
|
||||||
|
|
||||||
|
tags+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$version-${arch[1]}")
|
||||||
|
tags_chromium+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$version-chromium-${arch[1]}")
|
||||||
|
tags_libreoffice+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$version-libreoffice-${arch[1]}")
|
||||||
|
|
||||||
|
if [ "$platform" = "linux/amd64" ]; then
|
||||||
|
tags_cloud_run+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$version-cloudrun")
|
||||||
|
tags_cloud_run_chromium+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$version-chromium-cloudrun")
|
||||||
|
tags_cloud_run_libreoffice+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$version-libreoffice-cloudrun")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$platform" = "linux/amd64" ] || [ "$platform" = "linux/arm64" ]; then
|
||||||
|
tags_aws_lambda+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$version-aws-lambda-${arch[1]}")
|
||||||
|
tags_aws_lambda_chromium+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$version-chromium-aws-lambda-${arch[1]}")
|
||||||
|
tags_aws_lambda_libreoffice+=("$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$version-libreoffice-aws-lambda-${arch[1]}")
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
tags_flags=()
|
||||||
|
tags_chromium_flags=()
|
||||||
|
tags_libreoffice_flags=()
|
||||||
|
tags_cloud_run_flags=()
|
||||||
|
tags_cloud_run_chromium_flags=()
|
||||||
|
tags_cloud_run_libreoffice_flags=()
|
||||||
|
tags_aws_lambda_flags=()
|
||||||
|
tags_aws_lambda_chromium_flags=()
|
||||||
|
tags_aws_lambda_libreoffice_flags=()
|
||||||
|
|
||||||
|
echo "Will use the following tags:"
|
||||||
|
for tag in "${tags[@]}"; do
|
||||||
|
tags_flags+=("-t" "$tag")
|
||||||
|
echo "- $tag"
|
||||||
|
done
|
||||||
|
for tag in "${tags_chromium[@]}"; do
|
||||||
|
tags_chromium_flags+=("-t" "$tag")
|
||||||
|
echo "- $tag"
|
||||||
|
done
|
||||||
|
for tag in "${tags_libreoffice[@]}"; do
|
||||||
|
tags_libreoffice_flags+=("-t" "$tag")
|
||||||
|
echo "- $tag"
|
||||||
|
done
|
||||||
|
for tag in "${tags_cloud_run[@]}"; do
|
||||||
|
tags_cloud_run_flags+=("-t" "$tag")
|
||||||
|
echo "- $tag"
|
||||||
|
done
|
||||||
|
for tag in "${tags_cloud_run_chromium[@]}"; do
|
||||||
|
tags_cloud_run_chromium_flags+=("-t" "$tag")
|
||||||
|
echo "- $tag"
|
||||||
|
done
|
||||||
|
for tag in "${tags_cloud_run_libreoffice[@]}"; do
|
||||||
|
tags_cloud_run_libreoffice_flags+=("-t" "$tag")
|
||||||
|
echo "- $tag"
|
||||||
|
done
|
||||||
|
for tag in "${tags_aws_lambda[@]}"; do
|
||||||
|
tags_aws_lambda_flags+=("-t" "$tag")
|
||||||
|
echo "- $tag"
|
||||||
|
done
|
||||||
|
for tag in "${tags_aws_lambda_chromium[@]}"; do
|
||||||
|
tags_aws_lambda_chromium_flags+=("-t" "$tag")
|
||||||
|
echo "- $tag"
|
||||||
|
done
|
||||||
|
for tag in "${tags_aws_lambda_libreoffice[@]}"; do
|
||||||
|
tags_aws_lambda_libreoffice_flags+=("-t" "$tag")
|
||||||
|
echo "- $tag"
|
||||||
|
done
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Build images.
|
||||||
|
run_cmd() {
|
||||||
|
local cmd="$1"
|
||||||
|
|
||||||
|
if [ "$dry_run" = "true" ]; then
|
||||||
|
echo "🚧 Dry run - would run the following command:"
|
||||||
|
echo "$cmd"
|
||||||
|
echo
|
||||||
|
else
|
||||||
|
echo "⚙️ Running command:"
|
||||||
|
echo "$cmd"
|
||||||
|
eval "$cmd"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
join() {
|
||||||
|
local delimiter="$1"
|
||||||
|
shift
|
||||||
|
local IFS="$delimiter"
|
||||||
|
echo "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
no_arch_tag="$DOCKER_REGISTRY/$DOCKER_REPOSITORY:$version"
|
||||||
|
|
||||||
|
# Full variant.
|
||||||
|
cmd="docker buildx build \
|
||||||
|
--target gotenberg \
|
||||||
|
--build-arg GOTENBERG_VERSION=$version \
|
||||||
|
--platform $platform \
|
||||||
|
--load \
|
||||||
|
${tags_flags[*]} \
|
||||||
|
-t $no_arch_tag \
|
||||||
|
-f $DOCKERFILE $DOCKER_BUILD_CONTEXT
|
||||||
|
"
|
||||||
|
run_cmd "$cmd"
|
||||||
|
|
||||||
|
# Chromium only variant.
|
||||||
|
cmd="docker buildx build \
|
||||||
|
--target gotenberg-chromium \
|
||||||
|
--build-arg GOTENBERG_VERSION=$version \
|
||||||
|
--platform $platform \
|
||||||
|
--load \
|
||||||
|
${tags_chromium_flags[*]} \
|
||||||
|
-f $DOCKERFILE $DOCKER_BUILD_CONTEXT
|
||||||
|
"
|
||||||
|
run_cmd "$cmd"
|
||||||
|
|
||||||
|
# LibreOffice only variant.
|
||||||
|
cmd="docker buildx build \
|
||||||
|
--target gotenberg-libreoffice \
|
||||||
|
--build-arg GOTENBERG_VERSION=$version \
|
||||||
|
--platform $platform \
|
||||||
|
--load \
|
||||||
|
${tags_libreoffice_flags[*]} \
|
||||||
|
-f $DOCKERFILE $DOCKER_BUILD_CONTEXT
|
||||||
|
"
|
||||||
|
run_cmd "$cmd"
|
||||||
|
|
||||||
|
# Cloud Run variants (amd64 only).
|
||||||
|
if [ "$platform" = "linux/amd64" ]; then
|
||||||
|
cmd="docker buildx build \
|
||||||
|
--target gotenberg-cloudrun \
|
||||||
|
--build-arg GOTENBERG_VERSION=$version \
|
||||||
|
--platform $platform \
|
||||||
|
--load \
|
||||||
|
${tags_cloud_run_flags[*]} \
|
||||||
|
-f $DOCKERFILE $DOCKER_BUILD_CONTEXT
|
||||||
|
"
|
||||||
|
run_cmd "$cmd"
|
||||||
|
|
||||||
|
cmd="docker buildx build \
|
||||||
|
--target gotenberg-cloudrun-chromium \
|
||||||
|
--build-arg GOTENBERG_VERSION=$version \
|
||||||
|
--platform $platform \
|
||||||
|
--load \
|
||||||
|
${tags_cloud_run_chromium_flags[*]} \
|
||||||
|
-f $DOCKERFILE $DOCKER_BUILD_CONTEXT
|
||||||
|
"
|
||||||
|
run_cmd "$cmd"
|
||||||
|
|
||||||
|
cmd="docker buildx build \
|
||||||
|
--target gotenberg-cloudrun-libreoffice \
|
||||||
|
--build-arg GOTENBERG_VERSION=$version \
|
||||||
|
--platform $platform \
|
||||||
|
--load \
|
||||||
|
${tags_cloud_run_libreoffice_flags[*]} \
|
||||||
|
-f $DOCKERFILE $DOCKER_BUILD_CONTEXT
|
||||||
|
"
|
||||||
|
run_cmd "$cmd"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# AWS Lambda variants (amd64 + arm64 only).
|
||||||
|
if [ "$platform" = "linux/amd64" ] || [ "$platform" = "linux/arm64" ]; then
|
||||||
|
cmd="docker buildx build \
|
||||||
|
--target gotenberg-aws-lambda \
|
||||||
|
--build-arg GOTENBERG_VERSION=$version \
|
||||||
|
--platform $platform \
|
||||||
|
--load \
|
||||||
|
${tags_aws_lambda_flags[*]} \
|
||||||
|
-f $DOCKERFILE $DOCKER_BUILD_CONTEXT
|
||||||
|
"
|
||||||
|
run_cmd "$cmd"
|
||||||
|
|
||||||
|
cmd="docker buildx build \
|
||||||
|
--target gotenberg-aws-lambda-chromium \
|
||||||
|
--build-arg GOTENBERG_VERSION=$version \
|
||||||
|
--platform $platform \
|
||||||
|
--load \
|
||||||
|
${tags_aws_lambda_chromium_flags[*]} \
|
||||||
|
-f $DOCKERFILE $DOCKER_BUILD_CONTEXT
|
||||||
|
"
|
||||||
|
run_cmd "$cmd"
|
||||||
|
|
||||||
|
cmd="docker buildx build \
|
||||||
|
--target gotenberg-aws-lambda-libreoffice \
|
||||||
|
--build-arg GOTENBERG_VERSION=$version \
|
||||||
|
--platform $platform \
|
||||||
|
--load \
|
||||||
|
${tags_aws_lambda_libreoffice_flags[*]} \
|
||||||
|
-f $DOCKERFILE $DOCKER_BUILD_CONTEXT
|
||||||
|
"
|
||||||
|
run_cmd "$cmd"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ Done!"
|
||||||
|
echo "tags=$(join "," "${tags[@]}")" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "tags_chromium=$(join "," "${tags_chromium[@]}")" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "tags_libreoffice=$(join "," "${tags_libreoffice[@]}")" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "tags_cloud_run=$(join "," "${tags_cloud_run[@]}")" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "tags_cloud_run_chromium=$(join "," "${tags_cloud_run_chromium[@]}")" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "tags_cloud_run_libreoffice=$(join "," "${tags_cloud_run_libreoffice[@]}")" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "tags_aws_lambda=$(join "," "${tags_aws_lambda[@]}")" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "tags_aws_lambda_chromium=$(join "," "${tags_aws_lambda_chromium[@]}")" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "tags_aws_lambda_libreoffice=$(join "," "${tags_aws_lambda_libreoffice[@]}")" >> "$GITHUB_OUTPUT"
|
||||||
|
exit 0
|
||||||
76
.github/actions/build-test-push/push.sh
vendored
Executable file
76
.github/actions/build-test-push/push.sh
vendored
Executable file
@@ -0,0 +1,76 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Exit early.
|
||||||
|
# See: https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#The-Set-Builtin.
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Source dot env file.
|
||||||
|
source .env
|
||||||
|
|
||||||
|
# Arguments.
|
||||||
|
tags=""
|
||||||
|
dry_run=""
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
--tags)
|
||||||
|
tags="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--dry-run)
|
||||||
|
dry_run=$2
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown option $1"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Push tag(s) 📦"
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo "Tag(s) to push:"
|
||||||
|
IFS=',' read -ra tmp_tags_to_push <<< "$tags"
|
||||||
|
|
||||||
|
tags_to_push=()
|
||||||
|
for tag in "${tmp_tags_to_push[@]}"; do
|
||||||
|
[ -n "$tag" ] && tags_to_push+=("$tag")
|
||||||
|
done
|
||||||
|
|
||||||
|
for tag in "${tags_to_push[@]}"; do
|
||||||
|
echo "- $tag"
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$dry_run" = "true" ]; then
|
||||||
|
echo "🚧 Dry run"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Push tags.
|
||||||
|
run_cmd() {
|
||||||
|
local cmd="$1"
|
||||||
|
|
||||||
|
if [ "$dry_run" = "true" ]; then
|
||||||
|
echo "🚧 Dry run - would run the following command:"
|
||||||
|
echo "$cmd"
|
||||||
|
echo
|
||||||
|
else
|
||||||
|
echo "⚙️ Running command:"
|
||||||
|
echo "$cmd"
|
||||||
|
eval "$cmd"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
for tag in "${tags_to_push[@]}"; do
|
||||||
|
cmd="docker push $tag"
|
||||||
|
run_cmd "$cmd"
|
||||||
|
|
||||||
|
echo "➡️ $tag pushed"
|
||||||
|
echo
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "✅ Done!"
|
||||||
|
exit 0
|
||||||
79
.github/actions/build-test-push/test.sh
vendored
Executable file
79
.github/actions/build-test-push/test.sh
vendored
Executable file
@@ -0,0 +1,79 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Exit early.
|
||||||
|
# See: https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#The-Set-Builtin.
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Source dot env file.
|
||||||
|
source .env
|
||||||
|
|
||||||
|
# Arguments.
|
||||||
|
version=""
|
||||||
|
platform=""
|
||||||
|
alternate_repository=""
|
||||||
|
dry_run=""
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
--version)
|
||||||
|
version="${2//v/}"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--platform)
|
||||||
|
platform="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--alternate-repository)
|
||||||
|
alternate_repository="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--dry-run)
|
||||||
|
dry_run="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown option $1"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Integration testing 🧪"
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo "Gotenberg version: $version"
|
||||||
|
echo "Target platform: $platform"
|
||||||
|
|
||||||
|
repository=$DOCKER_REPOSITORY
|
||||||
|
|
||||||
|
if [ -n "$alternate_repository" ]; then
|
||||||
|
echo "⚠️ Using $alternate_repository for DOCKER_REPOSITORY"
|
||||||
|
repository=$alternate_repository
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$dry_run" = "true" ]; then
|
||||||
|
echo "🚧 Dry run"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Test image.
|
||||||
|
run_cmd() {
|
||||||
|
local cmd="$1"
|
||||||
|
|
||||||
|
if [ "$dry_run" = "true" ]; then
|
||||||
|
echo "🚧 Dry run - would run the following command:"
|
||||||
|
echo "$cmd"
|
||||||
|
echo
|
||||||
|
else
|
||||||
|
echo "⚙️ Running command:"
|
||||||
|
echo "$cmd"
|
||||||
|
eval "$cmd"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd="make test-integration DOCKER_REPOSITORY=$repository GOTENBERG_VERSION=$version PLATFORM=$platform NO_CONCURRENCY=true"
|
||||||
|
run_cmd "$cmd"
|
||||||
|
|
||||||
|
echo "✅ Done!"
|
||||||
|
exit 0
|
||||||
34
.github/actions/clean/action.yml
vendored
Normal file
34
.github/actions/clean/action.yml
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
name: Clean
|
||||||
|
description: Clean tags from Docker Hub
|
||||||
|
author: Julien Neuhart
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
docker_hub_username:
|
||||||
|
description: The Docker Hub username
|
||||||
|
required: true
|
||||||
|
docker_hub_password:
|
||||||
|
description: The Docker Hub password
|
||||||
|
required: true
|
||||||
|
tags:
|
||||||
|
description: Comma separated list of tags to clean
|
||||||
|
snapshot_version:
|
||||||
|
description: Snapshot version to clean
|
||||||
|
dry_run:
|
||||||
|
description: Dry run this action
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- name: Clean tags from Docker Hub
|
||||||
|
env:
|
||||||
|
DOCKERHUB_USERNAME: ${{ inputs.docker_hub_username }}
|
||||||
|
DOCKERHUB_TOKEN: ${{ inputs.docker_hub_password }}
|
||||||
|
INPUT_TAGS: ${{ inputs.tags }}
|
||||||
|
INPUT_SNAPSHOT_VERSION: ${{ inputs.snapshot_version }}
|
||||||
|
INPUT_DRY_RUN: ${{ inputs.dry_run }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
.github/actions/clean/clean.sh \
|
||||||
|
--tags "$INPUT_TAGS" \
|
||||||
|
--snapshot-version "$INPUT_SNAPSHOT_VERSION" \
|
||||||
|
--dry-run "$INPUT_DRY_RUN"
|
||||||
123
.github/actions/clean/clean.sh
vendored
Executable file
123
.github/actions/clean/clean.sh
vendored
Executable file
@@ -0,0 +1,123 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Exit early.
|
||||||
|
# See: https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#The-Set-Builtin.
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Source dot env file.
|
||||||
|
source .env
|
||||||
|
|
||||||
|
# Arguments.
|
||||||
|
tags=""
|
||||||
|
snapshot_version=""
|
||||||
|
dry_run=""
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
--tags)
|
||||||
|
tags="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--snapshot-version)
|
||||||
|
snapshot_version="${2//v/}"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--dry-run)
|
||||||
|
dry_run="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown option $1"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Clean tag(s) from Docker Hub 🧹"
|
||||||
|
echo
|
||||||
|
|
||||||
|
IFS=',' read -ra tags_to_delete <<< "$tags"
|
||||||
|
if [ -n "$snapshot_version" ]; then
|
||||||
|
tags_to_delete+=("$DOCKER_REGISTRY/snapshot:$snapshot_version")
|
||||||
|
tags_to_delete+=("$DOCKER_REGISTRY/snapshot:$snapshot_version-cloudrun")
|
||||||
|
tags_to_delete+=("$DOCKER_REGISTRY/snapshot:$snapshot_version-aws-lambda")
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Will delete the following tag(s):"
|
||||||
|
for tag in "${tags_to_delete[@]}"; do
|
||||||
|
echo "- $tag"
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$dry_run" = "true" ]; then
|
||||||
|
echo "🚧 Dry run"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Delete tags.
|
||||||
|
base_url="https://hub.docker.com/v2"
|
||||||
|
token=""
|
||||||
|
|
||||||
|
if [ "$dry_run" = "true" ]; then
|
||||||
|
token="placeholder"
|
||||||
|
echo "🚧 Dry run - would call $base_url to get a token"
|
||||||
|
echo
|
||||||
|
else
|
||||||
|
echo "🌐 Get token from $base_url"
|
||||||
|
|
||||||
|
readarray -t lines < <(
|
||||||
|
curl -s -X POST \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{\"username\":\"$DOCKERHUB_USERNAME\", \"password\":\"$DOCKERHUB_TOKEN\"}" \
|
||||||
|
-w "\n%{http_code}" \
|
||||||
|
"$base_url/users/login"
|
||||||
|
)
|
||||||
|
|
||||||
|
http_code="${lines[-1]}"
|
||||||
|
unset 'lines[-1]'
|
||||||
|
json_body=$(printf "%s\n" "${lines[@]}")
|
||||||
|
|
||||||
|
if [ "$http_code" -ne "200" ]; then
|
||||||
|
echo "❌ Wrong HTTP status - $http_code"
|
||||||
|
echo "$json_body"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
token=$(jq -r '.token' <<< "$json_body")
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$token" ]; then
|
||||||
|
echo "❌ No token from Docker Hub"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tag in "${tags_to_delete[@]}"; do
|
||||||
|
if [ "$dry_run" = "true" ]; then
|
||||||
|
echo "🚧 Dry run - would call $base_url to delete tag $tag"
|
||||||
|
echo
|
||||||
|
else
|
||||||
|
echo "🌐 Delete tag $tag"
|
||||||
|
IFS=':' read -ra tag_parts <<< "$tag"
|
||||||
|
|
||||||
|
readarray -t lines < <(
|
||||||
|
curl -s -X DELETE \
|
||||||
|
-H "Authorization: Bearer $token" \
|
||||||
|
-w "\n%{http_code}" \
|
||||||
|
"$base_url/repositories/${tag_parts[0]}/tags/${tag_parts[1]}/"
|
||||||
|
)
|
||||||
|
|
||||||
|
http_code="${lines[-1]}"
|
||||||
|
unset 'lines[-1]'
|
||||||
|
|
||||||
|
if [ "$http_code" -ne "200" ] && [ "$http_code" -ne "204" ]; then
|
||||||
|
echo "❌ Wrong HTTP status - $http_code"
|
||||||
|
printf '%s\n' "${lines[@]}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "✅ Done!"
|
||||||
|
exit 0
|
||||||
52
.github/actions/merge/action.yml
vendored
Normal file
52
.github/actions/merge/action.yml
vendored
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
name: Merge
|
||||||
|
description: Merge tags to single multi-platform tags
|
||||||
|
author: Julien Neuhart
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
github_token:
|
||||||
|
description: The GitHub token
|
||||||
|
required: true
|
||||||
|
default: ${{ github.token }}
|
||||||
|
docker_hub_username:
|
||||||
|
description: The Docker Hub username
|
||||||
|
required: true
|
||||||
|
docker_hub_password:
|
||||||
|
description: The Docker Hub password
|
||||||
|
required: true
|
||||||
|
tags:
|
||||||
|
description: Comma separated tags to merge
|
||||||
|
required: true
|
||||||
|
alternate_registry:
|
||||||
|
description: Alternate registry to also push resulting tags
|
||||||
|
dry_run:
|
||||||
|
description: Dry run this action
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v3
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Check out code
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
|
- name: Log in to Docker Hub
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ inputs.docker_hub_username }}
|
||||||
|
password: ${{ inputs.docker_hub_password }}
|
||||||
|
|
||||||
|
- name: Merge
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
INPUT_TAGS: ${{ inputs.tags }}
|
||||||
|
INPUT_ALTERNATE_REGISTRY: ${{ inputs.alternate_registry }}
|
||||||
|
INPUT_DRY_RUN: ${{ inputs.dry_run }}
|
||||||
|
run: |
|
||||||
|
.github/actions/merge/merge.sh \
|
||||||
|
--tags "$INPUT_TAGS" \
|
||||||
|
--alternate-registry "$INPUT_ALTERNATE_REGISTRY" \
|
||||||
|
--dry-run "$INPUT_DRY_RUN"
|
||||||
108
.github/actions/merge/merge.sh
vendored
Executable file
108
.github/actions/merge/merge.sh
vendored
Executable file
@@ -0,0 +1,108 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Exit early.
|
||||||
|
# See: https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#The-Set-Builtin.
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Source dot env file.
|
||||||
|
source .env
|
||||||
|
|
||||||
|
# Arguments.
|
||||||
|
tags=""
|
||||||
|
alternate_registry=""
|
||||||
|
dry_run=""
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
--tags)
|
||||||
|
tags="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--alternate-registry)
|
||||||
|
alternate_registry="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--dry-run)
|
||||||
|
dry_run=$2
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown option $1"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Merge tag(s) 👷"
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo "Tag(s) to merge:"
|
||||||
|
IFS=',' read -ra tags_to_merge <<< "$tags"
|
||||||
|
for tag in "${tags_to_merge[@]}"; do
|
||||||
|
echo "- $tag"
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -n "$alternate_registry" ]; then
|
||||||
|
echo "⚠️ Will also push to $alternate_registry registry"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$dry_run" = "true" ]; then
|
||||||
|
echo "🚧 Dry run"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Build merge map.
|
||||||
|
declare -A merge_map
|
||||||
|
|
||||||
|
for tag in "${tags_to_merge[@]}"; do
|
||||||
|
target_tag="${tag//-amd64/}"
|
||||||
|
target_tag="${target_tag//-ppc64le/}"
|
||||||
|
target_tag="${target_tag//-arm64/}"
|
||||||
|
target_tag="${target_tag//-arm/}"
|
||||||
|
target_tag="${target_tag//-386/}"
|
||||||
|
|
||||||
|
merge_map["$target_tag"]+="$tag "
|
||||||
|
done
|
||||||
|
|
||||||
|
# Merge tags.
|
||||||
|
run_cmd() {
|
||||||
|
local cmd="$1"
|
||||||
|
|
||||||
|
if [ "$dry_run" = "true" ]; then
|
||||||
|
echo "🚧 Dry run - would run the following command:"
|
||||||
|
echo "$cmd"
|
||||||
|
echo
|
||||||
|
else
|
||||||
|
echo "⚙️ Running command:"
|
||||||
|
echo "$cmd"
|
||||||
|
eval "$cmd"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
for target in "${!merge_map[@]}"; do
|
||||||
|
IFS=' ' read -ra source_tags <<< "${merge_map[$target]}"
|
||||||
|
|
||||||
|
cmd="docker buildx imagetools create \
|
||||||
|
-t $target \
|
||||||
|
${source_tags[*]}
|
||||||
|
"
|
||||||
|
run_cmd "$cmd"
|
||||||
|
|
||||||
|
echo "➡️ $target pushed"
|
||||||
|
echo
|
||||||
|
if [ -n "$alternate_registry" ]; then
|
||||||
|
alternate_target="${target/$DOCKER_REGISTRY/$alternate_registry}"
|
||||||
|
cmd="docker buildx imagetools create \
|
||||||
|
-t $alternate_target \
|
||||||
|
$target
|
||||||
|
"
|
||||||
|
run_cmd "$cmd"
|
||||||
|
|
||||||
|
echo "➡️ $alternate_target pushed"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "✅ Done!"
|
||||||
|
exit 0
|
||||||
26
.github/dependabot.yml
vendored
Normal file
26
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: "github-actions"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "weekly"
|
||||||
|
- package-ecosystem: "docker"
|
||||||
|
directory: "/build"
|
||||||
|
schedule:
|
||||||
|
interval: "weekly"
|
||||||
|
- package-ecosystem: "gomod"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "weekly"
|
||||||
|
ignore:
|
||||||
|
# Held at v0.14.2: v0.15.x breaks the headless print-mode paint pipeline
|
||||||
|
# (rAF / ResizeObserver / IntersectionObserver stop firing, blank charts).
|
||||||
|
# See https://github.com/gotenberg/gotenberg/issues/1535.
|
||||||
|
- dependency-name: "github.com/chromedp/chromedp"
|
||||||
|
- dependency-name: "github.com/chromedp/cdproto"
|
||||||
|
- package-ecosystem: "npm"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "weekly"
|
||||||
|
cooldown:
|
||||||
|
default-days: 7
|
||||||
6
.github/stale.yml
vendored
6
.github/stale.yml
vendored
@@ -1,7 +1,7 @@
|
|||||||
# Number of days of inactivity before an issue becomes stale
|
# Number of days of inactivity before an issue becomes stale
|
||||||
daysUntilStale: 60
|
daysUntilStale: 7
|
||||||
# Number of days of inactivity before a stale issue is closed
|
# Number of days of inactivity before a stale issue is closed
|
||||||
daysUntilClose: 7
|
daysUntilClose: 3
|
||||||
# Issues with these labels will never be considered stale
|
# Issues with these labels will never be considered stale
|
||||||
exemptLabels:
|
exemptLabels:
|
||||||
- bug
|
- bug
|
||||||
@@ -15,4 +15,4 @@ markComment: >
|
|||||||
recent activity. It will be closed if no further activity occurs. Thank you
|
recent activity. It will be closed if no further activity occurs. Thank you
|
||||||
for your contributions.
|
for your contributions.
|
||||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
# Comment to post when closing a stale issue. Set to `false` to disable
|
||||||
closeComment: false
|
closeComment: false
|
||||||
|
|||||||
206
.github/workflows/continuous-delivery.yml
vendored
Normal file
206
.github/workflows/continuous-delivery.yml
vendored
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
name: Continuous Delivery
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release_amd64:
|
||||||
|
name: Release linux/amd64
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
tags: ${{ steps.build_push.outputs.tags }}
|
||||||
|
tags_chromium: ${{ steps.build_push.outputs.tags_chromium }}
|
||||||
|
tags_libreoffice: ${{ steps.build_push.outputs.tags_libreoffice }}
|
||||||
|
tags_cloud_run: ${{ steps.build_push.outputs.tags_cloud_run }}
|
||||||
|
tags_cloud_run_chromium: ${{ steps.build_push.outputs.tags_cloud_run_chromium }}
|
||||||
|
tags_cloud_run_libreoffice: ${{ steps.build_push.outputs.tags_cloud_run_libreoffice }}
|
||||||
|
tags_aws_lambda: ${{ steps.build_push.outputs.tags_aws_lambda }}
|
||||||
|
tags_aws_lambda_chromium: ${{ steps.build_push.outputs.tags_aws_lambda_chromium }}
|
||||||
|
tags_aws_lambda_libreoffice: ${{ steps.build_push.outputs.tags_aws_lambda_libreoffice }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Build and push
|
||||||
|
id: build_push
|
||||||
|
uses: ./.github/actions/build-test-push
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
version: ${{ github.event.release.tag_name }}
|
||||||
|
platform: linux/amd64
|
||||||
|
skip_integrations_tests: true
|
||||||
|
|
||||||
|
release_386:
|
||||||
|
name: Release linux/386
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
tags: ${{ steps.build_push.outputs.tags }}
|
||||||
|
tags_chromium: ${{ steps.build_push.outputs.tags_chromium }}
|
||||||
|
tags_libreoffice: ${{ steps.build_push.outputs.tags_libreoffice }}
|
||||||
|
tags_cloud_run: ${{ steps.build_push.outputs.tags_cloud_run }}
|
||||||
|
tags_cloud_run_chromium: ${{ steps.build_push.outputs.tags_cloud_run_chromium }}
|
||||||
|
tags_cloud_run_libreoffice: ${{ steps.build_push.outputs.tags_cloud_run_libreoffice }}
|
||||||
|
tags_aws_lambda: ${{ steps.build_push.outputs.tags_aws_lambda }}
|
||||||
|
tags_aws_lambda_chromium: ${{ steps.build_push.outputs.tags_aws_lambda_chromium }}
|
||||||
|
tags_aws_lambda_libreoffice: ${{ steps.build_push.outputs.tags_aws_lambda_libreoffice }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Build and push
|
||||||
|
id: build_push
|
||||||
|
uses: ./.github/actions/build-test-push
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
version: ${{ github.event.release.tag_name }}
|
||||||
|
platform: linux/386
|
||||||
|
skip_integrations_tests: true
|
||||||
|
|
||||||
|
release_ppc64le:
|
||||||
|
name: Release linux/ppc64le
|
||||||
|
runs-on: ubuntu-24.04-ppc64le
|
||||||
|
outputs:
|
||||||
|
tags: ${{ steps.build_push.outputs.tags }}
|
||||||
|
tags_chromium: ${{ steps.build_push.outputs.tags_chromium }}
|
||||||
|
tags_libreoffice: ${{ steps.build_push.outputs.tags_libreoffice }}
|
||||||
|
tags_cloud_run: ${{ steps.build_push.outputs.tags_cloud_run }}
|
||||||
|
tags_cloud_run_chromium: ${{ steps.build_push.outputs.tags_cloud_run_chromium }}
|
||||||
|
tags_cloud_run_libreoffice: ${{ steps.build_push.outputs.tags_cloud_run_libreoffice }}
|
||||||
|
tags_aws_lambda: ${{ steps.build_push.outputs.tags_aws_lambda }}
|
||||||
|
tags_aws_lambda_chromium: ${{ steps.build_push.outputs.tags_aws_lambda_chromium }}
|
||||||
|
tags_aws_lambda_libreoffice: ${{ steps.build_push.outputs.tags_aws_lambda_libreoffice }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Build and push
|
||||||
|
id: build_push
|
||||||
|
uses: ./.github/actions/build-test-push
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
version: ${{ github.event.release.tag_name }}
|
||||||
|
platform: linux/ppc64le
|
||||||
|
skip_integrations_tests: true
|
||||||
|
|
||||||
|
release_arm64:
|
||||||
|
name: Release linux/arm64
|
||||||
|
runs-on: ubuntu-24.04-arm
|
||||||
|
outputs:
|
||||||
|
tags: ${{ steps.build_push.outputs.tags }}
|
||||||
|
tags_chromium: ${{ steps.build_push.outputs.tags_chromium }}
|
||||||
|
tags_libreoffice: ${{ steps.build_push.outputs.tags_libreoffice }}
|
||||||
|
tags_cloud_run: ${{ steps.build_push.outputs.tags_cloud_run }}
|
||||||
|
tags_cloud_run_chromium: ${{ steps.build_push.outputs.tags_cloud_run_chromium }}
|
||||||
|
tags_cloud_run_libreoffice: ${{ steps.build_push.outputs.tags_cloud_run_libreoffice }}
|
||||||
|
tags_aws_lambda: ${{ steps.build_push.outputs.tags_aws_lambda }}
|
||||||
|
tags_aws_lambda_chromium: ${{ steps.build_push.outputs.tags_aws_lambda_chromium }}
|
||||||
|
tags_aws_lambda_libreoffice: ${{ steps.build_push.outputs.tags_aws_lambda_libreoffice }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Build and push
|
||||||
|
id: build_push
|
||||||
|
uses: ./.github/actions/build-test-push
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
version: ${{ github.event.release.tag_name }}
|
||||||
|
platform: linux/arm64
|
||||||
|
skip_integrations_tests: true
|
||||||
|
|
||||||
|
release_arm_v7:
|
||||||
|
name: Release linux/arm/v7
|
||||||
|
runs-on: ubuntu-24.04-arm
|
||||||
|
outputs:
|
||||||
|
tags: ${{ steps.build_push.outputs.tags }}
|
||||||
|
tags_chromium: ${{ steps.build_push.outputs.tags_chromium }}
|
||||||
|
tags_libreoffice: ${{ steps.build_push.outputs.tags_libreoffice }}
|
||||||
|
tags_cloud_run: ${{ steps.build_push.outputs.tags_cloud_run }}
|
||||||
|
tags_cloud_run_chromium: ${{ steps.build_push.outputs.tags_cloud_run_chromium }}
|
||||||
|
tags_cloud_run_libreoffice: ${{ steps.build_push.outputs.tags_cloud_run_libreoffice }}
|
||||||
|
tags_aws_lambda: ${{ steps.build_push.outputs.tags_aws_lambda }}
|
||||||
|
tags_aws_lambda_chromium: ${{ steps.build_push.outputs.tags_aws_lambda_chromium }}
|
||||||
|
tags_aws_lambda_libreoffice: ${{ steps.build_push.outputs.tags_aws_lambda_libreoffice }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Build and push
|
||||||
|
id: build_push
|
||||||
|
uses: ./.github/actions/build-test-push
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
version: ${{ github.event.release.tag_name }}
|
||||||
|
platform: linux/arm/v7
|
||||||
|
skip_integrations_tests: true
|
||||||
|
|
||||||
|
merge_clean_release_tags:
|
||||||
|
needs:
|
||||||
|
- release_amd64
|
||||||
|
- release_386
|
||||||
|
- release_ppc64le
|
||||||
|
- release_arm64
|
||||||
|
- release_arm_v7
|
||||||
|
name: Merge and clean release tags
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Merge
|
||||||
|
uses: ./.github/actions/merge
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.release_amd64.outputs.tags }},${{ needs.release_386.outputs.tags }},${{ needs.release_ppc64le.outputs.tags }},${{ needs.release_arm64.outputs.tags }},${{ needs.release_arm_v7.outputs.tags }}"
|
||||||
|
|
||||||
|
- name: Merge Chromium
|
||||||
|
uses: ./.github/actions/merge
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.release_amd64.outputs.tags_chromium }},${{ needs.release_386.outputs.tags_chromium }},${{ needs.release_ppc64le.outputs.tags_chromium }},${{ needs.release_arm64.outputs.tags_chromium }},${{ needs.release_arm_v7.outputs.tags_chromium }}"
|
||||||
|
|
||||||
|
- name: Merge LibreOffice
|
||||||
|
uses: ./.github/actions/merge
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.release_amd64.outputs.tags_libreoffice }},${{ needs.release_386.outputs.tags_libreoffice }},${{ needs.release_ppc64le.outputs.tags_libreoffice }},${{ needs.release_arm64.outputs.tags_libreoffice }},${{ needs.release_arm_v7.outputs.tags_libreoffice }}"
|
||||||
|
|
||||||
|
- name: Merge AWS Lambda
|
||||||
|
uses: ./.github/actions/merge
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.release_amd64.outputs.tags_aws_lambda }},${{ needs.release_arm64.outputs.tags_aws_lambda }}"
|
||||||
|
|
||||||
|
- name: Merge AWS Lambda Chromium
|
||||||
|
uses: ./.github/actions/merge
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.release_amd64.outputs.tags_aws_lambda_chromium }},${{ needs.release_arm64.outputs.tags_aws_lambda_chromium }}"
|
||||||
|
|
||||||
|
- name: Merge AWS Lambda LibreOffice
|
||||||
|
uses: ./.github/actions/merge
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.release_amd64.outputs.tags_aws_lambda_libreoffice }},${{ needs.release_arm64.outputs.tags_aws_lambda_libreoffice }}"
|
||||||
|
|
||||||
|
- name: Clean
|
||||||
|
uses: ./.github/actions/clean
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.release_amd64.outputs.tags }},${{ needs.release_386.outputs.tags }},${{ needs.release_ppc64le.outputs.tags }},${{ needs.release_arm64.outputs.tags }},${{ needs.release_arm_v7.outputs.tags }},${{ needs.release_amd64.outputs.tags_chromium }},${{ needs.release_386.outputs.tags_chromium }},${{ needs.release_ppc64le.outputs.tags_chromium }},${{ needs.release_arm64.outputs.tags_chromium }},${{ needs.release_arm_v7.outputs.tags_chromium }},${{ needs.release_amd64.outputs.tags_libreoffice }},${{ needs.release_386.outputs.tags_libreoffice }},${{ needs.release_ppc64le.outputs.tags_libreoffice }},${{ needs.release_arm64.outputs.tags_libreoffice }},${{ needs.release_arm_v7.outputs.tags_libreoffice }},${{ needs.release_amd64.outputs.tags_aws_lambda }},${{ needs.release_arm64.outputs.tags_aws_lambda }},${{ needs.release_amd64.outputs.tags_aws_lambda_chromium }},${{ needs.release_arm64.outputs.tags_aws_lambda_chromium }},${{ needs.release_amd64.outputs.tags_aws_lambda_libreoffice }},${{ needs.release_arm64.outputs.tags_aws_lambda_libreoffice }}"
|
||||||
512
.github/workflows/continuous-integration.yml
vendored
Normal file
512
.github/workflows/continuous-integration.yml
vendored
Normal file
@@ -0,0 +1,512 @@
|
|||||||
|
name: Continuous Integration
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ (github.event_name == 'pull_request' && github.event.pull_request.number) || 'main' }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
name: Lint Golang codebase
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Setup Go
|
||||||
|
uses: actions/setup-go@v7
|
||||||
|
with:
|
||||||
|
go-version-file: go.mod
|
||||||
|
|
||||||
|
- name: Run linters
|
||||||
|
uses: golangci/golangci-lint-action@v9
|
||||||
|
with:
|
||||||
|
version: v2.10.1
|
||||||
|
|
||||||
|
lint-prettier:
|
||||||
|
name: Lint non-Golang codebase
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v7
|
||||||
|
with:
|
||||||
|
node-version-file: .node-version
|
||||||
|
|
||||||
|
- name: Install Dependencies
|
||||||
|
run: npm ci --ignore-scripts
|
||||||
|
|
||||||
|
- name: Run linters
|
||||||
|
run: make lint-prettier
|
||||||
|
|
||||||
|
test-unit:
|
||||||
|
needs:
|
||||||
|
- lint
|
||||||
|
- lint-prettier
|
||||||
|
name: Run unit tests
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Setup Go
|
||||||
|
uses: actions/setup-go@v7
|
||||||
|
with:
|
||||||
|
go-version-file: go.mod
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: make test-unit
|
||||||
|
|
||||||
|
snapshot_amd64:
|
||||||
|
if: github.event_name == 'pull_request'
|
||||||
|
needs:
|
||||||
|
- test-unit
|
||||||
|
name: Snapshot linux/amd64
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
tags: ${{ steps.build_test_push.outputs.tags }}
|
||||||
|
tags_chromium: ${{ steps.build_test_push.outputs.tags_chromium }}
|
||||||
|
tags_libreoffice: ${{ steps.build_test_push.outputs.tags_libreoffice }}
|
||||||
|
tags_cloud_run: ${{ steps.build_test_push.outputs.tags_cloud_run }}
|
||||||
|
tags_cloud_run_chromium: ${{ steps.build_test_push.outputs.tags_cloud_run_chromium }}
|
||||||
|
tags_cloud_run_libreoffice: ${{ steps.build_test_push.outputs.tags_cloud_run_libreoffice }}
|
||||||
|
tags_aws_lambda: ${{ steps.build_test_push.outputs.tags_aws_lambda }}
|
||||||
|
tags_aws_lambda_chromium: ${{ steps.build_test_push.outputs.tags_aws_lambda_chromium }}
|
||||||
|
tags_aws_lambda_libreoffice: ${{ steps.build_test_push.outputs.tags_aws_lambda_libreoffice }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Build, test and push
|
||||||
|
id: build_test_push
|
||||||
|
uses: ./.github/actions/build-test-push
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
version: pr-${{ github.event.pull_request.number }}
|
||||||
|
platform: linux/amd64
|
||||||
|
alternate_repository: snapshot
|
||||||
|
|
||||||
|
snapshot_ppc64le:
|
||||||
|
if: github.event_name == 'pull_request'
|
||||||
|
needs:
|
||||||
|
- test-unit
|
||||||
|
name: Snapshot linux/ppc64le
|
||||||
|
runs-on: ubuntu-24.04-ppc64le
|
||||||
|
outputs:
|
||||||
|
tags: ${{ steps.build_test_push.outputs.tags }}
|
||||||
|
tags_chromium: ${{ steps.build_test_push.outputs.tags_chromium }}
|
||||||
|
tags_libreoffice: ${{ steps.build_test_push.outputs.tags_libreoffice }}
|
||||||
|
tags_cloud_run: ${{ steps.build_test_push.outputs.tags_cloud_run }}
|
||||||
|
tags_cloud_run_chromium: ${{ steps.build_test_push.outputs.tags_cloud_run_chromium }}
|
||||||
|
tags_cloud_run_libreoffice: ${{ steps.build_test_push.outputs.tags_cloud_run_libreoffice }}
|
||||||
|
tags_aws_lambda: ${{ steps.build_test_push.outputs.tags_aws_lambda }}
|
||||||
|
tags_aws_lambda_chromium: ${{ steps.build_test_push.outputs.tags_aws_lambda_chromium }}
|
||||||
|
tags_aws_lambda_libreoffice: ${{ steps.build_test_push.outputs.tags_aws_lambda_libreoffice }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Build, test and push
|
||||||
|
id: build_test_push
|
||||||
|
uses: ./.github/actions/build-test-push
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
version: pr-${{ github.event.pull_request.number }}
|
||||||
|
platform: linux/ppc64le
|
||||||
|
alternate_repository: snapshot
|
||||||
|
|
||||||
|
snapshot_386:
|
||||||
|
if: github.event_name == 'pull_request'
|
||||||
|
needs:
|
||||||
|
- test-unit
|
||||||
|
name: Snapshot linux/386
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
tags: ${{ steps.build_test_push.outputs.tags }}
|
||||||
|
tags_chromium: ${{ steps.build_test_push.outputs.tags_chromium }}
|
||||||
|
tags_libreoffice: ${{ steps.build_test_push.outputs.tags_libreoffice }}
|
||||||
|
tags_cloud_run: ${{ steps.build_test_push.outputs.tags_cloud_run }}
|
||||||
|
tags_cloud_run_chromium: ${{ steps.build_test_push.outputs.tags_cloud_run_chromium }}
|
||||||
|
tags_cloud_run_libreoffice: ${{ steps.build_test_push.outputs.tags_cloud_run_libreoffice }}
|
||||||
|
tags_aws_lambda: ${{ steps.build_test_push.outputs.tags_aws_lambda }}
|
||||||
|
tags_aws_lambda_chromium: ${{ steps.build_test_push.outputs.tags_aws_lambda_chromium }}
|
||||||
|
tags_aws_lambda_libreoffice: ${{ steps.build_test_push.outputs.tags_aws_lambda_libreoffice }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Build, test and push
|
||||||
|
id: build_test_push
|
||||||
|
uses: ./.github/actions/build-test-push
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
version: pr-${{ github.event.pull_request.number }}
|
||||||
|
platform: linux/386
|
||||||
|
alternate_repository: snapshot
|
||||||
|
|
||||||
|
snapshot_arm64:
|
||||||
|
if: github.event_name == 'pull_request'
|
||||||
|
needs:
|
||||||
|
- test-unit
|
||||||
|
name: Snapshot linux/arm64
|
||||||
|
runs-on: ubuntu-24.04-arm
|
||||||
|
outputs:
|
||||||
|
tags: ${{ steps.build_test_push.outputs.tags }}
|
||||||
|
tags_chromium: ${{ steps.build_test_push.outputs.tags_chromium }}
|
||||||
|
tags_libreoffice: ${{ steps.build_test_push.outputs.tags_libreoffice }}
|
||||||
|
tags_cloud_run: ${{ steps.build_test_push.outputs.tags_cloud_run }}
|
||||||
|
tags_cloud_run_chromium: ${{ steps.build_test_push.outputs.tags_cloud_run_chromium }}
|
||||||
|
tags_cloud_run_libreoffice: ${{ steps.build_test_push.outputs.tags_cloud_run_libreoffice }}
|
||||||
|
tags_aws_lambda: ${{ steps.build_test_push.outputs.tags_aws_lambda }}
|
||||||
|
tags_aws_lambda_chromium: ${{ steps.build_test_push.outputs.tags_aws_lambda_chromium }}
|
||||||
|
tags_aws_lambda_libreoffice: ${{ steps.build_test_push.outputs.tags_aws_lambda_libreoffice }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Build, test and push
|
||||||
|
id: build_test_push
|
||||||
|
uses: ./.github/actions/build-test-push
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
version: pr-${{ github.event.pull_request.number }}
|
||||||
|
platform: linux/arm64
|
||||||
|
alternate_repository: snapshot
|
||||||
|
|
||||||
|
snapshot_arm_v7:
|
||||||
|
if: github.event_name == 'pull_request'
|
||||||
|
needs:
|
||||||
|
- test-unit
|
||||||
|
name: Snapshot linux/arm/v7
|
||||||
|
runs-on: ubuntu-24.04-arm
|
||||||
|
outputs:
|
||||||
|
tags: ${{ steps.build_test_push.outputs.tags }}
|
||||||
|
tags_chromium: ${{ steps.build_test_push.outputs.tags_chromium }}
|
||||||
|
tags_libreoffice: ${{ steps.build_test_push.outputs.tags_libreoffice }}
|
||||||
|
tags_cloud_run: ${{ steps.build_test_push.outputs.tags_cloud_run }}
|
||||||
|
tags_cloud_run_chromium: ${{ steps.build_test_push.outputs.tags_cloud_run_chromium }}
|
||||||
|
tags_cloud_run_libreoffice: ${{ steps.build_test_push.outputs.tags_cloud_run_libreoffice }}
|
||||||
|
tags_aws_lambda: ${{ steps.build_test_push.outputs.tags_aws_lambda }}
|
||||||
|
tags_aws_lambda_chromium: ${{ steps.build_test_push.outputs.tags_aws_lambda_chromium }}
|
||||||
|
tags_aws_lambda_libreoffice: ${{ steps.build_test_push.outputs.tags_aws_lambda_libreoffice }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Build, test and push
|
||||||
|
id: build_test_push
|
||||||
|
uses: ./.github/actions/build-test-push
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
version: pr-${{ github.event.pull_request.number }}
|
||||||
|
platform: linux/arm/v7
|
||||||
|
alternate_repository: snapshot
|
||||||
|
|
||||||
|
merge_clean_snapshot_guard:
|
||||||
|
needs:
|
||||||
|
- snapshot_amd64
|
||||||
|
- snapshot_386
|
||||||
|
- snapshot_ppc64le
|
||||||
|
- snapshot_arm64
|
||||||
|
- snapshot_arm_v7
|
||||||
|
name: Secrets access check
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
continue: ${{ steps.check.outputs.continue }}
|
||||||
|
steps:
|
||||||
|
- name: Check
|
||||||
|
id: check
|
||||||
|
run: |
|
||||||
|
if [ -n "${{ secrets.DOCKERHUB_USERNAME }}" ]; then
|
||||||
|
echo "continue=true" >> "$GITHUB_OUTPUT"
|
||||||
|
else
|
||||||
|
echo "continue=false" >> "$GITHUB_OUTPUT"
|
||||||
|
fi
|
||||||
|
|
||||||
|
merge_clean_snapshot_tags:
|
||||||
|
if: needs.merge_clean_snapshot_guard.outputs.continue == 'true'
|
||||||
|
needs:
|
||||||
|
- merge_clean_snapshot_guard
|
||||||
|
- snapshot_amd64
|
||||||
|
- snapshot_386
|
||||||
|
- snapshot_ppc64le
|
||||||
|
- snapshot_arm64
|
||||||
|
- snapshot_arm_v7
|
||||||
|
name: Merge and clean snapshot tags
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Merge
|
||||||
|
uses: ./.github/actions/merge
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.snapshot_amd64.outputs.tags }},${{ needs.snapshot_386.outputs.tags }},${{ needs.snapshot_ppc64le.outputs.tags }},${{ needs.snapshot_arm64.outputs.tags }},${{ needs.snapshot_arm_v7.outputs.tags }}"
|
||||||
|
|
||||||
|
- name: Merge Chromium
|
||||||
|
uses: ./.github/actions/merge
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.snapshot_amd64.outputs.tags_chromium }},${{ needs.snapshot_386.outputs.tags_chromium }},${{ needs.snapshot_ppc64le.outputs.tags_chromium }},${{ needs.snapshot_arm64.outputs.tags_chromium }},${{ needs.snapshot_arm_v7.outputs.tags_chromium }}"
|
||||||
|
|
||||||
|
- name: Merge LibreOffice
|
||||||
|
uses: ./.github/actions/merge
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.snapshot_amd64.outputs.tags_libreoffice }},${{ needs.snapshot_386.outputs.tags_libreoffice }},${{ needs.snapshot_ppc64le.outputs.tags_libreoffice }},${{ needs.snapshot_arm64.outputs.tags_libreoffice }},${{ needs.snapshot_arm_v7.outputs.tags_libreoffice }}"
|
||||||
|
|
||||||
|
- name: Merge AWS Lambda
|
||||||
|
uses: ./.github/actions/merge
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.snapshot_amd64.outputs.tags_aws_lambda }},${{ needs.snapshot_arm64.outputs.tags_aws_lambda }}"
|
||||||
|
|
||||||
|
- name: Merge AWS Lambda Chromium
|
||||||
|
uses: ./.github/actions/merge
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.snapshot_amd64.outputs.tags_aws_lambda_chromium }},${{ needs.snapshot_arm64.outputs.tags_aws_lambda_chromium }}"
|
||||||
|
|
||||||
|
- name: Merge AWS Lambda LibreOffice
|
||||||
|
uses: ./.github/actions/merge
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.snapshot_amd64.outputs.tags_aws_lambda_libreoffice }},${{ needs.snapshot_arm64.outputs.tags_aws_lambda_libreoffice }}"
|
||||||
|
|
||||||
|
- name: Clean
|
||||||
|
uses: ./.github/actions/clean
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.snapshot_amd64.outputs.tags }},${{ needs.snapshot_386.outputs.tags }},${{ needs.snapshot_ppc64le.outputs.tags }},${{ needs.snapshot_arm64.outputs.tags }},${{ needs.snapshot_arm_v7.outputs.tags }},${{ needs.snapshot_amd64.outputs.tags_chromium }},${{ needs.snapshot_386.outputs.tags_chromium }},${{ needs.snapshot_ppc64le.outputs.tags_chromium }},${{ needs.snapshot_arm64.outputs.tags_chromium }},${{ needs.snapshot_arm_v7.outputs.tags_chromium }},${{ needs.snapshot_amd64.outputs.tags_libreoffice }},${{ needs.snapshot_386.outputs.tags_libreoffice }},${{ needs.snapshot_ppc64le.outputs.tags_libreoffice }},${{ needs.snapshot_arm64.outputs.tags_libreoffice }},${{ needs.snapshot_arm_v7.outputs.tags_libreoffice }},${{ needs.snapshot_amd64.outputs.tags_aws_lambda }},${{ needs.snapshot_arm64.outputs.tags_aws_lambda }},${{ needs.snapshot_amd64.outputs.tags_aws_lambda_chromium }},${{ needs.snapshot_arm64.outputs.tags_aws_lambda_chromium }},${{ needs.snapshot_amd64.outputs.tags_aws_lambda_libreoffice }},${{ needs.snapshot_arm64.outputs.tags_aws_lambda_libreoffice }}"
|
||||||
|
|
||||||
|
edge_amd64:
|
||||||
|
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
||||||
|
needs:
|
||||||
|
- test-unit
|
||||||
|
name: Edge linux/amd64
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
tags: ${{ steps.build_test_push.outputs.tags }}
|
||||||
|
tags_chromium: ${{ steps.build_test_push.outputs.tags_chromium }}
|
||||||
|
tags_libreoffice: ${{ steps.build_test_push.outputs.tags_libreoffice }}
|
||||||
|
tags_cloud_run: ${{ steps.build_test_push.outputs.tags_cloud_run }}
|
||||||
|
tags_cloud_run_chromium: ${{ steps.build_test_push.outputs.tags_cloud_run_chromium }}
|
||||||
|
tags_cloud_run_libreoffice: ${{ steps.build_test_push.outputs.tags_cloud_run_libreoffice }}
|
||||||
|
tags_aws_lambda: ${{ steps.build_test_push.outputs.tags_aws_lambda }}
|
||||||
|
tags_aws_lambda_chromium: ${{ steps.build_test_push.outputs.tags_aws_lambda_chromium }}
|
||||||
|
tags_aws_lambda_libreoffice: ${{ steps.build_test_push.outputs.tags_aws_lambda_libreoffice }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Build, test and push
|
||||||
|
id: build_test_push
|
||||||
|
uses: ./.github/actions/build-test-push
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
version: edge
|
||||||
|
platform: linux/amd64
|
||||||
|
|
||||||
|
edge_386:
|
||||||
|
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
||||||
|
needs:
|
||||||
|
- test-unit
|
||||||
|
name: Edge linux/386
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
tags: ${{ steps.build_test_push.outputs.tags }}
|
||||||
|
tags_chromium: ${{ steps.build_test_push.outputs.tags_chromium }}
|
||||||
|
tags_libreoffice: ${{ steps.build_test_push.outputs.tags_libreoffice }}
|
||||||
|
tags_cloud_run: ${{ steps.build_test_push.outputs.tags_cloud_run }}
|
||||||
|
tags_cloud_run_chromium: ${{ steps.build_test_push.outputs.tags_cloud_run_chromium }}
|
||||||
|
tags_cloud_run_libreoffice: ${{ steps.build_test_push.outputs.tags_cloud_run_libreoffice }}
|
||||||
|
tags_aws_lambda: ${{ steps.build_test_push.outputs.tags_aws_lambda }}
|
||||||
|
tags_aws_lambda_chromium: ${{ steps.build_test_push.outputs.tags_aws_lambda_chromium }}
|
||||||
|
tags_aws_lambda_libreoffice: ${{ steps.build_test_push.outputs.tags_aws_lambda_libreoffice }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Build, test and push
|
||||||
|
id: build_test_push
|
||||||
|
uses: ./.github/actions/build-test-push
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
version: edge
|
||||||
|
platform: linux/386
|
||||||
|
|
||||||
|
edge_ppc64le:
|
||||||
|
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
||||||
|
needs:
|
||||||
|
- test-unit
|
||||||
|
name: Edge linux/ppc64le
|
||||||
|
runs-on: ubuntu-24.04-ppc64le
|
||||||
|
outputs:
|
||||||
|
tags: ${{ steps.build_test_push.outputs.tags }}
|
||||||
|
tags_chromium: ${{ steps.build_test_push.outputs.tags_chromium }}
|
||||||
|
tags_libreoffice: ${{ steps.build_test_push.outputs.tags_libreoffice }}
|
||||||
|
tags_cloud_run: ${{ steps.build_test_push.outputs.tags_cloud_run }}
|
||||||
|
tags_cloud_run_chromium: ${{ steps.build_test_push.outputs.tags_cloud_run_chromium }}
|
||||||
|
tags_cloud_run_libreoffice: ${{ steps.build_test_push.outputs.tags_cloud_run_libreoffice }}
|
||||||
|
tags_aws_lambda: ${{ steps.build_test_push.outputs.tags_aws_lambda }}
|
||||||
|
tags_aws_lambda_chromium: ${{ steps.build_test_push.outputs.tags_aws_lambda_chromium }}
|
||||||
|
tags_aws_lambda_libreoffice: ${{ steps.build_test_push.outputs.tags_aws_lambda_libreoffice }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Build, test and push
|
||||||
|
id: build_test_push
|
||||||
|
uses: ./.github/actions/build-test-push
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
version: edge
|
||||||
|
platform: linux/ppc64le
|
||||||
|
|
||||||
|
edge_arm64:
|
||||||
|
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
||||||
|
needs:
|
||||||
|
- test-unit
|
||||||
|
name: Edge linux/arm64
|
||||||
|
runs-on: ubuntu-24.04-arm
|
||||||
|
outputs:
|
||||||
|
tags: ${{ steps.build_test_push.outputs.tags }}
|
||||||
|
tags_chromium: ${{ steps.build_test_push.outputs.tags_chromium }}
|
||||||
|
tags_libreoffice: ${{ steps.build_test_push.outputs.tags_libreoffice }}
|
||||||
|
tags_cloud_run: ${{ steps.build_test_push.outputs.tags_cloud_run }}
|
||||||
|
tags_cloud_run_chromium: ${{ steps.build_test_push.outputs.tags_cloud_run_chromium }}
|
||||||
|
tags_cloud_run_libreoffice: ${{ steps.build_test_push.outputs.tags_cloud_run_libreoffice }}
|
||||||
|
tags_aws_lambda: ${{ steps.build_test_push.outputs.tags_aws_lambda }}
|
||||||
|
tags_aws_lambda_chromium: ${{ steps.build_test_push.outputs.tags_aws_lambda_chromium }}
|
||||||
|
tags_aws_lambda_libreoffice: ${{ steps.build_test_push.outputs.tags_aws_lambda_libreoffice }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Build, test and push
|
||||||
|
id: build_test_push
|
||||||
|
uses: ./.github/actions/build-test-push
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
version: edge
|
||||||
|
platform: linux/arm64
|
||||||
|
|
||||||
|
edge_arm_v7:
|
||||||
|
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
||||||
|
needs:
|
||||||
|
- test-unit
|
||||||
|
name: Edge linux/arm/v7
|
||||||
|
runs-on: ubuntu-24.04-arm
|
||||||
|
outputs:
|
||||||
|
tags: ${{ steps.build_test_push.outputs.tags }}
|
||||||
|
tags_chromium: ${{ steps.build_test_push.outputs.tags_chromium }}
|
||||||
|
tags_libreoffice: ${{ steps.build_test_push.outputs.tags_libreoffice }}
|
||||||
|
tags_cloud_run: ${{ steps.build_test_push.outputs.tags_cloud_run }}
|
||||||
|
tags_cloud_run_chromium: ${{ steps.build_test_push.outputs.tags_cloud_run_chromium }}
|
||||||
|
tags_cloud_run_libreoffice: ${{ steps.build_test_push.outputs.tags_cloud_run_libreoffice }}
|
||||||
|
tags_aws_lambda: ${{ steps.build_test_push.outputs.tags_aws_lambda }}
|
||||||
|
tags_aws_lambda_chromium: ${{ steps.build_test_push.outputs.tags_aws_lambda_chromium }}
|
||||||
|
tags_aws_lambda_libreoffice: ${{ steps.build_test_push.outputs.tags_aws_lambda_libreoffice }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Build, test and push
|
||||||
|
id: build_test_push
|
||||||
|
uses: ./.github/actions/build-test-push
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
version: edge
|
||||||
|
platform: linux/arm/v7
|
||||||
|
|
||||||
|
merge_clean_edge_tags:
|
||||||
|
needs:
|
||||||
|
- edge_amd64
|
||||||
|
- edge_386
|
||||||
|
- edge_ppc64le
|
||||||
|
- edge_arm64
|
||||||
|
- edge_arm_v7
|
||||||
|
name: Merge and clean edge tags
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout source code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Merge
|
||||||
|
uses: ./.github/actions/merge
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.edge_amd64.outputs.tags }},${{ needs.edge_386.outputs.tags }},${{ needs.edge_ppc64le.outputs.tags }},${{ needs.edge_arm64.outputs.tags }},${{ needs.edge_arm_v7.outputs.tags }}"
|
||||||
|
|
||||||
|
- name: Merge Chromium
|
||||||
|
uses: ./.github/actions/merge
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.edge_amd64.outputs.tags_chromium }},${{ needs.edge_386.outputs.tags_chromium }},${{ needs.edge_ppc64le.outputs.tags_chromium }},${{ needs.edge_arm64.outputs.tags_chromium }},${{ needs.edge_arm_v7.outputs.tags_chromium }}"
|
||||||
|
|
||||||
|
- name: Merge LibreOffice
|
||||||
|
uses: ./.github/actions/merge
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.edge_amd64.outputs.tags_libreoffice }},${{ needs.edge_386.outputs.tags_libreoffice }},${{ needs.edge_ppc64le.outputs.tags_libreoffice }},${{ needs.edge_arm64.outputs.tags_libreoffice }},${{ needs.edge_arm_v7.outputs.tags_libreoffice }}"
|
||||||
|
|
||||||
|
- name: Merge AWS Lambda
|
||||||
|
uses: ./.github/actions/merge
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.edge_amd64.outputs.tags_aws_lambda }},${{ needs.edge_arm64.outputs.tags_aws_lambda }}"
|
||||||
|
|
||||||
|
- name: Merge AWS Lambda Chromium
|
||||||
|
uses: ./.github/actions/merge
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.edge_amd64.outputs.tags_aws_lambda_chromium }},${{ needs.edge_arm64.outputs.tags_aws_lambda_chromium }}"
|
||||||
|
|
||||||
|
- name: Merge AWS Lambda LibreOffice
|
||||||
|
uses: ./.github/actions/merge
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.edge_amd64.outputs.tags_aws_lambda_libreoffice }},${{ needs.edge_arm64.outputs.tags_aws_lambda_libreoffice }}"
|
||||||
|
|
||||||
|
- name: Clean
|
||||||
|
uses: ./.github/actions/clean
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
tags: "${{ needs.edge_amd64.outputs.tags }},${{ needs.edge_386.outputs.tags }},${{ needs.edge_ppc64le.outputs.tags }},${{ needs.edge_arm64.outputs.tags }},${{ needs.edge_arm_v7.outputs.tags }},${{ needs.edge_amd64.outputs.tags_chromium }},${{ needs.edge_386.outputs.tags_chromium }},${{ needs.edge_ppc64le.outputs.tags_chromium }},${{ needs.edge_arm64.outputs.tags_chromium }},${{ needs.edge_arm_v7.outputs.tags_chromium }},${{ needs.edge_amd64.outputs.tags_libreoffice }},${{ needs.edge_386.outputs.tags_libreoffice }},${{ needs.edge_ppc64le.outputs.tags_libreoffice }},${{ needs.edge_arm64.outputs.tags_libreoffice }},${{ needs.edge_arm_v7.outputs.tags_libreoffice }},${{ needs.edge_amd64.outputs.tags_aws_lambda }},${{ needs.edge_arm64.outputs.tags_aws_lambda }},${{ needs.edge_amd64.outputs.tags_aws_lambda_chromium }},${{ needs.edge_arm64.outputs.tags_aws_lambda_chromium }},${{ needs.edge_amd64.outputs.tags_aws_lambda_libreoffice }},${{ needs.edge_arm64.outputs.tags_aws_lambda_libreoffice }}"
|
||||||
27
.github/workflows/continuous_delivery.yml
vendored
27
.github/workflows/continuous_delivery.yml
vendored
@@ -1,27 +0,0 @@
|
|||||||
name: Continuous Delivery
|
|
||||||
|
|
||||||
on:
|
|
||||||
release:
|
|
||||||
types: [ published ]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
|
|
||||||
release:
|
|
||||||
name: Release Docker image
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@v1
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v1
|
|
||||||
- name: Checkout source code
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
- name: Log in to Docker Hub Container Registry
|
|
||||||
uses: docker/login-action@v1
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
- name: Build and push Docker image
|
|
||||||
run: |
|
|
||||||
make release GOTENBERG_VERSION=${{ github.event.release.tag_name }}
|
|
||||||
make release GOTENBERG_VERSION=${{ github.event.release.tag_name }} DOCKER_REPOSITORY=thecodingmachine
|
|
||||||
43
.github/workflows/continuous_integration.yml
vendored
43
.github/workflows/continuous_integration.yml
vendored
@@ -1,43 +0,0 @@
|
|||||||
name: Continuous Integration
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
|
|
||||||
lint:
|
|
||||||
name: Lint
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout source code
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
- name: Run linters
|
|
||||||
uses: golangci/golangci-lint-action@v2
|
|
||||||
with:
|
|
||||||
version: v1.42
|
|
||||||
|
|
||||||
tests:
|
|
||||||
needs:
|
|
||||||
- Lint
|
|
||||||
name: Tests
|
|
||||||
# TODO: once arm64 actions are available, also run the tests on this architecture.
|
|
||||||
# See: https://github.com/actions/virtual-environments/issues/2552#issuecomment-771478000.
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@v1
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v1
|
|
||||||
- name: Checkout source code
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
- name: Build testing environment
|
|
||||||
run: make build build-tests
|
|
||||||
- name: Run tests
|
|
||||||
run: |
|
|
||||||
make tests-once
|
|
||||||
bash <(curl -s https://codecov.io/bash)
|
|
||||||
24
.github/workflows/pull-request-cleanup.yml
vendored
Normal file
24
.github/workflows/pull-request-cleanup.yml
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
name: Pull Request Cleanup
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [closed]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
cleanup:
|
||||||
|
name: Cleanup Docker images
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
continue-on-error: true
|
||||||
|
steps:
|
||||||
|
- name: Check out code
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
|
||||||
|
- name: Cleanup
|
||||||
|
uses: ./.github/actions/clean
|
||||||
|
with:
|
||||||
|
docker_hub_username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
docker_hub_password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
snapshot_version: pr-${{ github.event.pull_request.number }}
|
||||||
6
.gitignore
vendored
6
.gitignore
vendored
@@ -1,2 +1,4 @@
|
|||||||
/coverage.html
|
.idea
|
||||||
/coverage.txt
|
.vscode
|
||||||
|
.DS_Store
|
||||||
|
/node_modules/
|
||||||
|
|||||||
@@ -1,30 +1,58 @@
|
|||||||
|
version: "2"
|
||||||
|
run:
|
||||||
|
issues-exit-code: 1
|
||||||
|
tests: false
|
||||||
linters:
|
linters:
|
||||||
disable-all: true
|
default: none
|
||||||
enable:
|
enable:
|
||||||
|
- asasalint
|
||||||
|
- asciicheck
|
||||||
|
- bidichk
|
||||||
- bodyclose
|
- bodyclose
|
||||||
- deadcode
|
- copyloopvar
|
||||||
|
- decorder
|
||||||
|
- dogsled
|
||||||
|
- dupl
|
||||||
|
- dupword
|
||||||
|
- durationcheck
|
||||||
- errcheck
|
- errcheck
|
||||||
- gofmt
|
- errname
|
||||||
- goimports
|
- exhaustive
|
||||||
- gosec
|
- gosec
|
||||||
- gosimple
|
|
||||||
- govet
|
- govet
|
||||||
|
- importas
|
||||||
- ineffassign
|
- ineffassign
|
||||||
- misspell
|
- misspell
|
||||||
- prealloc
|
- prealloc
|
||||||
- staticcheck
|
- staticcheck
|
||||||
- structcheck
|
- testableexamples
|
||||||
- typecheck
|
- tparallel
|
||||||
- unconvert
|
- unconvert
|
||||||
- unused
|
- unused
|
||||||
- varcheck
|
- sloglint
|
||||||
|
- usetesting
|
||||||
run:
|
- gocritic
|
||||||
deadline: 5m
|
- wastedassign
|
||||||
issues-exit-code: 1
|
- whitespace
|
||||||
tests: false
|
exclusions:
|
||||||
|
generated: lax
|
||||||
output:
|
presets:
|
||||||
format: 'colored-line-number'
|
- comments
|
||||||
print-issued-lines: true
|
- common-false-positives
|
||||||
print-linter-name: true
|
- legacy
|
||||||
|
- std-error-handling
|
||||||
|
formatters:
|
||||||
|
enable:
|
||||||
|
- gci
|
||||||
|
- gofmt
|
||||||
|
- gofumpt
|
||||||
|
- goimports
|
||||||
|
settings:
|
||||||
|
gci:
|
||||||
|
sections:
|
||||||
|
- standard
|
||||||
|
- default
|
||||||
|
- prefix(github.com/gotenberg/gotenberg/v8)
|
||||||
|
custom-order: true
|
||||||
|
exclusions:
|
||||||
|
generated: lax
|
||||||
|
|||||||
1
.node-version
Normal file
1
.node-version
Normal file
@@ -0,0 +1 @@
|
|||||||
|
24.15.0
|
||||||
1
.prettierignore
Normal file
1
.prettierignore
Normal file
@@ -0,0 +1 @@
|
|||||||
|
build
|
||||||
4
.prettierrc
Normal file
4
.prettierrc
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"plugins": ["prettier-plugin-gherkin", "prettier-plugin-sh"],
|
||||||
|
"escapeBackslashes": true
|
||||||
|
}
|
||||||
195
CONTRIBUTING.md
Normal file
195
CONTRIBUTING.md
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
# Contributing to Gotenberg
|
||||||
|
|
||||||
|
Gotenberg is a Docker-based API for converting documents to PDF. Two rules override everything else:
|
||||||
|
|
||||||
|
- **Backward compatibility.** Never rename or remove CLI flags, environment variables, API form fields, or HTTP endpoints without discussion.
|
||||||
|
- **Defensive programming.** Assume input is malformed, handle errors explicitly, never panic.
|
||||||
|
|
||||||
|
## Toolchain
|
||||||
|
|
||||||
|
- Module: `github.com/gotenberg/gotenberg/v8`
|
||||||
|
- Go: see version in `go.mod`
|
||||||
|
- Docker
|
||||||
|
- Node.js (see `.node-version`), for Prettier linting
|
||||||
|
- [golangci-lint](https://golangci-lint.run/) v2+
|
||||||
|
|
||||||
|
## Before you start
|
||||||
|
|
||||||
|
For non-trivial changes, open an issue or a draft PR first. Describe what needs to change, the proposed solution (files to modify, interface changes, form fields), and which integration test tags are affected.
|
||||||
|
|
||||||
|
One thing per PR. Keep features, bug fixes, and refactoring in separate PRs.
|
||||||
|
|
||||||
|
When adding a feature or route, write the Gherkin scenario before the Go code, and plan to update the Bruno collection (`.bruno/`) if a route changes.
|
||||||
|
|
||||||
|
## Project layout
|
||||||
|
|
||||||
|
```
|
||||||
|
cmd/gotenberg/ -> Entry point only (wiring/startup). No business logic.
|
||||||
|
pkg/gotenberg/ -> Core module system, interfaces, utilities, mocks.
|
||||||
|
pkg/modules/ -> Feature modules (api, chromium, libreoffice, pdfengines, etc.).
|
||||||
|
pkg/standard/ -> Wires all standard modules together via imports.
|
||||||
|
test/integration/ -> Gherkin feature files + Go test infrastructure.
|
||||||
|
build/ -> Dockerfile, fonts, Chromium config.
|
||||||
|
.bruno/ -> Bruno API collection (mirrors every route).
|
||||||
|
```
|
||||||
|
|
||||||
|
Key interfaces live in `pkg/gotenberg/`: `Module`, `Provisioner`, `Validator`, `Debuggable`. Every module implements `Descriptor()` and self-registers via `init()`.
|
||||||
|
|
||||||
|
## Setup and Makefile
|
||||||
|
|
||||||
|
All build and verification tasks go through the Makefile. Do not run `go` commands directly unless debugging a specific package.
|
||||||
|
|
||||||
|
| Command | Purpose | When to use |
|
||||||
|
| ----------------------- | ------------------------------------------------ | ------------------------------------------------------------------------ |
|
||||||
|
| `make build` | Build the Gotenberg Docker image | Before integration tests or manual testing |
|
||||||
|
| `make run` | Run a Gotenberg container via `docker compose` | Manual testing. Flags configured via Makefile variables and compose.yaml |
|
||||||
|
| `make telemetry` | Start an OpenTelemetry collector and OpenObserve | When testing telemetry locally |
|
||||||
|
| `make down` | Stop all compose containers | After manual testing |
|
||||||
|
| `make godoc` | Serve GoDoc at `localhost:6060` | To verify documentation |
|
||||||
|
| `make fmt` | Format Go code | Before committing |
|
||||||
|
| `make lint` | Lint Go code (zero errors permitted) | Before committing |
|
||||||
|
| `make prettify` | Format non-Go files (Markdown, YAML, JSON) | Before committing |
|
||||||
|
| `make lint-prettier` | Lint non-Go files | Before committing |
|
||||||
|
| `make test-unit` | Run unit tests | Before committing |
|
||||||
|
| `make test-integration` | Run all integration tests (40 min timeout) | Before committing |
|
||||||
|
|
||||||
|
Run only the integration test tag(s) relevant to your change rather than the full suite:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make test-integration TAGS=health
|
||||||
|
make test-integration TAGS=chromium-convert-html
|
||||||
|
make test-integration TAGS="merge,split"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Code conventions
|
||||||
|
|
||||||
|
### Module system
|
||||||
|
|
||||||
|
Gotenberg uses a self-registering module architecture inspired by CaddyServer. Each module lives in `pkg/modules/<name>/`, implements at minimum `gotenberg.Module` (`Descriptor()`), and self-registers via `init()`. Wiring happens through `pkg/standard/`.
|
||||||
|
|
||||||
|
Determine if a feature belongs in an existing module before creating a new one. Only create a new module for a genuinely separate concern.
|
||||||
|
|
||||||
|
The `cmd/gotenberg/` package is strictly for wiring and startup. No business logic.
|
||||||
|
|
||||||
|
### Backward compatibility
|
||||||
|
|
||||||
|
CLI flags, environment variables, API form fields, HTTP endpoints, and default values that alter existing behavior must not change without discussion. Deprecate old names with `fs.MarkDeprecated()` and register both the old and new names side by side.
|
||||||
|
|
||||||
|
If a change violates backward compatibility, flag it as a breaking change in the PR description.
|
||||||
|
|
||||||
|
### Error handling
|
||||||
|
|
||||||
|
- Wrap every error with context: `fmt.Errorf("description: %w", err)`.
|
||||||
|
- Never swallow errors silently.
|
||||||
|
- Match errors with `errors.Is`, never `strings.Contains`.
|
||||||
|
- No panics in production code paths.
|
||||||
|
- Validate input defensively.
|
||||||
|
|
||||||
|
### Error messages
|
||||||
|
|
||||||
|
Client- and operator-facing error messages state what failed, why when non-obvious, and how to fix it when a fix exists. Internal errors (the wrapped `fmt.Errorf` chains that only reach logs) are exempt; keep them precise and technical.
|
||||||
|
|
||||||
|
- Client (HTTP response body): name the offending form field and its valid values. Never return a bare `http.StatusText()`.
|
||||||
|
- Operator (startup, `Provision`, `Validate`): name the environment variable or flag to set, plus the path or value checked.
|
||||||
|
- Security and filtering errors stay generic for clients. Don't reveal allow/deny lists or private-IP policy. Log the specific reason for operators.
|
||||||
|
- No hedging ("while others may have failed"). No raw `os.Stat` or exec output in the human-facing remedy.
|
||||||
|
|
||||||
|
### Logging
|
||||||
|
|
||||||
|
Use `gotenberg.Logger(mod)` to get the module's slog logger during `Provision()`. All log calls must be context-aware: `logger.DebugContext(ctx, msg)`, `logger.InfoContext(ctx, msg)`, `logger.ErrorContext(ctx, msg)`. This propagates trace/span IDs into structured logs when OpenTelemetry is active.
|
||||||
|
|
||||||
|
### Telemetry
|
||||||
|
|
||||||
|
External tool calls (Chromium, LibreOffice, PDF engines, webhooks, downloads) must create OTEL spans with `trace.SpanKindClient` and `semconv.ServerAddress("toolname")`. Use `gotenberg.Tracer()` and `gotenberg.Meter()` for traces and metrics.
|
||||||
|
|
||||||
|
### Import ordering
|
||||||
|
|
||||||
|
Enforced by `gci`: standard library, then third-party, then `github.com/gotenberg/gotenberg/v8`. Three groups separated by blank lines.
|
||||||
|
|
||||||
|
## Documentation conventions
|
||||||
|
|
||||||
|
### Tone
|
||||||
|
|
||||||
|
- Short, declarative sentences. Say what it does, then stop.
|
||||||
|
- Lead with the action. "Validates font embedding", not "This function validates font embedding".
|
||||||
|
- Active voice. "Gotenberg checks the profile", not "The profile is checked by Gotenberg".
|
||||||
|
- No em dashes. Use a period, colon, or comma.
|
||||||
|
- No "we" hedging. "Don't...", not "We do not recommend...".
|
||||||
|
|
||||||
|
### Godoc
|
||||||
|
|
||||||
|
Every exported type and function has a Godoc comment starting with its identifier name:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// OutboundDecision is the result of validating an outbound URL via
|
||||||
|
// [DecideOutbound]. ...
|
||||||
|
type OutboundDecision struct { ... }
|
||||||
|
|
||||||
|
// DialPinned dials each addr in turn until one connects, returning the
|
||||||
|
// first successful connection or the last error. ...
|
||||||
|
func DialPinned(ctx context.Context, network string, addrs []netip.Addr, port string) (net.Conn, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
Each package should have a `doc.go` with a `// Package foo ...` comment:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Package api manages a LibreOffice instance via the UNO API.
|
||||||
|
package api
|
||||||
|
```
|
||||||
|
|
||||||
|
Reference identifiers with `[Name]` brackets for pkg.go.dev linking:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Callers pass the Pinned slice from [OutboundDecision] so that the dial
|
||||||
|
// targets exactly the IPs that [DecideOutbound] resolved, preventing DNS
|
||||||
|
// rebinding between validation and connect.
|
||||||
|
```
|
||||||
|
|
||||||
|
### Code comments
|
||||||
|
|
||||||
|
- Explain _why_, not _what_.
|
||||||
|
- No numbered step comments (`// 1. Do X`, `// 2. Do Y`).
|
||||||
|
- No section dividers with numbers (`// --- 8. Foo ---`). Plain dividers are fine for major boundaries.
|
||||||
|
- No noise comments that restate the code (`// Check if err is nil`, `// Return results`).
|
||||||
|
- Reference spec clauses where relevant (`// Per ISO 32000-2, Table 116...`).
|
||||||
|
- Mark debt with `// TODO: [context]`.
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
### Unit tests
|
||||||
|
|
||||||
|
Table-driven tests in `*_test.go` files. Use the comprehensive mock implementations in `pkg/gotenberg/mocks.go` rather than rolling new ones.
|
||||||
|
|
||||||
|
### Integration tests
|
||||||
|
|
||||||
|
Gherkin (BDD) via Godog with `testcontainers-go` for Docker orchestration. Feature files live in `test/integration/features/`; step definitions live in `test/integration/scenario/`. Read `scenario.go` and `containers.go` before writing new tests.
|
||||||
|
|
||||||
|
`make build` is required before running integration tests. The full suite has a 40-minute timeout, so run only the tag(s) relevant to your change.
|
||||||
|
|
||||||
|
## Pull requests
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
|
||||||
|
[Conventional Commits](https://www.conventionalcommits.org/): `<type>(<scope>): <description>`.
|
||||||
|
|
||||||
|
Common types: `feat`, `fix`, `refactor`, `test`, `docs`, `chore`, `ci`, `build`. The scope matches the module or area of the change (e.g., `chromium`, `pdfengines`, `api`).
|
||||||
|
|
||||||
|
Stage specific files. Never `git add -A` or `git add .`.
|
||||||
|
|
||||||
|
### Checklist
|
||||||
|
|
||||||
|
Before opening the PR, confirm:
|
||||||
|
|
||||||
|
- [ ] No backward-compatibility regression. See [Backward compatibility](#backward-compatibility).
|
||||||
|
- [ ] Code conventions met (error wrapping, logging, telemetry, import ordering, no panics, no business logic in `cmd/`). See [Code conventions](#code-conventions).
|
||||||
|
- [ ] Documentation conventions met (Godoc on every exported identifier, `doc.go` for new packages, tone). See [Documentation conventions](#documentation-conventions).
|
||||||
|
- [ ] `make fmt && make lint && make prettify && make lint-prettier` pass with zero warnings.
|
||||||
|
- [ ] `make test-unit` passes.
|
||||||
|
- [ ] Relevant `make test-integration TAGS=...` passes.
|
||||||
|
- [ ] Bruno collection updated if routes were added or modified.
|
||||||
|
|
||||||
|
## Further reading
|
||||||
|
|
||||||
|
- [`test/integration/README.md`](test/integration/README.md) — Gherkin step reference, available tags, writing new tests.
|
||||||
|
- [`.bruno/README.md`](.bruno/README.md) — `.bru` file format, conventions, route update checklist.
|
||||||
|
- [`pkg/modules/pdfengines/README.md`](pkg/modules/pdfengines/README.md) — adding new engine features (Makefile variable and flag).
|
||||||
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
|||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2021 Julien Neuhart
|
Copyright (c) Julien Neuhart
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
297
Makefile
297
Makefile
@@ -1,145 +1,220 @@
|
|||||||
|
include .env
|
||||||
|
|
||||||
.PHONY: help
|
.PHONY: help
|
||||||
help: ## Show the help
|
help: ## Show the help
|
||||||
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
|
@grep -hE '^[A-Za-z0-9_ \-]*?:.*##.*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
|
||||||
|
|
||||||
.PHONY: it
|
|
||||||
it: build build-tests ## Initialize the development environment
|
|
||||||
|
|
||||||
GOLANG_VERSION=1.17
|
|
||||||
DOCKER_REPOSITORY=gotenberg
|
|
||||||
GOTENBERG_VERSION=snapshot
|
|
||||||
GOTENBERG_USER_GID=1001
|
|
||||||
GOTENBERG_USER_UID=1001
|
|
||||||
NOTO_COLOR_EMOJI_VERSION=v2.028 # See https://github.com/googlefonts/noto-emoji/releases.
|
|
||||||
PDFTK_VERSION=1527259628 # See https://gitlab.com/pdftk-java/pdftk/-/releases - Binary package.
|
|
||||||
GOLANGCI_LINT_VERSION=v1.42.1 # See https://github.com/golangci/golangci-lint/releases.
|
|
||||||
|
|
||||||
.PHONY: build
|
.PHONY: build
|
||||||
build: ## Build the Gotenberg's Docker image
|
build: ## Build the Gotenberg's Docker image (use TARGET=gotenberg-chromium or TARGET=gotenberg-libreoffice for variants)
|
||||||
docker build \
|
docker build \
|
||||||
--build-arg GOLANG_VERSION=$(GOLANG_VERSION) \
|
--target $(TARGET) \
|
||||||
--build-arg GOTENBERG_VERSION=$(GOTENBERG_VERSION) \
|
-t $(DOCKER_REGISTRY)/$(DOCKER_REPOSITORY):$(GOTENBERG_VERSION) \
|
||||||
--build-arg GOTENBERG_USER_GID=$(GOTENBERG_USER_GID) \
|
-f $(DOCKERFILE) $(DOCKER_BUILD_CONTEXT)
|
||||||
--build-arg GOTENBERG_USER_UID=$(GOTENBERG_USER_UID) \
|
|
||||||
--build-arg NOTO_COLOR_EMOJI_VERSION=$(NOTO_COLOR_EMOJI_VERSION) \
|
|
||||||
--build-arg PDFTK_VERSION=$(PDFTK_VERSION) \
|
|
||||||
-t $(DOCKER_REPOSITORY)/gotenberg:$(GOTENBERG_VERSION) \
|
|
||||||
-f build/Dockerfile .
|
|
||||||
|
|
||||||
|
TZ=UTC
|
||||||
|
GOTENBERG_HIDE_BANNER=false
|
||||||
GOTENBERG_GRACEFUL_SHUTDOWN_DURATION=30s
|
GOTENBERG_GRACEFUL_SHUTDOWN_DURATION=30s
|
||||||
|
GOTENBERG_BUILD_DEBUG_DATA=true
|
||||||
API_PORT=3000
|
API_PORT=3000
|
||||||
API_PORT_FROM_ENV=
|
API_PORT_FROM_ENV=
|
||||||
API_READ_TIMEOUT=30s
|
API_BIND_IP=
|
||||||
API_PROCESS_TIMEOUT=30s
|
API_TLS_CERT_FILE=
|
||||||
API_WRITE_TIMEOUT=30s
|
API_TLS_KEY_FILE=
|
||||||
|
API_START_TIMEOUT=30s
|
||||||
|
API_TIMEOUT=30s
|
||||||
|
API_BODY_LIMIT=
|
||||||
API_ROOT_PATH=/
|
API_ROOT_PATH=/
|
||||||
API_TRACE_HEADER=Gotenberg-Trace
|
API_CORRELATION_ID_HEADER=Gotenberg-Trace
|
||||||
API_DISABLE_HEALTH_CHECK_LOGGING=false
|
API_ENABLE_BASIC_AUTH=false
|
||||||
CHROMIUM_USER_AGENT=
|
GOTENBERG_API_BASIC_AUTH_USERNAME=
|
||||||
CHROMIUM_INCOGNITO=false
|
GOTENBERG_API_BASIC_AUTH_PASSWORD=
|
||||||
|
API_DOWNLOAD_FROM_ALLOW_LIST=
|
||||||
|
API_DOWNLOAD_FROM_DENY_LIST=^https?://(10\.|172\.(1[6-9]|2[0-9]|3[01])\.|192\.168\.|169\.254\.|0\.0\.0\.0|127\.|localhost|\[::1\]|\[fd)
|
||||||
|
API_DOWNLOAD_FROM_DENY_PRIVATE_IPS=false
|
||||||
|
API_DOWNLOAD_FROM_DENY_PUBLIC_IPS=false
|
||||||
|
API_DOWNLOAD_FROM_ENABLE_ENVIRONMENT_PROXY=false
|
||||||
|
API_DOWNLOAD_FROM_MAX_RETRY=4
|
||||||
|
API_DISABLE_DOWNLOAD_FROM=false
|
||||||
|
API_DISABLE_HEALTH_CHECK_ROUTE_TELEMETRY=true
|
||||||
|
API_DISABLE_ROOT_ROUTE_TELEMETRY=true
|
||||||
|
API_DISABLE_DEBUG_ROUTE_TELEMETRY=true
|
||||||
|
API_DISABLE_VERSION_ROUTE_TELEMETRY=true
|
||||||
|
API_ENABLE_DEBUG_ROUTE=false
|
||||||
|
CHROMIUM_RESTART_AFTER=100
|
||||||
|
CHROMIUM_MAX_QUEUE_SIZE=0
|
||||||
|
CHROMIUM_IDLE_SHUTDOWN_TIMEOUT=0
|
||||||
|
CHROMIUM_MAX_CONCURRENCY=6
|
||||||
|
CHROMIUM_AUTO_START=false
|
||||||
|
CHROMIUM_START_TIMEOUT=20s
|
||||||
|
CHROMIUM_ALLOW_INSECURE_LOCALHOST=false
|
||||||
CHROMIUM_IGNORE_CERTIFICATE_ERRORS=false
|
CHROMIUM_IGNORE_CERTIFICATE_ERRORS=false
|
||||||
|
CHROMIUM_DISABLE_WEB_SECURITY=false
|
||||||
CHROMIUM_ALLOW_FILE_ACCESS_FROM_FILES=false
|
CHROMIUM_ALLOW_FILE_ACCESS_FROM_FILES=false
|
||||||
|
CHROMIUM_HOST_RESOLVER_RULES=
|
||||||
|
CHROMIUM_PROXY_SERVER=
|
||||||
|
CHROMIUM_ENABLE_ENVIRONMENT_PROXY=false
|
||||||
CHROMIUM_ALLOW_LIST=
|
CHROMIUM_ALLOW_LIST=
|
||||||
CHROMIUM_DENY_LIST="^file:///[^tmp].*"
|
CHROMIUM_DENY_LIST=^file:(?!//\/tmp/).*
|
||||||
|
CHROMIUM_DENY_PRIVATE_IPS=false
|
||||||
|
CHROMIUM_DENY_PUBLIC_IPS=false
|
||||||
|
CHROMIUM_CLEAR_CACHE=false
|
||||||
|
CHROMIUM_CLEAR_COOKIES=false
|
||||||
|
CHROMIUM_DISABLE_JAVASCRIPT=false
|
||||||
CHROMIUM_DISABLE_ROUTES=false
|
CHROMIUM_DISABLE_ROUTES=false
|
||||||
LIBREOFFICE_DISABLES_ROUTES=false
|
LIBREOFFICE_RESTART_AFTER=10
|
||||||
|
LIBREOFFICE_MAX_QUEUE_SIZE=0
|
||||||
|
LIBREOFFICE_IDLE_SHUTDOWN_TIMEOUT=0
|
||||||
|
LIBREOFFICE_AUTO_START=false
|
||||||
|
LIBREOFFICE_START_TIMEOUT=20s
|
||||||
|
LIBREOFFICE_ALLOW_LIST=
|
||||||
|
LIBREOFFICE_DENY_LIST=
|
||||||
|
LIBREOFFICE_DENY_PRIVATE_IPS=false
|
||||||
|
LIBREOFFICE_DENY_PUBLIC_IPS=false
|
||||||
|
LIBREOFFICE_ENABLE_ENVIRONMENT_PROXY=false
|
||||||
|
LIBREOFFICE_DISABLE_ROUTES=false
|
||||||
LOG_LEVEL=info
|
LOG_LEVEL=info
|
||||||
LOG_FORMAT=auto
|
LOG_FIELDS_PREFIX=
|
||||||
PDFENGINES_ENGINES=
|
LOG_STD_FORMAT=auto
|
||||||
|
LOG_STD_ENABLE_GCP_FIELDS=false
|
||||||
|
LOG_STD_LEVEL_CASE=lower
|
||||||
PDFENGINES_DISABLE_ROUTES=false
|
PDFENGINES_DISABLE_ROUTES=false
|
||||||
|
PDFENGINES_MERGE_ENGINES=qpdf,pdfcpu,pdftk
|
||||||
|
PDFENGINES_SPLIT_ENGINES=pdfcpu,qpdf,pdftk
|
||||||
|
PDFENGINES_FLATTEN_ENGINES=qpdf
|
||||||
|
PDFENGINES_CONVERT_ENGINES=libreoffice-pdfengine
|
||||||
|
PDFENGINES_READ_METADATA_ENGINES=exiftool
|
||||||
|
PDFENGINES_WRITE_METADATA_ENGINES=exiftool
|
||||||
|
PDFENGINES_READ_BOOKMARKS_ENGINES=pdfcpu
|
||||||
|
PDFENGINES_WRITE_BOOKMARKS_ENGINES=pdfcpu
|
||||||
|
PDFENGINES_WATERMARK_ENGINES=pdfcpu,pdftk
|
||||||
|
PDFENGINES_STAMP_ENGINES=pdfcpu,pdftk
|
||||||
|
PDFENGINES_ENCRYPT_ENGINES=qpdf,pdfcpu,pdftk
|
||||||
|
PDFENGINES_ROTATE_ENGINES=pdfcpu,pdftk
|
||||||
|
PDFENGINES_EMBED_ENGINES=qpdf,pdfcpu
|
||||||
|
PDFENGINES_EMBED_METADATA_ENGINES=qpdf
|
||||||
|
PDFENGINES_FACTUR_X_ENGINES=qpdf
|
||||||
PROMETHEUS_NAMESPACE=gotenberg
|
PROMETHEUS_NAMESPACE=gotenberg
|
||||||
PROMETHEUS_COLLECT_INTERVAL=1s
|
PROMETHEUS_COLLECT_INTERVAL=1s
|
||||||
PROMETHEUS_DISABLE_ROUTE_LOGGING=false
|
PROMETHEUS_DISABLE_ROUTE_TELEMETRY=true
|
||||||
PROMETHEUS_DISABLE_COLLECT=false
|
PROMETHEUS_DISABLE_COLLECT=false
|
||||||
|
PROMETHEUS_METRICS_PATH=/prometheus/metrics
|
||||||
|
OTEL_SERVICE_NAME=gotenberg
|
||||||
|
OTEL_TRACES_EXPORTER=none
|
||||||
|
OTEL_METRICS_EXPORTER=none
|
||||||
|
OTEL_LOGS_EXPORTER=none
|
||||||
|
OTEL_EXPORTER_OTLP_PROTOCOL=grpc
|
||||||
|
OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
|
||||||
|
OTEL_EXPORTER_OTLP_INSECURE=true
|
||||||
|
WEBHOOK_ENABLE_SYNC_MODE=false
|
||||||
WEBHOOK_ALLOW_LIST=
|
WEBHOOK_ALLOW_LIST=
|
||||||
WEBHOOK_DENY_LIST=
|
WEBHOOK_DENY_LIST=^https?://(10\.|172\.(1[6-9]|2[0-9]|3[01])\.|192\.168\.|169\.254\.|0\.0\.0\.0|127\.|localhost|\[::1\]|\[fd)
|
||||||
WEBHOOK_ERROR_ALLOW_LIST=
|
WEBHOOK_DENY_PRIVATE_IPS=false
|
||||||
WEBHOOK_ERROR_DENY_LIST=
|
WEBHOOK_DENY_PUBLIC_IPS=false
|
||||||
|
WEBHOOK_ENABLE_ENVIRONMENT_PROXY=false
|
||||||
WEBHOOK_MAX_RETRY=4
|
WEBHOOK_MAX_RETRY=4
|
||||||
WEBHOOK_RETRY_MIN_WAIT=1s
|
WEBHOOK_RETRY_MIN_WAIT=1s
|
||||||
WEBHOOK_RETRY_MAX_WAIT=30s
|
WEBHOOK_RETRY_MAX_WAIT=30s
|
||||||
|
WEBHOOK_CLIENT_TIMEOUT=30s
|
||||||
WEBHOOK_DISABLE=false
|
WEBHOOK_DISABLE=false
|
||||||
|
|
||||||
|
# Export all variables so they are available to Compose
|
||||||
|
export
|
||||||
|
|
||||||
.PHONY: run
|
.PHONY: run
|
||||||
run: ## Start a Gotenberg container
|
run: ## Start a Gotenberg container via Compose
|
||||||
docker run --rm -it \
|
docker compose up gotenberg
|
||||||
-p $(API_PORT):$(API_PORT) \
|
|
||||||
$(DOCKER_REPOSITORY)/gotenberg:$(GOTENBERG_VERSION) \
|
|
||||||
gotenberg \
|
|
||||||
--gotenberg-graceful-shutdown-duration=$(GOTENBERG_GRACEFUL_SHUTDOWN_DURATION) \
|
|
||||||
--api-port=$(API_PORT) \
|
|
||||||
--api-port-from-env=$(API_PORT_FROM_ENV) \
|
|
||||||
--api-read-timeout=$(API_READ_TIMEOUT) \
|
|
||||||
--api-process-timeout=$(API_PROCESS_TIMEOUT) \
|
|
||||||
--api-write-timeout=$(API_WRITE_TIMEOUT) \
|
|
||||||
--api-root-path=$(API_ROOT_PATH) \
|
|
||||||
--api-trace-header=$(API_TRACE_HEADER) \
|
|
||||||
--api-disable-health-check-logging=$(API_DISABLE_HEALTH_CHECK_LOGGING) \
|
|
||||||
--chromium-user-agent=$(CHROMIUM_USER_AGENT) \
|
|
||||||
--chromium-incognito=$(CHROMIUM_INCOGNITO) \
|
|
||||||
--chromium-ignore-certificate-errors=$(CHROMIUM_IGNORE_CERTIFICATE_ERRORS) \
|
|
||||||
--chromium-allow-file-access-from-files=$(CHROMIUM_ALLOW_FILE_ACCESS_FROM_FILES) \
|
|
||||||
--chromium-allow-list=$(CHROMIUM_ALLOW_LIST) \
|
|
||||||
--chromium-deny-list=$(CHROMIUM_DENY_LIST) \
|
|
||||||
--chromium-disable-routes=$(CHROMIUM_DISABLE_ROUTES) \
|
|
||||||
--libreoffice-disable-routes=$(LIBREOFFICE_DISABLES_ROUTES) \
|
|
||||||
--log-level=$(LOG_LEVEL) \
|
|
||||||
--log-format=$(LOG_FORMAT) \
|
|
||||||
--pdfengines-engines=$(PDFENGINES_ENGINES) \
|
|
||||||
--pdfengines-disable-routes=$(PDFENGINES_DISABLE_ROUTES) \
|
|
||||||
--prometheus-namespace=$(PROMETHEUS_NAMESPACE) \
|
|
||||||
--prometheus-collect-interval=$(PROMETHEUS_COLLECT_INTERVAL) \
|
|
||||||
--prometheus-disable-route-logging=$(PROMETHEUS_DISABLE_ROUTE_LOGGING) \
|
|
||||||
--prometheus-disable-collect=$(PROMETHEUS_DISABLE_COLLECT) \
|
|
||||||
--webhook-allow-list=$(WEBHOOK_ALLOW_LIST) \
|
|
||||||
--webhook-deny-list=$(WEBHOOK_DENY_LIST) \
|
|
||||||
--webhook-error-allow-list=$(WEBHOOK_ERROR_ALLOW_LIST) \
|
|
||||||
--webhook-error-deny-list=$(WEBHOOK_ERROR_DENY_LIST) \
|
|
||||||
--webhook-max-retry=$(WEBHOOK_MAX_RETRY) \
|
|
||||||
--webhook-retry-min-wait=$(WEBHOOK_RETRY_MIN_WAIT) \
|
|
||||||
--webhook-retry-max-wait=$(WEBHOOK_RETRY_MAX_WAIT) \
|
|
||||||
--webhook-disable=$(WEBHOOK_DISABLE)
|
|
||||||
|
|
||||||
.PHONY: build-tests
|
.PHONY: telemetry
|
||||||
build-tests: ## Build the tests' Docker image
|
telemetry: ## Start an OpenTelemetry collector and OpenObserve containers via Compose
|
||||||
docker build \
|
docker compose up otel-collector openobserve
|
||||||
--build-arg GOLANG_VERSION=$(GOLANG_VERSION) \
|
|
||||||
--build-arg DOCKER_REPOSITORY=$(DOCKER_REPOSITORY) \
|
|
||||||
--build-arg GOTENBERG_VERSION=$(GOTENBERG_VERSION) \
|
|
||||||
--build-arg GOLANGCI_LINT_VERSION=$(GOLANGCI_LINT_VERSION) \
|
|
||||||
-t $(DOCKER_REPOSITORY)/gotenberg:$(GOTENBERG_VERSION)-tests \
|
|
||||||
-f test/Dockerfile .
|
|
||||||
|
|
||||||
.PHONY: tests
|
.PHONY: down
|
||||||
tests: ## Start the testing environment
|
down: ## Stop all containers
|
||||||
docker run --rm -it \
|
docker compose down -v
|
||||||
-v $(PWD):/tests \
|
|
||||||
$(DOCKER_REPOSITORY)/gotenberg:$(GOTENBERG_VERSION)-tests \
|
|
||||||
bash
|
|
||||||
|
|
||||||
.PHONY: tests-once
|
.PHONY: test-unit
|
||||||
tests-once: ## Run the tests once (prefer the "tests" command while developing)
|
test-unit: ## Run unit tests
|
||||||
docker run --rm \
|
go test -race ./...
|
||||||
-v $(PWD):/tests \
|
|
||||||
$(DOCKER_REPOSITORY)/gotenberg:$(GOTENBERG_VERSION)-tests \
|
PLATFORM=
|
||||||
gotest
|
NO_CONCURRENCY=false
|
||||||
|
# Available tags:
|
||||||
|
# chromium
|
||||||
|
# chromium-concurrent
|
||||||
|
# chromium-convert-html
|
||||||
|
# chromium-convert-markdown
|
||||||
|
# chromium-convert-url
|
||||||
|
# chromium-screenshot-html
|
||||||
|
# chromium-screenshot-markdown
|
||||||
|
# chromium-screenshot-url
|
||||||
|
# debug
|
||||||
|
# health
|
||||||
|
# libreoffice
|
||||||
|
# libreoffice-convert
|
||||||
|
# output-filename
|
||||||
|
# pdfengines
|
||||||
|
# pdfengines-convert
|
||||||
|
# pdfengines-embed
|
||||||
|
# embed
|
||||||
|
# pdfengines-encrypt
|
||||||
|
# encrypt
|
||||||
|
# pdfengines-flatten
|
||||||
|
# flatten
|
||||||
|
# pdfengines-merge
|
||||||
|
# merge
|
||||||
|
# pdfengines-metadata
|
||||||
|
# metadata
|
||||||
|
# pdfengines-split
|
||||||
|
# split
|
||||||
|
# pdfengines-watermark
|
||||||
|
# watermark
|
||||||
|
# pdfengines-stamp
|
||||||
|
# stamp
|
||||||
|
# pdfengines-rotate
|
||||||
|
# rotate
|
||||||
|
# factur-x
|
||||||
|
# pdfengines-bookmarks
|
||||||
|
# bookmarks
|
||||||
|
# prometheus-metrics
|
||||||
|
# root
|
||||||
|
# version
|
||||||
|
# webhook
|
||||||
|
# download-from
|
||||||
|
TAGS=
|
||||||
|
|
||||||
|
.PHONY: test-integration
|
||||||
|
test-integration: ## Run integration tests (automatically retries failed scenarios up to 3 times)
|
||||||
|
go test -timeout 40m -tags=integration -v github.com/gotenberg/gotenberg/v8/test/integration -args \
|
||||||
|
--gotenberg-docker-repository=$(DOCKER_REPOSITORY) \
|
||||||
|
--gotenberg-version=$(GOTENBERG_VERSION) \
|
||||||
|
--gotenberg-container-platform=$(PLATFORM) \
|
||||||
|
--no-concurrency=$(NO_CONCURRENCY) \
|
||||||
|
--tags="$(TAGS)"
|
||||||
|
|
||||||
|
.PHONY: lint
|
||||||
|
lint: ## Lint Golang codebase
|
||||||
|
golangci-lint run
|
||||||
|
|
||||||
|
.PHONY: lint-prettier
|
||||||
|
lint-prettier: ## Lint non-Golang codebase
|
||||||
|
npx prettier --check .
|
||||||
|
|
||||||
|
.PHONY: lint-todo
|
||||||
|
lint-todo: ## Find TODOs in Golang codebase
|
||||||
|
golangci-lint run --no-config --disable-all --enable godox
|
||||||
|
|
||||||
.PHONY: fmt
|
.PHONY: fmt
|
||||||
fmt: ## Format the code and "optimize" the dependencies
|
fmt: ## Format Golang codebase and "optimize" the dependencies
|
||||||
go fmt ./...
|
go fix ./...
|
||||||
|
golangci-lint fmt
|
||||||
go mod tidy
|
go mod tidy
|
||||||
|
|
||||||
.PHONY: godoc
|
.PHONY: prettify
|
||||||
godoc: ## Run a webserver with Gotenberg godoc (go get golang.org/x/tools/cmd/godoc)
|
prettify: ## Format non-Golang codebase
|
||||||
$(info http://localhost:6060/pkg/github.com/gotenberg/gotenberg/v7)
|
npx prettier --write .
|
||||||
godoc -http=:6060
|
|
||||||
|
|
||||||
.PHONY: release
|
# go install golang.org/x/tools/cmd/godoc@latest
|
||||||
release: ## Build the Gotenberg's Docker image for many platforms, then push it to a Docker repository
|
.PHONY: godoc
|
||||||
./scripts/release.sh \
|
godoc: ## Run a webserver with Gotenberg godoc
|
||||||
$(GOLANG_VERSION) \
|
$(info http://localhost:6060/pkg/github.com/gotenberg/gotenberg/v8)
|
||||||
$(GOTENBERG_VERSION) \
|
godoc -http=:6060
|
||||||
$(GOTENBERG_USER_GID) \
|
|
||||||
$(GOTENBERG_USER_UID) \
|
|
||||||
$(PDFTK_VERSION) \
|
|
||||||
$(DOCKER_REPOSITORY)
|
|
||||||
|
|||||||
80
README.md
80
README.md
@@ -1,46 +1,72 @@
|
|||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="https://user-images.githubusercontent.com/8983173/130322857-185831e2-f041-46eb-a17f-0a69d066c4e5.png" alt="Gotenberg Logo" width="150" height="150" />
|
<img src="https://raw.githubusercontent.com/gotenberg/art/master/logo.png" alt="Gotenberg Logo" width="150" height="150" />
|
||||||
<h3 align="center">Gotenberg</h3>
|
<h3 align="center">Gotenberg</h3>
|
||||||
<p align="center">A Docker-powered stateless API for PDF files</p>
|
<p align="center">A Docker-based API for converting documents to PDF</p>
|
||||||
<p align="center"><a href="https://gotenberg.dev/docs/about">Documentation</a> · 🔥 <a href="https://gotenberg.dev/docs/get-started/live-demo">Live Demo</a></p>
|
<p align="center">
|
||||||
|
<a href="https://hub.docker.com/r/gotenberg/gotenberg"><img alt="Total downloads (gotenberg/gotenberg)" src="https://img.shields.io/docker/pulls/gotenberg/gotenberg"></a>
|
||||||
|
<a href="https://github.com/gotenberg/gotenberg/actions/workflows/continuous-integration.yml"><img alt="Continuous Integration" src="https://github.com/gotenberg/gotenberg/actions/workflows/continuous-integration.yml/badge.svg"></a>
|
||||||
|
<a href="https://pkg.go.dev/github.com/gotenberg/gotenberg/v8"><img alt="Go Reference" src="https://pkg.go.dev/badge/github.com/gotenberg/gotenberg.svg"></a>
|
||||||
|
</p>
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://trendshift.io/repositories/2996"><img src="https://trendshift.io/api/badge/repositories/2996" alt="gotenberg%2Fgotenberg | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
|
||||||
|
</p>
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://gotenberg.dev/docs/getting-started/introduction"><strong>Documentation</strong></a> ·
|
||||||
|
<a href="https://gotenberg.dev/docs/getting-started/installation#live-demo"><strong>Live Demo</strong></a> ·
|
||||||
|
<a href="https://github.com/gotenberg/gotenberg/discussions"><strong>Community</strong></a>
|
||||||
|
</p>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Gotenberg provides a developer-friendly API to interact with powerful tools like Chromium and LibreOffice to convert many
|
**Gotenberg** is a Docker-based API for converting documents to PDF. Trusted in production by thousands of companies. Also adopted by notable open-source projects.
|
||||||
documents (HTML, Markdown, Word, Excel, etc.) to PDF, transform them, merge them, and more!
|
|
||||||
|
Send your files via `multipart/form-data`, get a PDF back. No need to manage Chromium, LibreOffice, or fonts yourself.
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
Open a terminal and run the following command:
|
```bash
|
||||||
|
docker run --rm -p 3000:3000 gotenberg/gotenberg:8
|
||||||
```
|
|
||||||
docker run --rm -p 3000:3000 gotenberg/gotenberg:7
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Alternatively, using the historic Docker repository from our sponsor [TheCodingMachine](https://www.thecodingmachine.com):
|
Convert a URL to PDF:
|
||||||
|
|
||||||
```
|
```bash
|
||||||
docker run --rm -p 3000:3000 thecodingmachine/gotenberg:7
|
curl \
|
||||||
|
--request POST http://localhost:3000/forms/chromium/convert/url \
|
||||||
|
--form url=https://sparksuite.github.io/simple-html-invoice-template/ \
|
||||||
|
-o invoice.pdf
|
||||||
```
|
```
|
||||||
|
|
||||||
The API is now available on your host at http://localhost:3000.
|
## Features
|
||||||
|
|
||||||
Head to the [documentation](https://gotenberg.dev/docs/about) to learn how to interact with it 🚀
|
- **HTML, URL, Markdown to PDF** via Headless Chromium
|
||||||
|
- **Office documents to PDF** via LibreOffice (100+ formats)
|
||||||
|
- **Merge, split, rotate, flatten** PDFs
|
||||||
|
- **Watermark, stamp, encrypt** PDFs
|
||||||
|
- **PDF/A and PDF/UA** compliance
|
||||||
|
- **Screenshots** of URLs and HTML
|
||||||
|
- **Read/write metadata and bookmarks**
|
||||||
|
|
||||||
|
See the [full documentation](https://gotenberg.dev/docs/getting-started/introduction).
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Questions and feedback: [GitHub Discussions](https://github.com/gotenberg/gotenberg/discussions).
|
||||||
|
Bug reports: [GitHub Issues](https://github.com/gotenberg/gotenberg/issues).
|
||||||
|
|
||||||
## Sponsors
|
## Sponsors
|
||||||
|
|
||||||
<p align="center">
|
If Gotenberg powers your workflow or your business, consider [**becoming a sponsor**](https://github.com/sponsors/gulien).
|
||||||
<a href="https://thecodingmachine.com">
|
|
||||||
<img src="https://user-images.githubusercontent.com/8983173/130324668-9d6e7b35-53a3-49c7-a574-38190d2bd6b0.png" alt="TheCodingMachine Logo" width="429" height="210" />
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
## Badges
|
**Historic & GitHub Sponsors**
|
||||||
|
|
||||||
[](https://hub.docker.com/r/gotenberg/gotenberg)
|
- [TheCodingMachine](https://thecodingmachine.com/)
|
||||||
[](https://hub.docker.com/r/thecodingmachine/gotenberg)
|
- [pdfme](https://pdfme.com/)
|
||||||
[](https://github.com/gotenberg/gotenberg/actions/workflows/continuous_integration.yml)
|
- [PDFBolt](https://pdfbolt.com)
|
||||||
[](https://pkg.go.dev/github.com/gotenberg/gotenberg/v7)
|
- [FileToPDF.dev](https://filetopdf.dev)
|
||||||
[](https://codecov.io/gh/gotenberg/gotenberg)
|
|
||||||
[](https://goreportcard.com/report/gotenberg/gotenberg)
|
**Powered By**
|
||||||
|
|
||||||
|
- [Docker](https://docs.docker.com/docker-hub/repos/manage/trusted-content/dsos-program/)
|
||||||
|
- [JetBrains](https://www.jetbrains.com/community/opensource/)
|
||||||
|
|||||||
29
SECURITY.md
Normal file
29
SECURITY.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Supported Versions
|
||||||
|
|
||||||
|
Only the latest version receives security updates and patches. Keep your environment up to date.
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
Do not publish vulnerabilities publicly. Report them through [GitHub's private vulnerability reporting](https://github.com/gotenberg/gotenberg/security/advisories/new).
|
||||||
|
|
||||||
|
Include:
|
||||||
|
|
||||||
|
- A detailed description of the vulnerability.
|
||||||
|
- Steps to reproduce the issue.
|
||||||
|
- Potential impact on users or the system.
|
||||||
|
|
||||||
|
This process is handled on a best-effort basis. Response speed may vary depending on severity and available resources.
|
||||||
|
|
||||||
|
## Disclosure Policy
|
||||||
|
|
||||||
|
Once a report is received and confirmed:
|
||||||
|
|
||||||
|
- A fix and release timeline will be prepared.
|
||||||
|
- The reporter will be notified when the fix is released.
|
||||||
|
- The reporter will be credited for the discovery (unless anonymity is requested).
|
||||||
|
|
||||||
|
## Comments on this Policy
|
||||||
|
|
||||||
|
Submit a pull request with suggestions for improving this process.
|
||||||
620
build/Dockerfile
620
build/Dockerfile
@@ -1,12 +1,40 @@
|
|||||||
# Note: ARG instructions do not create additional layers.
|
# ARG instructions do not create additional layers. Instead, next layers will
|
||||||
# Instead, next layers will concatenate them.
|
# concatenate them. Also, we have to repeat ARG instructions in each build
|
||||||
ARG GOLANG_VERSION
|
# stage that uses them.
|
||||||
# Note: we have to repeat ARG instructions in each build stage that uses them.
|
ARG GOLANG_VERSION=1.26.5
|
||||||
ARG GOTENBERG_VERSION
|
|
||||||
|
|
||||||
FROM golang:$GOLANG_VERSION AS builder
|
# ----------------------------------------------
|
||||||
|
# pdfcpu binary build stage
|
||||||
|
# ----------------------------------------------
|
||||||
|
# Note: this stage is required as pdfcpu does not release an armhf variant by
|
||||||
|
# default.
|
||||||
|
FROM golang:$GOLANG_VERSION AS pdfcpu-binary-stage
|
||||||
|
|
||||||
ENV CGO_ENABLED 0
|
# See https://github.com/pdfcpu/pdfcpu/releases.
|
||||||
|
ARG PDFCPU_VERSION=v0.13.0
|
||||||
|
ENV CGO_ENABLED=0
|
||||||
|
|
||||||
|
# Define the working directory outside of $GOPATH (we're using go modules).
|
||||||
|
WORKDIR /home
|
||||||
|
|
||||||
|
RUN curl -Ls "https://github.com/pdfcpu/pdfcpu/archive/refs/tags/$PDFCPU_VERSION.tar.gz" -o pdfcpu.tar.gz \
|
||||||
|
&& tar --strip-components=1 -xvzf pdfcpu.tar.gz
|
||||||
|
|
||||||
|
# Install module dependencies.
|
||||||
|
RUN go mod download \
|
||||||
|
&& go mod verify
|
||||||
|
|
||||||
|
RUN go build -o pdfcpu -ldflags "-s -w -X 'main.version=$PDFCPU_VERSION' -X 'github.com/pdfcpu/pdfcpu/pkg/pdfcpu/model.VersionStr=$PDFCPU_VERSION' -X main.builtBy=gotenberg" ./cmd/pdfcpu \
|
||||||
|
# Verify installation.
|
||||||
|
&& ./pdfcpu version
|
||||||
|
|
||||||
|
# ----------------------------------------------
|
||||||
|
# Gotenberg binary build stage
|
||||||
|
# ----------------------------------------------
|
||||||
|
FROM golang:$GOLANG_VERSION AS gotenberg-binary-stage
|
||||||
|
|
||||||
|
ARG GOTENBERG_VERSION=snapshot
|
||||||
|
ENV CGO_ENABLED=0
|
||||||
|
|
||||||
# Define the working directory outside of $GOPATH (we're using go modules).
|
# Define the working directory outside of $GOPATH (we're using go modules).
|
||||||
WORKDIR /home
|
WORKDIR /home
|
||||||
@@ -14,144 +42,249 @@ WORKDIR /home
|
|||||||
# Install module dependencies.
|
# Install module dependencies.
|
||||||
COPY go.mod go.sum ./
|
COPY go.mod go.sum ./
|
||||||
|
|
||||||
RUN go mod download &&\
|
RUN go mod download \
|
||||||
go mod verify
|
&& go mod verify
|
||||||
|
|
||||||
# Copy the source code.
|
# Copy the source code.
|
||||||
COPY cmd ./cmd
|
COPY cmd ./cmd
|
||||||
COPY pkg ./pkg
|
COPY pkg ./pkg
|
||||||
|
|
||||||
# Build the binary.
|
RUN go build -o gotenberg -ldflags "-s -w -X 'github.com/gotenberg/gotenberg/v8/cmd.Version=$GOTENBERG_VERSION'" cmd/gotenberg/main.go \
|
||||||
ARG GOTENBERG_VERSION
|
&& go build -o gotenberg-chromium -ldflags "-s -w -X 'github.com/gotenberg/gotenberg/v8/cmd.Version=$GOTENBERG_VERSION'" cmd/gotenberg-chromium/main.go \
|
||||||
|
&& go build -o gotenberg-libreoffice -ldflags "-s -w -X 'github.com/gotenberg/gotenberg/v8/cmd.Version=$GOTENBERG_VERSION'" cmd/gotenberg-libreoffice/main.go
|
||||||
|
|
||||||
RUN go build -o gotenberg -ldflags "-X 'github.com/gotenberg/gotenberg/v7/cmd.Version=$GOTENBERG_VERSION'" cmd/gotenberg/main.go
|
# ----------------------------------------------
|
||||||
|
# Custom JRE stage
|
||||||
|
# Credits: https://github.com/jodconverter/docker-image-jodconverter-runtime
|
||||||
|
# ----------------------------------------------
|
||||||
|
FROM debian:13-slim AS custom-jre-stage
|
||||||
|
|
||||||
FROM debian:11-slim
|
RUN apt-get update -qq \
|
||||||
|
&& apt-get upgrade -yqq \
|
||||||
|
&& DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends default-jdk-headless binutils
|
||||||
|
|
||||||
ARG GOTENBERG_VERSION
|
# Note: jdeps helps finding which modules a JAR requires.
|
||||||
|
# Currently only for PDFtk, as we don't rely on LibreOffice UNO Java SDK.
|
||||||
|
ENV JAVA_MODULES=java.base,java.desktop,java.naming,java.sql
|
||||||
|
|
||||||
LABEL author="Julien Neuhart" \
|
RUN jlink \
|
||||||
description="A Docker-powered stateless API for PDF files." \
|
--add-modules $JAVA_MODULES \
|
||||||
github="https://github.com/gotenberg/gotenberg" \
|
--strip-debug \
|
||||||
version="$GOTENBERG_VERSION" \
|
--no-man-pages \
|
||||||
website="https://gotenberg.dev"
|
--no-header-files \
|
||||||
|
--compress=2 \
|
||||||
|
--output /custom-jre
|
||||||
|
|
||||||
|
# ----------------------------------------------
|
||||||
|
# Downloader stage
|
||||||
|
# ----------------------------------------------
|
||||||
|
FROM debian:13-slim AS downloader-stage
|
||||||
|
|
||||||
|
# See https://gitlab.com/pdftk-java/pdftk/-/releases - Binary package.
|
||||||
|
ARG PDFTK_VERSION=v3.3.3
|
||||||
|
|
||||||
|
RUN apt-get update -qq \
|
||||||
|
&& DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends curl ca-certificates
|
||||||
|
|
||||||
|
WORKDIR /downloads
|
||||||
|
|
||||||
|
RUN curl -Ls https://raw.githubusercontent.com/gotenberg/unoconverter/v0.4.0/unoconv -o unoconverter \
|
||||||
|
&& chmod +x unoconverter
|
||||||
|
|
||||||
|
RUN curl -o pdftk-all.jar "https://gitlab.com/api/v4/projects/5024297/packages/generic/pdftk-java/$PDFTK_VERSION/pdftk-all.jar" \
|
||||||
|
&& chmod a+x pdftk-all.jar
|
||||||
|
|
||||||
|
# ----------------------------------------------
|
||||||
|
# Base image stage
|
||||||
|
# ----------------------------------------------
|
||||||
|
FROM debian:13-slim AS base-image-stage
|
||||||
|
|
||||||
|
ARG TIMEZONE=UTC
|
||||||
|
ENV TZ=$TIMEZONE
|
||||||
|
|
||||||
|
COPY --link --from=custom-jre-stage /custom-jre /opt/java
|
||||||
|
|
||||||
|
ENV PATH="/opt/java/bin:${PATH}"
|
||||||
|
|
||||||
|
# ----------------------------------------------
|
||||||
|
# Common stage
|
||||||
|
# ----------------------------------------------
|
||||||
|
FROM base-image-stage AS common-stage
|
||||||
|
|
||||||
|
ARG GOTENBERG_USER_GID=1001
|
||||||
|
ARG GOTENBERG_USER_UID=1001
|
||||||
|
|
||||||
|
# Create a non-root user.
|
||||||
|
# All processes in the Docker container will run with this dedicated user.
|
||||||
|
RUN groupadd --gid "$GOTENBERG_USER_GID" gotenberg \
|
||||||
|
&& useradd --uid "$GOTENBERG_USER_UID" --gid gotenberg --shell /bin/bash --home /home/gotenberg --no-create-home gotenberg \
|
||||||
|
&& mkdir /home/gotenberg \
|
||||||
|
&& chown gotenberg: /home/gotenberg
|
||||||
|
|
||||||
|
# Note: tini is a helper for reaping zombie processes.
|
||||||
|
RUN apt-get update -qq \
|
||||||
|
&& apt-get upgrade -yqq \
|
||||||
|
&& DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends \
|
||||||
|
ca-certificates \
|
||||||
|
tini \
|
||||||
|
# Many users rely on curl for Docker health checks.
|
||||||
|
curl \
|
||||||
|
# Install fonts.
|
||||||
|
# Essential metric-compatible fonts for LibreOffice layout fidelity (replaces MS Fonts).
|
||||||
|
fonts-crosextra-carlito \
|
||||||
|
fonts-crosextra-caladea \
|
||||||
|
fonts-liberation \
|
||||||
|
fonts-liberation2 \
|
||||||
|
# Reliable general-purpose fallback for Chromium.
|
||||||
|
fonts-dejavu \
|
||||||
|
# Unified CJK (Chinese, Japanese, Korean) support.
|
||||||
|
fonts-noto-cjk \
|
||||||
|
# Standard Emoji support.
|
||||||
|
fonts-noto-color-emoji \
|
||||||
|
# Tofu prevention.
|
||||||
|
fonts-noto-core \
|
||||||
|
# Install QPDF & ExifTool (PDF engines).
|
||||||
|
qpdf exiftool \
|
||||||
|
# See https://github.com/nextcloud/docker/issues/380.
|
||||||
|
&& mkdir -p /usr/share/man/man1 \
|
||||||
|
# Cleanup.
|
||||||
|
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
||||||
|
|
||||||
|
# PDFtk bash wrapper.
|
||||||
|
# See https://github.com/gotenberg/gotenberg/pull/273.
|
||||||
|
RUN printf '#!/bin/bash\n\nexec java -jar /usr/bin/pdftk-all.jar "$@"' > /usr/bin/pdftk \
|
||||||
|
&& chmod +x /usr/bin/pdftk
|
||||||
|
|
||||||
|
# Support for arbitrary user IDs (OpenShift).
|
||||||
|
# See:
|
||||||
|
# https://github.com/gotenberg/gotenberg/issues/1049.
|
||||||
|
# https://docs.redhat.com/en/documentation/openshift_container_platform/4.15/html/images/creating-images#use-uid_create-images.
|
||||||
|
RUN usermod -aG root gotenberg \
|
||||||
|
&& chgrp -R 0 /home/gotenberg \
|
||||||
|
&& chmod -R g=u /home/gotenberg
|
||||||
|
|
||||||
|
# COPY instructions last to maximize cache reuse when only source code changes.
|
||||||
|
|
||||||
# Improve fonts subpixel hinting and smoothing.
|
# Improve fonts subpixel hinting and smoothing.
|
||||||
# Credits:
|
# Credits:
|
||||||
# https://github.com/arachnys/athenapdf/issues/69.
|
# https://github.com/arachnys/athenapdf/issues/69.
|
||||||
# https://github.com/arachnys/athenapdf/commit/ba25a8d80a25d08d58865519c4cd8756dc9a336d.
|
# https://github.com/arachnys/athenapdf/commit/ba25a8d80a25d08d58865519c4cd8756dc9a336d.
|
||||||
COPY build/fonts.conf /etc/fonts/conf.d/100-gotenberg.conf
|
COPY --link build/fonts.conf /etc/fonts/conf.d/100-gotenberg.conf
|
||||||
|
|
||||||
# Simple wrapper around Java and PDFtk.
|
# Copy PDFtk jar.
|
||||||
COPY build/pdftk.sh /usr/bin/pdftk
|
COPY --link --from=downloader-stage /downloads/pdftk-all.jar /usr/bin/pdftk-all.jar
|
||||||
|
|
||||||
# Setup the Docker image.
|
# Copy the pdfcpu binary (shared across all variants).
|
||||||
ARG GOTENBERG_USER_GID
|
COPY --link --from=pdfcpu-binary-stage /home/pdfcpu /usr/bin/
|
||||||
ARG GOTENBERG_USER_UID
|
|
||||||
ARG NOTO_COLOR_EMOJI_VERSION
|
|
||||||
ARG PDFTK_VERSION
|
|
||||||
|
|
||||||
# Script for installing either Google Chrome stable on amd64 architecture or
|
# Set default characterset encoding to UTF-8.
|
||||||
# Chromium on other architectures.
|
# See:
|
||||||
# See https://github.com/gotenberg/gotenberg/issues/328.
|
# https://github.com/gotenberg/gotenberg/issues/104
|
||||||
COPY build/install-chromium.sh /tmp/install-chromium.sh
|
# https://github.com/gotenberg/gotenberg/issues/730
|
||||||
|
ENV LANG=C.UTF-8
|
||||||
|
ENV LC_ALL=C.UTF-8
|
||||||
|
|
||||||
RUN \
|
# Environment variables for PDF engines.
|
||||||
# Create a non-root user.
|
ENV PDFTK_BIN_PATH=/usr/bin/pdftk
|
||||||
# All processes in the Docker container will run with this dedicated user.
|
ENV QPDF_BIN_PATH=/usr/bin/qpdf
|
||||||
groupadd --gid "$GOTENBERG_USER_GID" gotenberg &&\
|
ENV EXIFTOOL_BIN_PATH=/usr/bin/exiftool
|
||||||
useradd --uid "$GOTENBERG_USER_UID" --gid gotenberg --shell /bin/bash --home /home/gotenberg --no-create-home gotenberg &&\
|
ENV PDFCPU_BIN_PATH=/usr/bin/pdfcpu
|
||||||
mkdir /home/gotenberg &&\
|
|
||||||
chown gotenberg: /home/gotenberg &&\
|
# Capture backing-binary versions at build time so the running process reports
|
||||||
# Install dependencies required for the next instructions or debugging.
|
# them on traces without spawning the binaries at startup or per request.
|
||||||
# Note: procps for "top" command (useful when debugging processes).
|
# See pkg/gotenberg/buildversions.go. Chromium and LibreOffice are captured in
|
||||||
# Note: tini is a helper for reaping zombie processes.
|
# the variant stages below, where they are installed.
|
||||||
apt-get update -qq &&\
|
ENV GOTENBERG_VERSIONS_DIR_PATH=/opt/gotenberg/versions
|
||||||
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends curl gnupg procps tini python3 default-jre-headless &&\
|
|
||||||
# Install fonts.
|
COPY --link build/capture-version.sh /opt/gotenberg/capture-version.sh
|
||||||
# Credits:
|
|
||||||
# https://github.com/arachnys/athenapdf/blob/master/cli/Dockerfile.
|
RUN bash /opt/gotenberg/capture-version.sh "$GOTENBERG_VERSIONS_DIR_PATH" qpdf "$QPDF_BIN_PATH" --version \
|
||||||
# https://help.accusoft.com/PrizmDoc/v12.1/HTML/Installing_Asian_Fonts_on_Ubuntu_and_Debian.html.
|
&& bash /opt/gotenberg/capture-version.sh "$GOTENBERG_VERSIONS_DIR_PATH" exiftool "$EXIFTOOL_BIN_PATH" -ver \
|
||||||
curl -o ./ttf-mscorefonts-installer_3.8_all.deb http://httpredir.debian.org/debian/pool/contrib/m/msttcorefonts/ttf-mscorefonts-installer_3.8_all.deb &&\
|
&& bash /opt/gotenberg/capture-version.sh "$GOTENBERG_VERSIONS_DIR_PATH" pdftk "$PDFTK_BIN_PATH" --version \
|
||||||
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends \
|
&& bash /opt/gotenberg/capture-version.sh "$GOTENBERG_VERSIONS_DIR_PATH" pdfcpu "$PDFCPU_BIN_PATH" version
|
||||||
./ttf-mscorefonts-installer_3.8_all.deb \
|
|
||||||
culmus \
|
# OpenTelemetry defaults (noop - no telemetry overhead unless explicitly enabled).
|
||||||
fonts-beng \
|
ENV OTEL_TRACES_EXPORTER=none
|
||||||
fonts-hosny-amiri \
|
ENV OTEL_METRICS_EXPORTER=none
|
||||||
fonts-lklug-sinhala \
|
ENV OTEL_LOGS_EXPORTER=none
|
||||||
fonts-lohit-guru \
|
|
||||||
fonts-lohit-knda \
|
# ----------------------------------------------
|
||||||
fonts-samyak-gujr \
|
# Final stage: full (Chromium + LibreOffice)
|
||||||
fonts-samyak-mlym \
|
# ----------------------------------------------
|
||||||
fonts-samyak-taml \
|
FROM common-stage AS gotenberg
|
||||||
fonts-sarai \
|
|
||||||
fonts-sil-abyssinica \
|
ARG GOTENBERG_VERSION=snapshot
|
||||||
fonts-sil-padauk \
|
ARG GOTENBERG_USER_GID=1001
|
||||||
fonts-telu \
|
ARG GOTENBERG_USER_UID=1001
|
||||||
fonts-thai-tlwg \
|
ARG TMP_CHROMIUM_VERSION_PPC64EL="146.0.7680.80-1~deb13u1"
|
||||||
ttf-wqy-zenhei \
|
|
||||||
fonts-arphic-ukai \
|
LABEL org.opencontainers.image.title="Gotenberg" \
|
||||||
fonts-arphic-uming \
|
org.opencontainers.image.description="A Docker-based API for converting documents to PDF." \
|
||||||
fonts-ipafont-mincho \
|
org.opencontainers.image.version="$GOTENBERG_VERSION" \
|
||||||
fonts-ipafont-gothic \
|
org.opencontainers.image.authors="Julien Neuhart <neuhart.julien@gmail.com>" \
|
||||||
fonts-unfonts-core \
|
org.opencontainers.image.documentation="https://gotenberg.dev" \
|
||||||
# LibreOffice recommends.
|
org.opencontainers.image.source="https://github.com/gotenberg/gotenberg"
|
||||||
fonts-crosextra-caladea \
|
|
||||||
fonts-crosextra-carlito \
|
# Install Chromium.
|
||||||
fonts-dejavu \
|
# On ppc64el, the latest Chromium is broken, so we pin a known working
|
||||||
fonts-dejavu-extra \
|
# version from snapshot.debian.org via debsnap.
|
||||||
fonts-liberation \
|
RUN /bin/bash -c \
|
||||||
fonts-liberation2 \
|
'set -e &&\
|
||||||
fonts-linuxlibertine \
|
if [[ "$(dpkg --print-architecture)" == "ppc64el" ]]; then \
|
||||||
fonts-noto-core \
|
apt-get update -qq &&\
|
||||||
fonts-noto-mono \
|
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends devscripts &&\
|
||||||
fonts-noto-ui-core \
|
debsnap chromium-common "$TMP_CHROMIUM_VERSION_PPC64EL" -v --force --binary --architecture ppc64el &&\
|
||||||
fonts-sil-gentium \
|
debsnap chromium "$TMP_CHROMIUM_VERSION_PPC64EL" -v --force --binary --architecture ppc64el &&\
|
||||||
fonts-sil-gentium-basic &&\
|
DEBIAN_FRONTEND=noninteractive apt-get install --fix-broken -y -qq --no-install-recommends "./binary-chromium-common/chromium-common_${TMP_CHROMIUM_VERSION_PPC64EL}_ppc64el.deb" "./binary-chromium/chromium_${TMP_CHROMIUM_VERSION_PPC64EL}_ppc64el.deb" &&\
|
||||||
rm -f ./ttf-mscorefonts-installer_3.8_all.deb &&\
|
DEBIAN_FRONTEND=noninteractive apt-get purge -y -qq devscripts &&\
|
||||||
# Add Color and Black-and-White Noto emoji font.
|
rm -rf ./binary-chromium-common/* ./binary-chromium/*; \
|
||||||
# Credits:
|
else \
|
||||||
# https://github.com/gotenberg/gotenberg/pull/325.
|
apt-get update -qq &&\
|
||||||
# https://github.com/googlefonts/noto-emoji.
|
apt-get upgrade -yqq &&\
|
||||||
curl -Ls "https://github.com/googlefonts/noto-emoji/raw/$NOTO_COLOR_EMOJI_VERSION/fonts/NotoColorEmoji.ttf" -o /usr/local/share/fonts/NotoColorEmoji.ttf &&\
|
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends chromium; \
|
||||||
# Install Google Chrome / Chromium.
|
fi' \
|
||||||
/tmp/install-chromium.sh &&\
|
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
||||||
# Install LibreOffice.
|
|
||||||
# Note: we use the sid distribution to get the latest LibreOffice version.
|
# Install LibreOffice & unoconverter.
|
||||||
# See https://github.com/gotenberg/gotenberg/pull/322.
|
RUN echo "deb http://deb.debian.org/debian trixie-backports main" >> /etc/apt/sources.list \
|
||||||
echo "deb https://httpredir.debian.org/debian/ sid main contrib non-free" >> /etc/apt/sources.list &&\
|
&& apt-get update -qq \
|
||||||
apt-get update -qq &&\
|
&& apt-get upgrade -yqq \
|
||||||
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends -t sid libreoffice &&\
|
&& DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends \
|
||||||
# Download unoconv (Python script).
|
python3 python3-distutils-extra \
|
||||||
curl -Ls https://raw.githubusercontent.com/dagwieers/unoconv/master/unoconv -o /usr/bin/unoconv &&\
|
# Install Hyphenation for LibreOffice.
|
||||||
chmod +x /usr/bin/unoconv &&\
|
# Credits: https://wiki.archlinux.org/title/LibreOffice.
|
||||||
# unoconv will look for the Python binary, which has to be at version 3.
|
hyphen-af hyphen-as hyphen-be hyphen-bg hyphen-bn hyphen-ca hyphen-cs hyphen-da hyphen-de hyphen-el \
|
||||||
ln -s /usr/bin/python3 /usr/bin/python &&\
|
hyphen-en-gb hyphen-en-us hyphen-eo hyphen-es hyphen-fr hyphen-gl hyphen-gu hyphen-hi hyphen-hr hyphen-hu \
|
||||||
# Download PDFtk.
|
hyphen-id hyphen-is hyphen-it hyphen-kn hyphen-lt hyphen-lv hyphen-ml hyphen-mn hyphen-mr hyphen-nl \
|
||||||
# See https://github.com/gotenberg/gotenberg/pull/273.
|
hyphen-no hyphen-or hyphen-pa hyphen-pl hyphen-pt-br hyphen-pt-pt hyphen-ro hyphen-ru hyphen-sk hyphen-sl \
|
||||||
curl -o /usr/bin/pdftk-all.jar "https://gitlab.com/pdftk-java/pdftk/-/jobs/$PDFTK_VERSION/artifacts/raw/build/libs/pdftk-all.jar" &&\
|
hyphen-sr hyphen-sv hyphen-ta hyphen-te hyphen-th hyphen-uk hyphen-zu \
|
||||||
chmod a+x /usr/bin/pdftk-all.jar &&\
|
&& DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends -t trixie-backports \
|
||||||
# See https://github.com/nextcloud/docker/issues/380.
|
libreoffice-writer libreoffice-calc libreoffice-impress libreoffice-draw python3-uno \
|
||||||
mkdir -p /usr/share/man/man1mkdir -p /usr/share/man/man1 &&\
|
# unoconverter will look for the Python binary, which has to be at version 3.
|
||||||
|
&& ln -s /usr/bin/python3 /usr/bin/python \
|
||||||
# Cleanup.
|
# Cleanup.
|
||||||
# Note: the Debian image does automatically a clean after each install thanks to a hook.
|
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
||||||
# Therefore, there is no need for apt-get clean.
|
|
||||||
# See https://stackoverflow.com/a/24417119/3248473.
|
|
||||||
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* &&\
|
|
||||||
# Print versions of main dependencies.
|
|
||||||
chromium --version &&\
|
|
||||||
libreoffice --version &&\
|
|
||||||
unoconv --version &&\
|
|
||||||
pdftk --version
|
|
||||||
|
|
||||||
# Copy the Gotenberg binary from the builder stage.
|
# COPY instructions last to maximize cache reuse.
|
||||||
COPY --from=builder /home/gotenberg /usr/bin/
|
|
||||||
|
|
||||||
# Environment variables required by modules or else.
|
# Copy the Gotenberg binary (full variant with all modules).
|
||||||
ENV GC_EXCLUDE_SUBSTR "hsperfdata_root,hsperfdata_gotenberg"
|
COPY --link --from=gotenberg-binary-stage /home/gotenberg /usr/bin/
|
||||||
ENV CHROMIUM_BIN_PATH /usr/bin/chromium
|
|
||||||
ENV UNOCONV_BIN_PATH /usr/bin/unoconv
|
# Copy unoconverter.
|
||||||
ENV PDFTK_BIN_PATH /usr/bin/pdftk
|
COPY --link --from=downloader-stage /downloads/unoconverter /usr/bin/unoconverter
|
||||||
|
|
||||||
|
# Copy dictionnaries so that hyphens work on Chromium.
|
||||||
|
# See https://github.com/gotenberg/gotenberg/issues/1293.
|
||||||
|
COPY --link --chown="$GOTENBERG_USER_UID:$GOTENBERG_USER_GID" build/chromium-hyphen-data /opt/gotenberg/chromium-hyphen-data
|
||||||
|
|
||||||
|
ENV CHROMIUM_BIN_PATH=/usr/bin/chromium
|
||||||
|
ENV CHROMIUM_HYPHEN_DATA_DIR_PATH=/opt/gotenberg/chromium-hyphen-data
|
||||||
|
ENV LIBREOFFICE_BIN_PATH=/usr/lib/libreoffice/program/soffice.bin
|
||||||
|
ENV UNOCONVERTER_BIN_PATH=/usr/bin/unoconverter
|
||||||
|
|
||||||
|
# Capture Chromium and LibreOffice versions now that both are installed.
|
||||||
|
RUN bash /opt/gotenberg/capture-version.sh "$GOTENBERG_VERSIONS_DIR_PATH" chromium "$CHROMIUM_BIN_PATH" --version \
|
||||||
|
&& bash /opt/gotenberg/capture-version.sh "$GOTENBERG_VERSIONS_DIR_PATH" libreoffice-api "$LIBREOFFICE_BIN_PATH" --version
|
||||||
|
|
||||||
USER gotenberg
|
USER gotenberg
|
||||||
WORKDIR /home/gotenberg
|
WORKDIR /home/gotenberg
|
||||||
@@ -160,4 +293,241 @@ WORKDIR /home/gotenberg
|
|||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
|
|
||||||
ENTRYPOINT [ "/usr/bin/tini", "--" ]
|
ENTRYPOINT [ "/usr/bin/tini", "--" ]
|
||||||
CMD [ "gotenberg" ]
|
CMD [ "gotenberg" ]
|
||||||
|
|
||||||
|
# ----------------------------------------------
|
||||||
|
# Final stage: Chromium only
|
||||||
|
# ----------------------------------------------
|
||||||
|
FROM common-stage AS gotenberg-chromium
|
||||||
|
|
||||||
|
ARG GOTENBERG_VERSION=snapshot
|
||||||
|
ARG GOTENBERG_USER_GID=1001
|
||||||
|
ARG GOTENBERG_USER_UID=1001
|
||||||
|
ARG TMP_CHROMIUM_VERSION_PPC64EL="146.0.7680.80-1~deb13u1"
|
||||||
|
|
||||||
|
LABEL org.opencontainers.image.title="Gotenberg (Chromium)" \
|
||||||
|
org.opencontainers.image.description="A Docker-based API for converting documents to PDF — Chromium variant." \
|
||||||
|
org.opencontainers.image.version="$GOTENBERG_VERSION" \
|
||||||
|
org.opencontainers.image.authors="Julien Neuhart <neuhart.julien@gmail.com>" \
|
||||||
|
org.opencontainers.image.documentation="https://gotenberg.dev" \
|
||||||
|
org.opencontainers.image.source="https://github.com/gotenberg/gotenberg"
|
||||||
|
|
||||||
|
# Install Chromium.
|
||||||
|
# On ppc64el, the latest Chromium is broken, so we pin a known working
|
||||||
|
# version from snapshot.debian.org via debsnap.
|
||||||
|
RUN /bin/bash -c \
|
||||||
|
'set -e &&\
|
||||||
|
if [[ "$(dpkg --print-architecture)" == "ppc64el" ]]; then \
|
||||||
|
apt-get update -qq &&\
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends devscripts &&\
|
||||||
|
debsnap chromium-common "$TMP_CHROMIUM_VERSION_PPC64EL" -v --force --binary --architecture ppc64el &&\
|
||||||
|
debsnap chromium "$TMP_CHROMIUM_VERSION_PPC64EL" -v --force --binary --architecture ppc64el &&\
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install --fix-broken -y -qq --no-install-recommends "./binary-chromium-common/chromium-common_${TMP_CHROMIUM_VERSION_PPC64EL}_ppc64el.deb" "./binary-chromium/chromium_${TMP_CHROMIUM_VERSION_PPC64EL}_ppc64el.deb" &&\
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get purge -y -qq devscripts &&\
|
||||||
|
rm -rf ./binary-chromium-common/* ./binary-chromium/*; \
|
||||||
|
else \
|
||||||
|
apt-get update -qq &&\
|
||||||
|
apt-get upgrade -yqq &&\
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends chromium; \
|
||||||
|
fi' \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
||||||
|
|
||||||
|
# COPY instructions last to maximize cache reuse.
|
||||||
|
|
||||||
|
# Copy the Gotenberg binary (Chromium variant, no LibreOffice modules).
|
||||||
|
COPY --link --from=gotenberg-binary-stage /home/gotenberg-chromium /usr/bin/gotenberg
|
||||||
|
|
||||||
|
# Copy dictionnaries so that hyphens work on Chromium.
|
||||||
|
# See https://github.com/gotenberg/gotenberg/issues/1293.
|
||||||
|
COPY --link --chown="$GOTENBERG_USER_UID:$GOTENBERG_USER_GID" build/chromium-hyphen-data /opt/gotenberg/chromium-hyphen-data
|
||||||
|
|
||||||
|
ENV CHROMIUM_BIN_PATH=/usr/bin/chromium
|
||||||
|
ENV CHROMIUM_HYPHEN_DATA_DIR_PATH=/opt/gotenberg/chromium-hyphen-data
|
||||||
|
# No LibreOffice in this variant; override the default to use all available engines.
|
||||||
|
ENV PDFENGINES_CONVERT_ENGINES=
|
||||||
|
|
||||||
|
# Capture the Chromium version now that it is installed.
|
||||||
|
RUN bash /opt/gotenberg/capture-version.sh "$GOTENBERG_VERSIONS_DIR_PATH" chromium "$CHROMIUM_BIN_PATH" --version
|
||||||
|
|
||||||
|
USER gotenberg
|
||||||
|
WORKDIR /home/gotenberg
|
||||||
|
|
||||||
|
# Default API port.
|
||||||
|
EXPOSE 3000
|
||||||
|
|
||||||
|
ENTRYPOINT [ "/usr/bin/tini", "--" ]
|
||||||
|
CMD [ "gotenberg" ]
|
||||||
|
|
||||||
|
# ----------------------------------------------
|
||||||
|
# Final stage: LibreOffice only
|
||||||
|
# ----------------------------------------------
|
||||||
|
FROM common-stage AS gotenberg-libreoffice
|
||||||
|
|
||||||
|
ARG GOTENBERG_VERSION=snapshot
|
||||||
|
|
||||||
|
LABEL org.opencontainers.image.title="Gotenberg (LibreOffice)" \
|
||||||
|
org.opencontainers.image.description="A Docker-based API for converting documents to PDF — LibreOffice variant." \
|
||||||
|
org.opencontainers.image.version="$GOTENBERG_VERSION" \
|
||||||
|
org.opencontainers.image.authors="Julien Neuhart <neuhart.julien@gmail.com>" \
|
||||||
|
org.opencontainers.image.documentation="https://gotenberg.dev" \
|
||||||
|
org.opencontainers.image.source="https://github.com/gotenberg/gotenberg"
|
||||||
|
|
||||||
|
# Install LibreOffice & unoconverter.
|
||||||
|
RUN echo "deb http://deb.debian.org/debian trixie-backports main" >> /etc/apt/sources.list \
|
||||||
|
&& apt-get update -qq \
|
||||||
|
&& apt-get upgrade -yqq \
|
||||||
|
&& DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends \
|
||||||
|
python3 python3-distutils-extra \
|
||||||
|
# Install Hyphenation for LibreOffice.
|
||||||
|
# Credits: https://wiki.archlinux.org/title/LibreOffice.
|
||||||
|
hyphen-af hyphen-as hyphen-be hyphen-bg hyphen-bn hyphen-ca hyphen-cs hyphen-da hyphen-de hyphen-el \
|
||||||
|
hyphen-en-gb hyphen-en-us hyphen-eo hyphen-es hyphen-fr hyphen-gl hyphen-gu hyphen-hi hyphen-hr hyphen-hu \
|
||||||
|
hyphen-id hyphen-is hyphen-it hyphen-kn hyphen-lt hyphen-lv hyphen-ml hyphen-mn hyphen-mr hyphen-nl \
|
||||||
|
hyphen-no hyphen-or hyphen-pa hyphen-pl hyphen-pt-br hyphen-pt-pt hyphen-ro hyphen-ru hyphen-sk hyphen-sl \
|
||||||
|
hyphen-sr hyphen-sv hyphen-ta hyphen-te hyphen-th hyphen-uk hyphen-zu \
|
||||||
|
&& DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends -t trixie-backports \
|
||||||
|
libreoffice-writer libreoffice-calc libreoffice-impress libreoffice-draw python3-uno \
|
||||||
|
# unoconverter will look for the Python binary, which has to be at version 3.
|
||||||
|
&& ln -s /usr/bin/python3 /usr/bin/python \
|
||||||
|
# Cleanup.
|
||||||
|
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
||||||
|
|
||||||
|
# COPY instructions last to maximize cache reuse.
|
||||||
|
|
||||||
|
# Copy the Gotenberg binary (LibreOffice variant, no Chromium modules).
|
||||||
|
COPY --link --from=gotenberg-binary-stage /home/gotenberg-libreoffice /usr/bin/gotenberg
|
||||||
|
|
||||||
|
# Copy unoconverter.
|
||||||
|
COPY --link --from=downloader-stage /downloads/unoconverter /usr/bin/unoconverter
|
||||||
|
|
||||||
|
ENV LIBREOFFICE_BIN_PATH=/usr/lib/libreoffice/program/soffice.bin
|
||||||
|
ENV UNOCONVERTER_BIN_PATH=/usr/bin/unoconverter
|
||||||
|
|
||||||
|
# Capture the LibreOffice version now that it is installed.
|
||||||
|
RUN bash /opt/gotenberg/capture-version.sh "$GOTENBERG_VERSIONS_DIR_PATH" libreoffice-api "$LIBREOFFICE_BIN_PATH" --version
|
||||||
|
|
||||||
|
USER gotenberg
|
||||||
|
WORKDIR /home/gotenberg
|
||||||
|
|
||||||
|
# Default API port.
|
||||||
|
EXPOSE 3000
|
||||||
|
|
||||||
|
ENTRYPOINT [ "/usr/bin/tini", "--" ]
|
||||||
|
CMD [ "gotenberg" ]
|
||||||
|
|
||||||
|
# ==============================================================
|
||||||
|
# Cloud Run variants
|
||||||
|
# ==============================================================
|
||||||
|
|
||||||
|
# ----------------------------------------------
|
||||||
|
# Cloud Run: full (Chromium + LibreOffice)
|
||||||
|
# ----------------------------------------------
|
||||||
|
FROM gotenberg AS gotenberg-cloudrun
|
||||||
|
|
||||||
|
USER root
|
||||||
|
|
||||||
|
# For security reasons, the non-root user gotenberg does not own the Tini binary by default.
|
||||||
|
# However, some providers like Cloud Run from Google Cloud cannot start a Docker container in that case.
|
||||||
|
# See https://github.com/gotenberg/gotenberg/issues/90#issuecomment-543551353.
|
||||||
|
RUN chown gotenberg: /usr/bin/tini
|
||||||
|
|
||||||
|
ENV API_PORT_FROM_ENV=PORT
|
||||||
|
ENV CHROMIUM_AUTO_START=true
|
||||||
|
ENV LIBREOFFICE_AUTO_START=true
|
||||||
|
ENV WEBHOOK_ENABLE_SYNC_MODE=true
|
||||||
|
ENV GOTENBERG_BUILD_DEBUG_DATA=false
|
||||||
|
ENV LOG_STD_ENABLE_GCP_FIELDS=true
|
||||||
|
|
||||||
|
USER gotenberg
|
||||||
|
|
||||||
|
# ----------------------------------------------
|
||||||
|
# Cloud Run: Chromium only
|
||||||
|
# ----------------------------------------------
|
||||||
|
FROM gotenberg-chromium AS gotenberg-cloudrun-chromium
|
||||||
|
|
||||||
|
USER root
|
||||||
|
|
||||||
|
RUN chown gotenberg: /usr/bin/tini
|
||||||
|
|
||||||
|
ENV API_PORT_FROM_ENV=PORT
|
||||||
|
ENV CHROMIUM_AUTO_START=true
|
||||||
|
ENV WEBHOOK_ENABLE_SYNC_MODE=true
|
||||||
|
ENV GOTENBERG_BUILD_DEBUG_DATA=false
|
||||||
|
ENV LOG_STD_ENABLE_GCP_FIELDS=true
|
||||||
|
|
||||||
|
USER gotenberg
|
||||||
|
|
||||||
|
# ----------------------------------------------
|
||||||
|
# Cloud Run: LibreOffice only
|
||||||
|
# ----------------------------------------------
|
||||||
|
FROM gotenberg-libreoffice AS gotenberg-cloudrun-libreoffice
|
||||||
|
|
||||||
|
USER root
|
||||||
|
|
||||||
|
RUN chown gotenberg: /usr/bin/tini
|
||||||
|
|
||||||
|
ENV API_PORT_FROM_ENV=PORT
|
||||||
|
ENV LIBREOFFICE_AUTO_START=true
|
||||||
|
ENV WEBHOOK_ENABLE_SYNC_MODE=true
|
||||||
|
ENV GOTENBERG_BUILD_DEBUG_DATA=false
|
||||||
|
ENV LOG_STD_ENABLE_GCP_FIELDS=true
|
||||||
|
|
||||||
|
USER gotenberg
|
||||||
|
|
||||||
|
# ==============================================================
|
||||||
|
# AWS Lambda variants
|
||||||
|
# ==============================================================
|
||||||
|
|
||||||
|
# ----------------------------------------------
|
||||||
|
# AWS Lambda: full (Chromium + LibreOffice)
|
||||||
|
# ----------------------------------------------
|
||||||
|
FROM gotenberg AS gotenberg-aws-lambda
|
||||||
|
|
||||||
|
USER root
|
||||||
|
|
||||||
|
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.9.1 /lambda-adapter /opt/extensions/lambda-adapter
|
||||||
|
|
||||||
|
ENV AWS_LWA_PORT=3000
|
||||||
|
ENV AWS_LWA_READINESS_CHECK_PATH=/health
|
||||||
|
ENV AWS_LWA_INVOKE_MODE=buffered
|
||||||
|
ENV API_PORT_FROM_ENV=AWS_LWA_PORT
|
||||||
|
ENV WEBHOOK_ENABLE_SYNC_MODE=true
|
||||||
|
ENV GOTENBERG_BUILD_DEBUG_DATA=false
|
||||||
|
|
||||||
|
USER gotenberg
|
||||||
|
|
||||||
|
# ----------------------------------------------
|
||||||
|
# AWS Lambda: Chromium only
|
||||||
|
# ----------------------------------------------
|
||||||
|
FROM gotenberg-chromium AS gotenberg-aws-lambda-chromium
|
||||||
|
|
||||||
|
USER root
|
||||||
|
|
||||||
|
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.9.1 /lambda-adapter /opt/extensions/lambda-adapter
|
||||||
|
|
||||||
|
ENV AWS_LWA_PORT=3000
|
||||||
|
ENV AWS_LWA_READINESS_CHECK_PATH=/health
|
||||||
|
ENV AWS_LWA_INVOKE_MODE=buffered
|
||||||
|
ENV API_PORT_FROM_ENV=AWS_LWA_PORT
|
||||||
|
ENV WEBHOOK_ENABLE_SYNC_MODE=true
|
||||||
|
ENV GOTENBERG_BUILD_DEBUG_DATA=false
|
||||||
|
|
||||||
|
USER gotenberg
|
||||||
|
|
||||||
|
# ----------------------------------------------
|
||||||
|
# AWS Lambda: LibreOffice only
|
||||||
|
# ----------------------------------------------
|
||||||
|
FROM gotenberg-libreoffice AS gotenberg-aws-lambda-libreoffice
|
||||||
|
|
||||||
|
USER root
|
||||||
|
|
||||||
|
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.9.1 /lambda-adapter /opt/extensions/lambda-adapter
|
||||||
|
|
||||||
|
ENV AWS_LWA_PORT=3000
|
||||||
|
ENV AWS_LWA_READINESS_CHECK_PATH=/health
|
||||||
|
ENV AWS_LWA_INVOKE_MODE=buffered
|
||||||
|
ENV API_PORT_FROM_ENV=AWS_LWA_PORT
|
||||||
|
ENV WEBHOOK_ENABLE_SYNC_MODE=true
|
||||||
|
ENV GOTENBERG_BUILD_DEBUG_DATA=false
|
||||||
|
|
||||||
|
USER gotenberg
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
# Note: ARG instructions do not create additional layers.
|
|
||||||
# Instead, next layers will concatenate them.
|
|
||||||
ARG DOCKER_REPOSITORY
|
|
||||||
ARG GOTENBERG_VERSION
|
|
||||||
|
|
||||||
FROM $DOCKER_REPOSITORY/gotenberg:$GOTENBERG_VERSION
|
|
||||||
|
|
||||||
USER root
|
|
||||||
|
|
||||||
# For security reasons, the non-root user gotenberg does not own the Tini binary by default.
|
|
||||||
# However, some providers like Cloud Run from Google Cloud cannot start a Docker container in that case.
|
|
||||||
# See https://github.com/gotenberg/gotenberg/issues/90#issuecomment-543551353.
|
|
||||||
RUN chown gotenberg: /usr/bin/tini
|
|
||||||
|
|
||||||
USER gotenberg
|
|
||||||
34
build/capture-version.sh
Normal file
34
build/capture-version.sh
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Captures the version of a backing binary into a per-module file that the
|
||||||
|
# running Gotenberg process reads via gotenberg.BuildVersion, so it never spawns
|
||||||
|
# the binary just to report a version. This keeps cold start and the first
|
||||||
|
# request cheap, which matters on serverless platforms.
|
||||||
|
#
|
||||||
|
# Failure-tolerant by design: a probe that errors writes an empty file, and the
|
||||||
|
# runtime falls back to detecting the version live. A failing probe must never
|
||||||
|
# fail the image build.
|
||||||
|
#
|
||||||
|
# Usage: capture-version.sh <output-dir> <module-id> <bin> [args...]
|
||||||
|
set -u
|
||||||
|
|
||||||
|
dir="$1"
|
||||||
|
id="$2"
|
||||||
|
shift 2
|
||||||
|
|
||||||
|
mkdir -p "$dir"
|
||||||
|
|
||||||
|
# Run the probe once. On failure, keep going with empty output.
|
||||||
|
raw="$("$@" 2>/dev/null)" || raw=""
|
||||||
|
|
||||||
|
case "$id" in
|
||||||
|
pdfcpu)
|
||||||
|
# pdfcpu prints "pdfcpu: <version>"; keep only the part the runtime parser
|
||||||
|
# keeps so the recorded value matches the live-detection fallback.
|
||||||
|
version="$(printf '%s\n' "$raw" | grep -m1 '^pdfcpu:' | sed 's/^pdfcpu:[[:space:]]*//')"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
version="$(printf '%s\n' "$raw" | head -n1)"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
printf '%s' "$version" | tr -d '\r' >"$dir/$id"
|
||||||
File diff suppressed because one or more lines are too long
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-af.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-af.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-as.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-as.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-be.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-be.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-bg.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-bg.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-bn.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-bn.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-cs.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-cs.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-cu.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-cu.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-cy.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-cy.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-da.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-da.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-de-1901.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-de-1901.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-de-1996.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-de-1996.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-de-ch-1901.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-de-ch-1901.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-el.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-el.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-en-gb.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-en-gb.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-en-us.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-en-us.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-es.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-es.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-et.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-et.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-eu.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-eu.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-fr.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-fr.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-ga.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-ga.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-gl.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-gl.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-gu.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-gu.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-hi.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-hi.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-hr.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-hr.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-hu.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-hu.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-hy.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-hy.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-it.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-it.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-ka.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-ka.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-kn.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-kn.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-la.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-la.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-lt.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-lt.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-lv.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-lv.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-ml.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-ml.hyb
Normal file
Binary file not shown.
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-mn-cyrl.hyb
Normal file
BIN
build/chromium-hyphen-data/120.0.6050.0/hyph-mn-cyrl.hyb
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user