Initialize repository
This commit is contained in:
commit
55d5c67661
35 changed files with 1303 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
.envrc
|
33
Justfile
Normal file
33
Justfile
Normal file
|
@ -0,0 +1,33 @@
|
|||
pipeline_name := 'ci-images'
|
||||
target := 'main'
|
||||
|
||||
# Internal endpoint of the Docker registry, where no authentication is necessary
|
||||
registry_url := env_var_or_default('REGISTRY_URL', 'docker.io/')
|
||||
repo_url := shell("git remote get-url origin | sed 's|git@\\([^:]*\\):\\(.*\\).git|https://\\1/\\2|'")
|
||||
|
||||
pipeline_file := shell('mktemp')
|
||||
|
||||
build context dockerfile='' image_target='' *args='':
|
||||
fly -t {{target}} execute \
|
||||
--config=./tasks/build-image.yml \
|
||||
--privileged \
|
||||
-i repo=. \
|
||||
-o image=/tmp/build-image \
|
||||
-v context=repo/images/{{context}} \
|
||||
-v dockerfile={{dockerfile}} \
|
||||
-v target={{image_target}} \
|
||||
{{args}}
|
||||
|
||||
make-pipeline file:
|
||||
jinja2 --strict --outfile="{{file}}" pipelines/build-and-push.yml.j2 pipelines/build-and-push.json
|
||||
fly -t {{target}} validate-pipeline \
|
||||
--strict \
|
||||
--config "{{file}}" \
|
||||
-v registry_url={{registry_url}}
|
||||
|
||||
set-pipeline: (make-pipeline pipeline_file)
|
||||
fly -t {{target}} set-pipeline \
|
||||
--pipeline {{pipeline_name}} \
|
||||
--config "{{pipeline_file}}" \
|
||||
-v registry_url={{registry_url}} \
|
||||
-v repo_url={{repo_url}}
|
287
LICENSE
Normal file
287
LICENSE
Normal file
|
@ -0,0 +1,287 @@
|
|||
EUROPEAN UNION PUBLIC LICENCE v. 1.2
|
||||
EUPL © the European Union 2007, 2016
|
||||
|
||||
This European Union Public Licence (the ‘EUPL’) applies to the Work (as defined
|
||||
below) which is provided under the terms of this Licence. Any use of the Work,
|
||||
other than as authorised under this Licence is prohibited (to the extent such
|
||||
use is covered by a right of the copyright holder of the Work).
|
||||
|
||||
The Work is provided under the terms of this Licence when the Licensor (as
|
||||
defined below) has placed the following notice immediately following the
|
||||
copyright notice for the Work:
|
||||
|
||||
Licensed under the EUPL
|
||||
|
||||
or has expressed by any other means his willingness to license under the EUPL.
|
||||
|
||||
1. Definitions
|
||||
|
||||
In this Licence, the following terms have the following meaning:
|
||||
|
||||
- ‘The Licence’: this Licence.
|
||||
|
||||
- ‘The Original Work’: the work or software distributed or communicated by the
|
||||
Licensor under this Licence, available as Source Code and also as Executable
|
||||
Code as the case may be.
|
||||
|
||||
- ‘Derivative Works’: the works or software that could be created by the
|
||||
Licensee, based upon the Original Work or modifications thereof. This Licence
|
||||
does not define the extent of modification or dependence on the Original Work
|
||||
required in order to classify a work as a Derivative Work; this extent is
|
||||
determined by copyright law applicable in the country mentioned in Article 15.
|
||||
|
||||
- ‘The Work’: the Original Work or its Derivative Works.
|
||||
|
||||
- ‘The Source Code’: the human-readable form of the Work which is the most
|
||||
convenient for people to study and modify.
|
||||
|
||||
- ‘The Executable Code’: any code which has generally been compiled and which is
|
||||
meant to be interpreted by a computer as a program.
|
||||
|
||||
- ‘The Licensor’: the natural or legal person that distributes or communicates
|
||||
the Work under the Licence.
|
||||
|
||||
- ‘Contributor(s)’: any natural or legal person who modifies the Work under the
|
||||
Licence, or otherwise contributes to the creation of a Derivative Work.
|
||||
|
||||
- ‘The Licensee’ or ‘You’: any natural or legal person who makes any usage of
|
||||
the Work under the terms of the Licence.
|
||||
|
||||
- ‘Distribution’ or ‘Communication’: any act of selling, giving, lending,
|
||||
renting, distributing, communicating, transmitting, or otherwise making
|
||||
available, online or offline, copies of the Work or providing access to its
|
||||
essential functionalities at the disposal of any other natural or legal
|
||||
person.
|
||||
|
||||
2. Scope of the rights granted by the Licence
|
||||
|
||||
The Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
|
||||
sublicensable licence to do the following, for the duration of copyright vested
|
||||
in the Original Work:
|
||||
|
||||
- use the Work in any circumstance and for all usage,
|
||||
- reproduce the Work,
|
||||
- modify the Work, and make Derivative Works based upon the Work,
|
||||
- communicate to the public, including the right to make available or display
|
||||
the Work or copies thereof to the public and perform publicly, as the case may
|
||||
be, the Work,
|
||||
- distribute the Work or copies thereof,
|
||||
- lend and rent the Work or copies thereof,
|
||||
- sublicense rights in the Work or copies thereof.
|
||||
|
||||
Those rights can be exercised on any media, supports and formats, whether now
|
||||
known or later invented, as far as the applicable law permits so.
|
||||
|
||||
In the countries where moral rights apply, the Licensor waives his right to
|
||||
exercise his moral right to the extent allowed by law in order to make effective
|
||||
the licence of the economic rights here above listed.
|
||||
|
||||
The Licensor grants to the Licensee royalty-free, non-exclusive usage rights to
|
||||
any patents held by the Licensor, to the extent necessary to make use of the
|
||||
rights granted on the Work under this Licence.
|
||||
|
||||
3. Communication of the Source Code
|
||||
|
||||
The Licensor may provide the Work either in its Source Code form, or as
|
||||
Executable Code. If the Work is provided as Executable Code, the Licensor
|
||||
provides in addition a machine-readable copy of the Source Code of the Work
|
||||
along with each copy of the Work that the Licensor distributes or indicates, in
|
||||
a notice following the copyright notice attached to the Work, a repository where
|
||||
the Source Code is easily and freely accessible for as long as the Licensor
|
||||
continues to distribute or communicate the Work.
|
||||
|
||||
4. Limitations on copyright
|
||||
|
||||
Nothing in this Licence is intended to deprive the Licensee of the benefits from
|
||||
any exception or limitation to the exclusive rights of the rights owners in the
|
||||
Work, of the exhaustion of those rights or of other applicable limitations
|
||||
thereto.
|
||||
|
||||
5. Obligations of the Licensee
|
||||
|
||||
The grant of the rights mentioned above is subject to some restrictions and
|
||||
obligations imposed on the Licensee. Those obligations are the following:
|
||||
|
||||
Attribution right: The Licensee shall keep intact all copyright, patent or
|
||||
trademarks notices and all notices that refer to the Licence and to the
|
||||
disclaimer of warranties. The Licensee must include a copy of such notices and a
|
||||
copy of the Licence with every copy of the Work he/she distributes or
|
||||
communicates. The Licensee must cause any Derivative Work to carry prominent
|
||||
notices stating that the Work has been modified and the date of modification.
|
||||
|
||||
Copyleft clause: If the Licensee distributes or communicates copies of the
|
||||
Original Works or Derivative Works, this Distribution or Communication will be
|
||||
done under the terms of this Licence or of a later version of this Licence
|
||||
unless the Original Work is expressly distributed only under this version of the
|
||||
Licence — for example by communicating ‘EUPL v. 1.2 only’. The Licensee
|
||||
(becoming Licensor) cannot offer or impose any additional terms or conditions on
|
||||
the Work or Derivative Work that alter or restrict the terms of the Licence.
|
||||
|
||||
Compatibility clause: If the Licensee Distributes or Communicates Derivative
|
||||
Works or copies thereof based upon both the Work and another work licensed under
|
||||
a Compatible Licence, this Distribution or Communication can be done under the
|
||||
terms of this Compatible Licence. For the sake of this clause, ‘Compatible
|
||||
Licence’ refers to the licences listed in the appendix attached to this Licence.
|
||||
Should the Licensee's obligations under the Compatible Licence conflict with
|
||||
his/her obligations under this Licence, the obligations of the Compatible
|
||||
Licence shall prevail.
|
||||
|
||||
Provision of Source Code: When distributing or communicating copies of the Work,
|
||||
the Licensee will provide a machine-readable copy of the Source Code or indicate
|
||||
a repository where this Source will be easily and freely available for as long
|
||||
as the Licensee continues to distribute or communicate the Work.
|
||||
|
||||
Legal Protection: This Licence does not grant permission to use the trade names,
|
||||
trademarks, service marks, or names of the Licensor, except as required for
|
||||
reasonable and customary use in describing the origin of the Work and
|
||||
reproducing the content of the copyright notice.
|
||||
|
||||
6. Chain of Authorship
|
||||
|
||||
The original Licensor warrants that the copyright in the Original Work granted
|
||||
hereunder is owned by him/her or licensed to him/her and that he/she has the
|
||||
power and authority to grant the Licence.
|
||||
|
||||
Each Contributor warrants that the copyright in the modifications he/she brings
|
||||
to the Work are owned by him/her or licensed to him/her and that he/she has the
|
||||
power and authority to grant the Licence.
|
||||
|
||||
Each time You accept the Licence, the original Licensor and subsequent
|
||||
Contributors grant You a licence to their contributions to the Work, under the
|
||||
terms of this Licence.
|
||||
|
||||
7. Disclaimer of Warranty
|
||||
|
||||
The Work is a work in progress, which is continuously improved by numerous
|
||||
Contributors. It is not a finished work and may therefore contain defects or
|
||||
‘bugs’ inherent to this type of development.
|
||||
|
||||
For the above reason, the Work is provided under the Licence on an ‘as is’ basis
|
||||
and without warranties of any kind concerning the Work, including without
|
||||
limitation merchantability, fitness for a particular purpose, absence of defects
|
||||
or errors, accuracy, non-infringement of intellectual property rights other than
|
||||
copyright as stated in Article 6 of this Licence.
|
||||
|
||||
This disclaimer of warranty is an essential part of the Licence and a condition
|
||||
for the grant of any rights to the Work.
|
||||
|
||||
8. Disclaimer of Liability
|
||||
|
||||
Except in the cases of wilful misconduct or damages directly caused to natural
|
||||
persons, the Licensor will in no event be liable for any direct or indirect,
|
||||
material or moral, damages of any kind, arising out of the Licence or of the use
|
||||
of the Work, including without limitation, damages for loss of goodwill, work
|
||||
stoppage, computer failure or malfunction, loss of data or any commercial
|
||||
damage, even if the Licensor has been advised of the possibility of such damage.
|
||||
However, the Licensor will be liable under statutory product liability laws as
|
||||
far such laws apply to the Work.
|
||||
|
||||
9. Additional agreements
|
||||
|
||||
While distributing the Work, You may choose to conclude an additional agreement,
|
||||
defining obligations or services consistent with this Licence. However, if
|
||||
accepting obligations, You may act only on your own behalf and on your sole
|
||||
responsibility, not on behalf of the original Licensor or any other Contributor,
|
||||
and only if You agree to indemnify, defend, and hold each Contributor harmless
|
||||
for any liability incurred by, or claims asserted against such Contributor by
|
||||
the fact You have accepted any warranty or additional liability.
|
||||
|
||||
10. Acceptance of the Licence
|
||||
|
||||
The provisions of this Licence can be accepted by clicking on an icon ‘I agree’
|
||||
placed under the bottom of a window displaying the text of this Licence or by
|
||||
affirming consent in any other similar way, in accordance with the rules of
|
||||
applicable law. Clicking on that icon indicates your clear and irrevocable
|
||||
acceptance of this Licence and all of its terms and conditions.
|
||||
|
||||
Similarly, you irrevocably accept this Licence and all of its terms and
|
||||
conditions by exercising any rights granted to You by Article 2 of this Licence,
|
||||
such as the use of the Work, the creation by You of a Derivative Work or the
|
||||
Distribution or Communication by You of the Work or copies thereof.
|
||||
|
||||
11. Information to the public
|
||||
|
||||
In case of any Distribution or Communication of the Work by means of electronic
|
||||
communication by You (for example, by offering to download the Work from a
|
||||
remote location) the distribution channel or media (for example, a website) must
|
||||
at least provide to the public the information requested by the applicable law
|
||||
regarding the Licensor, the Licence and the way it may be accessible, concluded,
|
||||
stored and reproduced by the Licensee.
|
||||
|
||||
12. Termination of the Licence
|
||||
|
||||
The Licence and the rights granted hereunder will terminate automatically upon
|
||||
any breach by the Licensee of the terms of the Licence.
|
||||
|
||||
Such a termination will not terminate the licences of any person who has
|
||||
received the Work from the Licensee under the Licence, provided such persons
|
||||
remain in full compliance with the Licence.
|
||||
|
||||
13. Miscellaneous
|
||||
|
||||
Without prejudice of Article 9 above, the Licence represents the complete
|
||||
agreement between the Parties as to the Work.
|
||||
|
||||
If any provision of the Licence is invalid or unenforceable under applicable
|
||||
law, this will not affect the validity or enforceability of the Licence as a
|
||||
whole. Such provision will be construed or reformed so as necessary to make it
|
||||
valid and enforceable.
|
||||
|
||||
The European Commission may publish other linguistic versions or new versions of
|
||||
this Licence or updated versions of the Appendix, so far this is required and
|
||||
reasonable, without reducing the scope of the rights granted by the Licence. New
|
||||
versions of the Licence will be published with a unique version number.
|
||||
|
||||
All linguistic versions of this Licence, approved by the European Commission,
|
||||
have identical value. Parties can take advantage of the linguistic version of
|
||||
their choice.
|
||||
|
||||
14. Jurisdiction
|
||||
|
||||
Without prejudice to specific agreement between parties,
|
||||
|
||||
- any litigation resulting from the interpretation of this License, arising
|
||||
between the European Union institutions, bodies, offices or agencies, as a
|
||||
Licensor, and any Licensee, will be subject to the jurisdiction of the Court
|
||||
of Justice of the European Union, as laid down in article 272 of the Treaty on
|
||||
the Functioning of the European Union,
|
||||
|
||||
- any litigation arising between other parties and resulting from the
|
||||
interpretation of this License, will be subject to the exclusive jurisdiction
|
||||
of the competent court where the Licensor resides or conducts its primary
|
||||
business.
|
||||
|
||||
15. Applicable Law
|
||||
|
||||
Without prejudice to specific agreement between parties,
|
||||
|
||||
- this Licence shall be governed by the law of the European Union Member State
|
||||
where the Licensor has his seat, resides or has his registered office,
|
||||
|
||||
- this licence shall be governed by Belgian law if the Licensor has no seat,
|
||||
residence or registered office inside a European Union Member State.
|
||||
|
||||
Appendix
|
||||
|
||||
‘Compatible Licences’ according to Article 5 EUPL are:
|
||||
|
||||
- GNU General Public License (GPL) v. 2, v. 3
|
||||
- GNU Affero General Public License (AGPL) v. 3
|
||||
- Open Software License (OSL) v. 2.1, v. 3.0
|
||||
- Eclipse Public License (EPL) v. 1.0
|
||||
- CeCILL v. 2.0, v. 2.1
|
||||
- Mozilla Public Licence (MPL) v. 2
|
||||
- GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3
|
||||
- Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for
|
||||
works other than software
|
||||
- European Union Public Licence (EUPL) v. 1.1, v. 1.2
|
||||
- Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong
|
||||
Reciprocity (LiLiQ-R+).
|
||||
|
||||
The European Commission may update this Appendix to later versions of the above
|
||||
licences without producing a new version of the EUPL, as long as they provide
|
||||
the rights granted in Article 2 of this Licence and protect the covered Source
|
||||
Code from exclusive appropriation.
|
||||
|
||||
All other changes or additions to this Appendix require the production of a new
|
||||
EUPL version.
|
3
README.md
Normal file
3
README.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
# CI Images
|
||||
|
||||
A collection of Dockerfiles used as task images for project CI at https://ci.sclu1034.dev.
|
1
images/base/Dockerfile
Normal file
1
images/base/Dockerfile
Normal file
|
@ -0,0 +1 @@
|
|||
FROM debian:bullseye-slim
|
2
images/beancount-import/.dockerignore
Normal file
2
images/beancount-import/.dockerignore
Normal file
|
@ -0,0 +1,2 @@
|
|||
Dockerfile
|
||||
.dockerignore
|
24
images/beancount-import/Dockerfile
Normal file
24
images/beancount-import/Dockerfile
Normal file
|
@ -0,0 +1,24 @@
|
|||
FROM python:3.12.3-slim
|
||||
|
||||
COPY requirements.txt /tmp
|
||||
|
||||
RUN set -eux; \
|
||||
pip3 install --break-system-packages -r /tmp/requirements.txt; \
|
||||
rm -rf \
|
||||
/root/.cache \
|
||||
/tmp/requirements.txt \
|
||||
;
|
||||
|
||||
WORKDIR /beancount-import
|
||||
COPY . .
|
||||
|
||||
ENV BEANCOUNT_IMPORT_ARGS="" \
|
||||
BEANCOUNT_IMPORT_JOURNAL_DIR="/beancount-import/journal" \
|
||||
BEANCOUNT_IMPORT_DATA_DIR="/beancount-import/data"
|
||||
|
||||
EXPOSE 8080
|
||||
|
||||
VOLUME ${BEANCOUNT_IMPORT_DATA_DIR}
|
||||
VOLUME ${BEANCOUNT_IMPORT_JOURNAL_DIR}
|
||||
|
||||
CMD python3 /beancount-import/run.py --address 0.0.0.0 --port 8080 ${BEANCOUNT_IMPORT_ARGS}
|
45
images/beancount-import/_config.py
Normal file
45
images/beancount-import/_config.py
Normal file
|
@ -0,0 +1,45 @@
|
|||
"""
|
||||
This config is where you would initialize your importers with personal info
|
||||
like account number or credit card last4 digit.
|
||||
|
||||
you may also define CONFIG:List[ImporterProtocol] for other beancount tools like
|
||||
bean-identify, bean-file, and other beancount scripts to use
|
||||
eg. `bean-identify _config.py ~/Downloads`
|
||||
to identify the files that importers defined here can process
|
||||
|
||||
|
||||
beancount-import should have it's own run.py where you invoke the
|
||||
`beancount_import.webserver.main` but import the Importer objects from this config
|
||||
|
||||
This is the way!!
|
||||
"""
|
||||
from beancount.ingest.importers.csv import Importer as CSVImporter, Col
|
||||
|
||||
my_foobar_bank_importer = CSVImporter(
|
||||
{
|
||||
Col.DATE: "Date",
|
||||
Col.NARRATION1: "Description",
|
||||
Col.AMOUNT: "Amount",
|
||||
},
|
||||
"Assets:FooBarBank", # account
|
||||
"EUR", # currency
|
||||
# regexps used by ImporterProtocol.identify() to identify the correct file
|
||||
'"Date","Description","Amount"',
|
||||
)
|
||||
|
||||
my_amex_cc_importer = CSVImporter(
|
||||
{
|
||||
Col.DATE: "Date",
|
||||
Col.NARRATION1: "Description",
|
||||
Col.AMOUNT: "Amount",
|
||||
Col.BALANCE: "Balance",
|
||||
},
|
||||
"Liabilities:Amex-Credit-Card", # account
|
||||
"EUR", # currency
|
||||
# regexps used by ImporterProtocol.identify() to identify the correct file
|
||||
("Date,Description,Amount,Balance", "Credit.*7890"),
|
||||
skip_lines=1,
|
||||
)
|
||||
|
||||
# beancount's scripts use this
|
||||
CONFIG = [my_foobar_bank_importer, my_amex_cc_importer]
|
2
images/beancount-import/requirements.txt
Normal file
2
images/beancount-import/requirements.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
beancount-import==1.3.5
|
||||
smart_importer==0.5
|
31
images/beancount-import/run.py
Normal file
31
images/beancount-import/run.py
Normal file
|
@ -0,0 +1,31 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
from _config import data_sources
|
||||
|
||||
|
||||
def run_reconcile(extra_args):
|
||||
import beancount_import.webserver
|
||||
|
||||
journal_dir = os.environ["BEANCOUNT_IMPORT_JOURNAL_DIR"]
|
||||
|
||||
beancount_import.webserver.main(
|
||||
extra_args,
|
||||
journal_input=os.path.join(journal_dir, "main.beancount"),
|
||||
ignored_journal=os.path.join(journal_dir, "ignored.beancount"),
|
||||
default_output=os.path.join(journal_dir, "main.beancount"),
|
||||
open_account_output_map=[
|
||||
(".*", os.path.join(journal_dir, "accounts.beancount")),
|
||||
],
|
||||
balance_account_output_map=[
|
||||
(".*", os.path.join(journal_dir, "accounts.beancount")),
|
||||
],
|
||||
price_output=os.path.join(journal_dir, "prices.beancount"),
|
||||
data_sources=data_sources,
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
run_reconcile(sys.argv[1:])
|
63
images/fava/Dockerfile
Normal file
63
images/fava/Dockerfile
Normal file
|
@ -0,0 +1,63 @@
|
|||
ARG BEANCOUNT_VERSION=2.3.6
|
||||
ARG FAVA_VERSION=1.27.3
|
||||
|
||||
FROM node:lts-slim as node_build_env
|
||||
ARG FAVA_VERSION
|
||||
|
||||
RUN set -eux; \
|
||||
apt-get update; \
|
||||
apt-get install -y python3-babel git make;
|
||||
|
||||
RUN git clone --depth 1 --branch v${FAVA_VERSION} https://github.com/beancount/fava /tmp/build/fava
|
||||
|
||||
WORKDIR /tmp/build/fava
|
||||
RUN set -eux; \
|
||||
make -j $(nproc); \
|
||||
rm -rf .*cache .eggs .tox build dist frontend/node_modules; \
|
||||
find . -type f -name '*.py[c0]' -delete; \
|
||||
find . -type d -name "__pycache__" -delete
|
||||
|
||||
FROM python:3.12.3-slim as build_env
|
||||
ARG BEANCOUNT_VERSION
|
||||
|
||||
RUN set -eux; \
|
||||
apt-get update; \
|
||||
apt-get install -y build-essential libxml2-dev libxslt-dev curl git;
|
||||
|
||||
ENV PATH "/app/bin:$PATH"
|
||||
RUN python -mvenv /app
|
||||
COPY --from=node_build_env /tmp/build/fava /tmp/build/fava
|
||||
|
||||
RUN git clone --depth 1 --branch ${BEANCOUNT_VERSION} https://github.com/beancount/beancount /tmp/build/beancount
|
||||
|
||||
WORKDIR /tmp/build/beancount
|
||||
RUN set -eux; \
|
||||
CFLAGS=-s pip3 install -U /tmp/build/beancount; \
|
||||
pip3 install -U /tmp/build/fava; \
|
||||
pip3 install \
|
||||
beancount-reds-plugins \
|
||||
git+https://github.com/andreasgerstmayr/fava-dashboards.git \
|
||||
git+https://github.com/beancount/beangrow.git \
|
||||
git+https://github.com/redstreet/fava_investor.git \
|
||||
git+https://github.com/daniel-wells/beancount_checkclosed.git \
|
||||
git+https://github.com/PhracturedBlue/fava-portfolio-summary.git \
|
||||
git+https://github.com/polarmutex/fava-envelope.git \
|
||||
git+https://github.com/scauligi/refried.git \
|
||||
git+https://github.com/beancount/beanprice.git@41576e2ac889e4825e4985b6f6c56aa71de28304 \
|
||||
; \
|
||||
pip3 uninstall -y pip; \
|
||||
find /app -name __pycache__ -exec rm -rf -v {} +
|
||||
|
||||
FROM python:3.12.3-slim
|
||||
COPY --from=build_env /app /app
|
||||
|
||||
# Default fava port number
|
||||
EXPOSE 5000
|
||||
|
||||
ENV BEAN_ROOT ""
|
||||
ENV BEANCOUNT_FILE ""
|
||||
|
||||
ENV FAVA_HOST "0.0.0.0"
|
||||
ENV PATH "/app/bin:$PATH"
|
||||
|
||||
CMD ["fava"]
|
32
images/fluentd/Dockerfile
Normal file
32
images/fluentd/Dockerfile
Normal file
|
@ -0,0 +1,32 @@
|
|||
FROM fluent/fluentd:v1.16.1
|
||||
|
||||
USER root
|
||||
|
||||
# The recommendation is to install gems here. But in practice,
|
||||
# the `geoip` plugin will fail if done so, because for unknown reasons,
|
||||
# it wouldn't be able to find the `geoip2_c` gem, even though that would
|
||||
# be installed successfully.
|
||||
# The only way to get that plugin working is to use the `--gemfile` flag
|
||||
# to have them installed at startup.
|
||||
# Hence why we need to blow up this image with a bunch of dev dependencies.
|
||||
RUN set -eux; \
|
||||
apk add --no-cache --virtual .build-deps \
|
||||
binutils \
|
||||
autoconf \
|
||||
automake \
|
||||
gcc \
|
||||
geoip-dev \
|
||||
gettext \
|
||||
libmaxminddb-dev \
|
||||
libtool \
|
||||
make \
|
||||
musl-dev \
|
||||
ruby-dev \
|
||||
; \
|
||||
# fluentd needs this directory when installing Gems
|
||||
mkdir /etc/fluentd; \
|
||||
chown fluent:fluent /etc/fluentd
|
||||
|
||||
USER fluent
|
||||
|
||||
COPY Gemfile /etc/fluentd/Gemfile
|
10
images/fluentd/Gemfile
Normal file
10
images/fluentd/Gemfile
Normal file
|
@ -0,0 +1,10 @@
|
|||
source 'https://rubygems.org'
|
||||
|
||||
gem 'fluentd'
|
||||
gem 'geoip2_c'
|
||||
gem 'fluent-plugin-geoip'
|
||||
gem 'fluent-plugin-prometheus'
|
||||
gem 'fluent-plugin-ua-parser'
|
||||
gem 'fluent-plugin-grafana-loki'
|
||||
gem 'fluent-plugin-stdout-pp'
|
||||
gem 'fluent-plugin-parser-logfmt'
|
14
images/forgejo/Dockerfile
Normal file
14
images/forgejo/Dockerfile
Normal file
|
@ -0,0 +1,14 @@
|
|||
FROM codeberg.org/forgejo/forgejo:8.0.0
|
||||
|
||||
RUN apk --no-cache add \
|
||||
asciidoctor \
|
||||
freetype \
|
||||
freetype-dev \
|
||||
gcc \
|
||||
g++ \
|
||||
libpng \
|
||||
libffi-dev \
|
||||
py-pip \
|
||||
python3-dev \
|
||||
py3-pip \
|
||||
py3-pyzmq
|
18
images/frp/Dockerfile
Normal file
18
images/frp/Dockerfile
Normal file
|
@ -0,0 +1,18 @@
|
|||
ARG FRP_VERSION=0.60.0
|
||||
|
||||
FROM scratch AS src
|
||||
|
||||
ARG FRP_VERSION
|
||||
ADD https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}/frp_${FRP_VERSION}_linux_amd64.tar.gz /frp.tar.gz
|
||||
|
||||
|
||||
FROM alpine:3.8
|
||||
|
||||
ARG FRP_VERSION
|
||||
|
||||
RUN --mount=from=src,target=/src <<EOF
|
||||
tar -xf /src/frp.tar.gz -C /usr/local/bin --strip-component=1 frp_${FRP_VERSION}_linux_amd64/frpc frp_${FRP_VERSION}_linux_amd64/frps
|
||||
EOF
|
||||
|
||||
VOLUME /etc/frp
|
||||
WORKDIR /
|
19
images/gotenberg/Dockerfile
Normal file
19
images/gotenberg/Dockerfile
Normal file
|
@ -0,0 +1,19 @@
|
|||
FROM gotenberg/gotenberg:7.10.2
|
||||
|
||||
USER root
|
||||
|
||||
RUN set -eux; \
|
||||
apt-get update -qq; \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends -t bookworm-backports libreoffice-l10n-de; \
|
||||
sed -i '/de_DE.UTF-8/s/^# //g' /etc/locale.gen; \
|
||||
locale-gen; \
|
||||
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /var/log/*;
|
||||
|
||||
# Adjust user for Unraid
|
||||
RUN usermod -u 2000 -g 100 gotenberg
|
||||
|
||||
ENV LANG de_DE.UTF-8
|
||||
ENV LANGUAGE de_DE:de
|
||||
ENV LC_ALL de_DE.UTF-8
|
||||
|
||||
USER gotenberg
|
155
images/lua-clib/Dockerfile
Normal file
155
images/lua-clib/Dockerfile
Normal file
|
@ -0,0 +1,155 @@
|
|||
ARG LUA_5_1_VERSION=5.1.5
|
||||
ARG LUA_5_2_VERSION=5.2.4
|
||||
ARG LUA_5_3_VERSION=5.3.6
|
||||
ARG LUA_5_4_VERSION=5.4.4
|
||||
ARG LUAROCKS_VERSION=3.10.0
|
||||
ARG DART_SASS_VERSION=1.71.1
|
||||
ARG NODE_VERSION=20.11.1
|
||||
|
||||
FROM debian:bookworm-slim AS builder
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
WORKDIR /build
|
||||
|
||||
RUN --mount=type=cache,target=/var/cache/apt,id=builder-apt \
|
||||
set -e; \
|
||||
apt-get update; \
|
||||
apt-get install -y --no-install-recommends --no-install-suggests \
|
||||
ca-certificates \
|
||||
cmake \
|
||||
gcc \
|
||||
g++ \
|
||||
libc-dev \
|
||||
libreadline-dev \
|
||||
make \
|
||||
unzip \
|
||||
wget \
|
||||
xz-utils \
|
||||
; \
|
||||
mkdir /usr/local/stow;
|
||||
|
||||
FROM builder AS lua51
|
||||
|
||||
ARG LUA_5_1_VERSION
|
||||
ADD http://www.lua.org/ftp/lua-${LUA_5_1_VERSION}.tar.gz /build/lua-5.1.tar.gz
|
||||
RUN set -e; \
|
||||
tar -xzf /build/lua-5.1.tar.gz; \
|
||||
cd lua-${LUA_5_1_VERSION}/src; \
|
||||
make -j $(nproc) all MYCFLAGS="-DLUA_USE_LINUX -fPIC" MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses"; \
|
||||
cd ..; \
|
||||
make INSTALL_TOP=/usr/local/stow/lua5.1 install;
|
||||
|
||||
FROM builder AS lua52
|
||||
|
||||
ARG LUA_5_2_VERSION
|
||||
ADD http://www.lua.org/ftp/lua-${LUA_5_2_VERSION}.tar.gz /build/lua-5.2.tar.gz
|
||||
RUN set -e; \
|
||||
tar -xzf /build/lua-5.2.tar.gz; \
|
||||
cd lua-${LUA_5_2_VERSION}/src; \
|
||||
make -j $(nproc) linux MYCFLAGS="-fPIC"; \
|
||||
make -j $(nproc) all MYCFLAGS="-DLUA_USE_LINUX -fPIC" MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses"; \
|
||||
cd ..; \
|
||||
make INSTALL_TOP=/usr/local/stow/lua5.2 install;
|
||||
|
||||
FROM builder AS lua53
|
||||
|
||||
ARG LUA_5_3_VERSION
|
||||
ADD http://www.lua.org/ftp/lua-${LUA_5_3_VERSION}.tar.gz /build/lua-5.3.tar.gz
|
||||
RUN set -e; \
|
||||
tar -xzf /build/lua-5.3.tar.gz; \
|
||||
cd lua-${LUA_5_3_VERSION}/src; \
|
||||
make -j $(nproc) linux MYCFLAGS="-fPIC"; \
|
||||
cd ..; \
|
||||
make INSTALL_TOP=/usr/local/stow/lua5.3 install;
|
||||
|
||||
FROM builder AS lua54
|
||||
|
||||
ARG LUA_5_4_VERSION
|
||||
ADD http://www.lua.org/ftp/lua-${LUA_5_4_VERSION}.tar.gz /build/lua-5.4.tar.gz
|
||||
RUN set -e; \
|
||||
tar -xzf /build/lua-5.4.tar.gz; \
|
||||
cd lua-${LUA_5_4_VERSION}/src; \
|
||||
make -j $(nproc) linux MYCFLAGS="-fPIC"; \
|
||||
cd ..; \
|
||||
make INSTALL_TOP=/usr/local/stow/lua5.4 install;
|
||||
|
||||
ARG LUAROCKS_VERSION
|
||||
ADD https://luarocks.org/releases/luarocks-${LUAROCKS_VERSION}.tar.gz /build/luarocks.tar.gz
|
||||
|
||||
RUN set -e; \
|
||||
tar -xzf /build/luarocks.tar.gz; \
|
||||
cd luarocks-${LUAROCKS_VERSION}; \
|
||||
./configure --prefix=/usr/local/stow/luarocks --with-lua=/usr/local/stow/lua5.4; \
|
||||
make -j $(nproc); \
|
||||
make install;
|
||||
|
||||
FROM builder AS dart
|
||||
|
||||
ARG DART_SASS_VERSION
|
||||
ADD https://github.com/sass/dart-sass/releases/download/${DART_SASS_VERSION}/dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz /build/sass.tar.gz
|
||||
RUN tar -xzf /build/sass.tar.gz -C /usr/local/bin --strip-components=1 dart-sass/sass;
|
||||
|
||||
FROM builder AS node
|
||||
|
||||
ARG NODE_VERSION
|
||||
ADD https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz /build/node.tar.xz
|
||||
|
||||
RUN set -e; \
|
||||
mkdir -p /usr/local/stow/node; \
|
||||
tar -xJf /build/node.tar.xz \
|
||||
-C /usr/local/stow/node \
|
||||
--strip-components=1 \
|
||||
--wildcards \
|
||||
--no-wildcards-match-slash '*/bin/' '*/include/' '*/lib/';
|
||||
|
||||
FROM debian:bookworm-slim AS final
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN --mount=type=cache,target=/var/cache/apt,id=apt \
|
||||
set -e; \
|
||||
apt-get update; \
|
||||
apt-get install -y --no-install-recommends --no-install-suggests \
|
||||
ca-certificates \
|
||||
cmake \
|
||||
curl \
|
||||
gcc \
|
||||
g++ \
|
||||
libc-dev \
|
||||
libreadline-dev \
|
||||
make \
|
||||
sudo \
|
||||
unzip \
|
||||
wget\
|
||||
stow \
|
||||
; \
|
||||
apt-get remove --auto-remove vim; \
|
||||
rm -rf \
|
||||
/usr/share/cmake-*/Help \
|
||||
/var/lib/apt/lists/* \
|
||||
/var/log/* \
|
||||
/usr/local/share/doc/* \
|
||||
/usr/local/share/man/* \
|
||||
/usr/share/doc/* \
|
||||
/usr/share/man/* \
|
||||
;
|
||||
|
||||
COPY --from=lua51 /usr/local /usr/local
|
||||
COPY --from=lua52 /usr/local /usr/local
|
||||
COPY --from=lua53 /usr/local /usr/local
|
||||
COPY --from=lua54 /usr/local /usr/local
|
||||
COPY --from=node /usr/local /usr/local
|
||||
COPY --from=dart /usr/local /usr/local
|
||||
|
||||
RUN --mount=type=cache,target=/var/cache/luarocks \
|
||||
set -e; \
|
||||
stow -d /usr/local/stow -t /usr luarocks; \
|
||||
stow -d /usr/local/stow -t /usr node; \
|
||||
luarocks install ldoc; \
|
||||
luarocks install lua-discount
|
||||
|
||||
WORKDIR /
|
||||
|
||||
COPY pkgconfig/*.pc /usr/lib/pkgconfig/
|
||||
COPY enable-lua disable-lua run-with-lua /usr/bin/
|
2
images/lua-clib/disable-lua
Executable file
2
images/lua-clib/disable-lua
Executable file
|
@ -0,0 +1,2 @@
|
|||
#!/bin/sh
|
||||
stow -d /usr/local/stow -t /usr -D "lua$1"
|
5
images/lua-clib/enable-lua
Executable file
5
images/lua-clib/enable-lua
Executable file
|
@ -0,0 +1,5 @@
|
|||
#!/bin/sh
|
||||
stow -d /usr/local/stow -t /usr -S "lua$1"
|
||||
# Sometimes, most often with 5.4, a build fails to install rocks claiming that this
|
||||
# directory was missing/couldn't be created. Simply create it to avoid the error.
|
||||
mkdir -p /usr/lib/luarocks/rock-$1
|
20
images/lua-clib/pkgconfig/lua5.1.pc
Normal file
20
images/lua-clib/pkgconfig/lua5.1.pc
Normal file
|
@ -0,0 +1,20 @@
|
|||
V=5.1
|
||||
R=5.1.5
|
||||
|
||||
prefix=/usr/local/stow/lua${V}
|
||||
INSTALL_BIN=${prefix}/bin
|
||||
INSTALL_INC=${prefix}/include
|
||||
INSTALL_LIB=${prefix}/lib
|
||||
INSTALL_MAN=${prefix}/man/man1
|
||||
INSTALL_LMOD=${prefix}/share/lua/${V}
|
||||
INSTALL_CMOD=${prefix}/lib/lua/${V}
|
||||
exec_prefix=${prefix}
|
||||
libdir=${exec_prefix}/lib
|
||||
includedir=${prefix}/include
|
||||
|
||||
Name: Lua
|
||||
Description: An Extensible Extension Language
|
||||
Version: ${R}
|
||||
Requires:
|
||||
Libs: -L${libdir} -llua -lm
|
||||
Cflags: -I${includedir}
|
20
images/lua-clib/pkgconfig/lua5.2.pc
Normal file
20
images/lua-clib/pkgconfig/lua5.2.pc
Normal file
|
@ -0,0 +1,20 @@
|
|||
V=5.2
|
||||
R=5.2.4
|
||||
|
||||
prefix=/usr/local/stow/lua${V}
|
||||
INSTALL_BIN=${prefix}/bin
|
||||
INSTALL_INC=${prefix}/include
|
||||
INSTALL_LIB=${prefix}/lib
|
||||
INSTALL_MAN=${prefix}/man/man1
|
||||
INSTALL_LMOD=${prefix}/share/lua/${V}
|
||||
INSTALL_CMOD=${prefix}/lib/lua/${V}
|
||||
exec_prefix=${prefix}
|
||||
libdir=${exec_prefix}/lib
|
||||
includedir=${prefix}/include
|
||||
|
||||
Name: Lua
|
||||
Description: An Extensible Extension Language
|
||||
Version: ${R}
|
||||
Requires:
|
||||
Libs: -L${libdir} -llua -lm
|
||||
Cflags: -I${includedir}
|
20
images/lua-clib/pkgconfig/lua5.3.pc
Normal file
20
images/lua-clib/pkgconfig/lua5.3.pc
Normal file
|
@ -0,0 +1,20 @@
|
|||
V=5.3
|
||||
R=5.3.6
|
||||
|
||||
prefix=/usr/local/stow/lua${V}
|
||||
INSTALL_BIN=${prefix}/bin
|
||||
INSTALL_INC=${prefix}/include
|
||||
INSTALL_LIB=${prefix}/lib
|
||||
INSTALL_MAN=${prefix}/man/man1
|
||||
INSTALL_LMOD=${prefix}/share/lua/${V}
|
||||
INSTALL_CMOD=${prefix}/lib/lua/${V}
|
||||
exec_prefix=${prefix}
|
||||
libdir=${exec_prefix}/lib
|
||||
includedir=${prefix}/include
|
||||
|
||||
Name: Lua
|
||||
Description: An Extensible Extension Language
|
||||
Version: ${R}
|
||||
Requires:
|
||||
Libs: -L${libdir} -llua -lm
|
||||
Cflags: -I${includedir}
|
20
images/lua-clib/pkgconfig/lua5.4.pc
Normal file
20
images/lua-clib/pkgconfig/lua5.4.pc
Normal file
|
@ -0,0 +1,20 @@
|
|||
V=5.4
|
||||
R=5.4.4
|
||||
|
||||
prefix=/usr/local/stow/lua${V}
|
||||
INSTALL_BIN=${prefix}/bin
|
||||
INSTALL_INC=${prefix}/include
|
||||
INSTALL_LIB=${prefix}/lib
|
||||
INSTALL_MAN=${prefix}/man/man1
|
||||
INSTALL_LMOD=${prefix}/share/lua/${V}
|
||||
INSTALL_CMOD=${prefix}/lib/lua/${V}
|
||||
exec_prefix=${prefix}
|
||||
libdir=${exec_prefix}/lib
|
||||
includedir=${prefix}/include
|
||||
|
||||
Name: Lua
|
||||
Description: An Extensible Extension Language
|
||||
Version: ${R}
|
||||
Requires:
|
||||
Libs: -L${libdir} -llua -lm
|
||||
Cflags: -I${includedir}
|
13
images/lua-clib/run-with-lua
Executable file
13
images/lua-clib/run-with-lua
Executable file
|
@ -0,0 +1,13 @@
|
|||
#!/bin/sh
|
||||
|
||||
LUA_VERSION="$1"
|
||||
shift
|
||||
|
||||
sudo enable-lua "$LUA_VERSION"
|
||||
|
||||
"$@"
|
||||
ret=$!
|
||||
|
||||
sudo disable-lua "$LUA_VERSION"
|
||||
|
||||
exit $ret
|
42
images/nextcloud/Dockerfile
Normal file
42
images/nextcloud/Dockerfile
Normal file
|
@ -0,0 +1,42 @@
|
|||
FROM nextcloud:28.0.6-apache
|
||||
|
||||
ARG YTDLP_VERSION=2024.05.27
|
||||
# Debian ships node.js v18, make sure that the pageres version supports that
|
||||
ARG PAGERES_VERSION=8.0.0
|
||||
|
||||
RUN set -ex; \
|
||||
apt-get update; \
|
||||
apt-get install -y --no-install-recommends --no-install-suggests \
|
||||
aria2 \
|
||||
cifs-utils \
|
||||
clamav \
|
||||
ffmpeg \
|
||||
libnss3 \
|
||||
libbz2-dev \
|
||||
nodejs \
|
||||
npm \
|
||||
smbclient \
|
||||
p7zip \
|
||||
p7zip-full \
|
||||
python3-pip \
|
||||
unzip \
|
||||
wget \
|
||||
; \
|
||||
docker-php-ext-install bz2; \
|
||||
npm install --global pageres-cli@${PAGERES_VERSION} puppeteer; \
|
||||
npx puppeteer browsers install chrome; \
|
||||
curl -L -o /usr/local/bin/youtube-dl https://github.com/yt-dlp/yt-dlp/releases/download/${YTDLP_VERSION}/yt-dlp; \
|
||||
chmod +rx /usr/local/bin/youtube-dl; \
|
||||
apt-get remove -y --auto-remove ${PHPIZE_DEPS}; \
|
||||
rm -rf \
|
||||
/var/lib/apt/lists/* \
|
||||
/var/log/*/.log /var/log/apt/* \
|
||||
/usr/src/php.tar* \
|
||||
/usr/share/man/* \
|
||||
/usr/share/doc/* \
|
||||
/usr/share/doc-base/* \
|
||||
/usr/local/php/man/* \
|
||||
/root/.cache \
|
||||
/root/.npm
|
||||
|
||||
COPY ./php-pgsql.ini /etc/php8/conf.d/pgsql.ini
|
11
images/nextcloud/php-pgsql.ini
Normal file
11
images/nextcloud/php-pgsql.ini
Normal file
|
@ -0,0 +1,11 @@
|
|||
# configuration for PHP PostgreSQL module
|
||||
extension=pdo_pgsql.so
|
||||
extension=pgsql.so
|
||||
|
||||
[PostgresSQL]
|
||||
pgsql.allow_persistent = On
|
||||
pgsql.auto_reset_persistent = Off
|
||||
pgsql.max_persistent = 25
|
||||
pgsql.max_links = 30
|
||||
pgsql.ignore_notice = 0
|
||||
pgsql.log_notice = 0
|
31
images/node-script/Dockerfile
Normal file
31
images/node-script/Dockerfile
Normal file
|
@ -0,0 +1,31 @@
|
|||
FROM node:20.17.0-slim
|
||||
|
||||
# No need for root access for a script runner
|
||||
RUN useradd -m -d /home/runner -s /bin/bash runner;
|
||||
WORKDIR /home/runner
|
||||
USER runner
|
||||
|
||||
ENV NODE_ENV=production
|
||||
ENV NPM_CONFIG_PREFIX=/home/runner/.npm-global
|
||||
ENV PATH=/home/runner/.npm-global/bin:$PATH
|
||||
|
||||
RUN set -e; \
|
||||
npm install --global --audit=false \
|
||||
npm@10.5.0 \
|
||||
bluebird \
|
||||
lodash \
|
||||
moment \
|
||||
shelljs \
|
||||
js-yaml \
|
||||
got \
|
||||
; \
|
||||
rm -r \
|
||||
/home/runner/.npm/_cacache \
|
||||
/home/runner/.npm/_logs \
|
||||
/var/log/* \
|
||||
/usr/local/share/doc/* \
|
||||
/usr/local/share/man/* \
|
||||
/usr/share/doc/* \
|
||||
/usr/share/man/* \
|
||||
/tmp/* \
|
||||
;
|
36
images/python-script/Dockerfile
Normal file
36
images/python-script/Dockerfile
Normal file
|
@ -0,0 +1,36 @@
|
|||
FROM python:3.12.5-slim-bookworm
|
||||
|
||||
LABEL version=1.1.0
|
||||
|
||||
RUN set -e; \
|
||||
apt-get update -q; \
|
||||
apt-get install -qy --no-install-recommends --no-install-suggests \
|
||||
bc \
|
||||
curl \
|
||||
dash \
|
||||
gettext \
|
||||
git \
|
||||
jq \
|
||||
; \
|
||||
apt-get clean; \
|
||||
rm -rf \
|
||||
/var/cache/apt/* \
|
||||
/var/lib/apt/lists/* \
|
||||
/var/log/* \
|
||||
/usr/local/share/doc/* \
|
||||
/usr/local/share/man/* \
|
||||
/usr/share/doc/* \
|
||||
/usr/share/man/* \
|
||||
;
|
||||
|
||||
# No need for root access for a script runner
|
||||
RUN useradd -m -d /home/runner -s /bin/bash runner;
|
||||
WORKDIR /home/runner
|
||||
USER runner
|
||||
|
||||
ENV PATH=/home/runner/.local/bin:$PATH
|
||||
|
||||
RUN set -e; \
|
||||
pip install --upgrade pip; \
|
||||
pip install --user numpy httpie giteapy docker xq yp spotify requests; \
|
||||
rm -r /home/runner/.cache;
|
26
images/ruby-script/Dockerfile
Normal file
26
images/ruby-script/Dockerfile
Normal file
|
@ -0,0 +1,26 @@
|
|||
FROM ruby:3.1.6-slim-bookworm
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
RUN --mount=type=cache,target=/var/cache/apt,id=apt \
|
||||
set -e; \
|
||||
apt-get update; \
|
||||
apt-get install -y --no-install-recommends --no-install-suggests \
|
||||
gcc \
|
||||
make \
|
||||
; \
|
||||
apt-get clean; \
|
||||
rm -rf \
|
||||
/var/lib/apt/lists/* \
|
||||
/var/log/* \
|
||||
/usr/share/doc/* \
|
||||
/usr/share/man/* \
|
||||
;
|
||||
|
||||
# No need for root access for a script runner
|
||||
RUN useradd -m -d /home/runner -s /bin/bash runner;
|
||||
WORKDIR /home/runner
|
||||
USER runner
|
||||
|
||||
ENV PATH=/home/runner/.local/share/gem/ruby/3.1.0/bin:$PATH
|
||||
|
||||
RUN gem install --user_install json docker-api;
|
125
images/rust-xwin/Dockerfile
Normal file
125
images/rust-xwin/Dockerfile
Normal file
|
@ -0,0 +1,125 @@
|
|||
# https://jake-shadle.github.io/xwin/
|
||||
FROM debian:bullseye-slim AS xwin-download
|
||||
|
||||
ARG MANIFEST_VERSION=16
|
||||
ARG XWIN_VERSION=0.6.5
|
||||
ARG XWIN_PREFIX="xwin-$XWIN_VERSION-x86_64-unknown-linux-musl"
|
||||
ADD https://github.com/Jake-Shadle/xwin/releases/download/$XWIN_VERSION/$XWIN_PREFIX.tar.gz /root/$XWIN_PREFIX.tar.gz
|
||||
|
||||
RUN set -eux; \
|
||||
# Install xwin to cargo/bin via github release. Note you could also just use `cargo install xwin`.
|
||||
tar -xzv -f /root/$XWIN_PREFIX.tar.gz -C /usr/bin --strip-components=1 $XWIN_PREFIX/xwin; \
|
||||
rm -f /root/$XWIN_PREFIX.tar.gz;
|
||||
|
||||
RUN set -eux; \
|
||||
# Splat the CRT and SDK files to /xwin/crt and /xwin/sdk respectively
|
||||
xwin \
|
||||
--log-level debug \
|
||||
--cache-dir /root/.xwin-cache \
|
||||
--manifest-version ${MANIFEST_VERSION} \
|
||||
--accept-license \
|
||||
splat \
|
||||
--output /xwin; \
|
||||
# Even though this build step only exists temporary to copy the
|
||||
# final data out of, it still generates a cache entry on the Docker host.
|
||||
# And to keep that to a minimum, we still delete the stuff we don't need.
|
||||
rm -rf /root/.xwin-cache;
|
||||
|
||||
FROM rust:slim-bullseye AS rust-xwin
|
||||
|
||||
ARG LLVM_VERSION=18
|
||||
ENV KEYRINGS=/usr/local/share/keyrings
|
||||
|
||||
ADD https://apt.llvm.org/llvm-snapshot.gpg.key /root/llvm-snapshot.gpg.key
|
||||
ADD https://dl.winehq.org/wine-builds/winehq.key /root/winehq.key
|
||||
|
||||
RUN set -eux; \
|
||||
apt-get update; \
|
||||
apt-get install -y --no-install-recommends \
|
||||
ca-certificates \
|
||||
gpg \
|
||||
; \
|
||||
mkdir -p $KEYRINGS; \
|
||||
gpg --dearmor > $KEYRINGS/llvm.gpg < /root/llvm-snapshot.gpg.key; \
|
||||
gpg --dearmor > $KEYRINGS/winehq.gpg < /root/winehq.key; \
|
||||
echo "deb [signed-by=$KEYRINGS/llvm.gpg] http://apt.llvm.org/bullseye/ llvm-toolchain-bullseye-${LLVM_VERSION} main" > /etc/apt/sources.list.d/llvm.list; \
|
||||
echo "deb [signed-by=$KEYRINGS/winehq.gpg] https://dl.winehq.org/wine-builds/debian/ bullseye main" > /etc/apt/sources.list.d/winehq.list; \
|
||||
dpkg --add-architecture i386; \
|
||||
apt-get update; \
|
||||
apt-get install --no-install-recommends --no-install-suggests -y \
|
||||
libclang-${LLVM_VERSION}-dev \
|
||||
gcc-mingw-w64-x86-64 \
|
||||
clang-${LLVM_VERSION} \
|
||||
llvm-${LLVM_VERSION} \
|
||||
lld-${LLVM_VERSION} \
|
||||
winehq-staging \
|
||||
; \
|
||||
# ensure that clang/clang++ are callable directly
|
||||
ln -s clang-${LLVM_VERSION} /usr/bin/clang && ln -s clang /usr/bin/clang++ && ln -s lld-${LLVM_VERSION} /usr/bin/ld.lld; \
|
||||
# We also need to setup symlinks ourselves for the MSVC shims because they aren't in the debian packages
|
||||
ln -s clang-${LLVM_VERSION} /usr/bin/clang-cl && ln -s llvm-ar-${LLVM_VERSION} /usr/bin/llvm-lib && ln -s lld-link-${LLVM_VERSION} /usr/bin/lld-link; \
|
||||
# Verify the symlinks are correct
|
||||
clang++ -v; \
|
||||
ld.lld -v; \
|
||||
# Doesn't have an actual -v/--version flag, but it still exits with 0
|
||||
llvm-lib -v; \
|
||||
clang-cl -v; \
|
||||
lld-link --version; \
|
||||
# Use clang instead of gcc when compiling and linking binaries targeting the host (eg proc macros, build files)
|
||||
update-alternatives --install /usr/bin/cc cc /usr/bin/clang 100; \
|
||||
update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++ 100; \
|
||||
update-alternatives --install /usr/bin/ld ld /usr/bin/ld.lld 100; \
|
||||
rustup target add x86_64-pc-windows-msvc; \
|
||||
rustup default stable-x86_64-pc-windows-msvc; \
|
||||
rustup component add rust-src; \
|
||||
rustup update; \
|
||||
apt-get remove -y --auto-remove \
|
||||
gpg \
|
||||
; \
|
||||
rm -rf \
|
||||
/var/lib/apt/lists/* \
|
||||
/root/*.key;
|
||||
|
||||
COPY --from=xwin-download /xwin /xwin
|
||||
|
||||
# Note that we're using the full target triple for each variable instead of the
|
||||
# simple CC/CXX/AR shorthands to avoid issues when compiling any C/C++ code for
|
||||
# build dependencies that need to compile and execute in the host environment
|
||||
ENV CC_x86_64_pc_windows_msvc="clang-cl" \
|
||||
CXX_x86_64_pc_windows_msvc="clang-cl" \
|
||||
AR_x86_64_pc_windows_msvc="llvm-lib" \
|
||||
# wine can be quite spammy with log messages and they're generally uninteresting
|
||||
WINEDEBUG="-all" \
|
||||
# Use wine to run test executables
|
||||
CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_RUNNER="wine" \
|
||||
# Note that we only disable unused-command-line-argument here since clang-cl
|
||||
# doesn't implement all of the options supported by cl, but the ones it doesn't
|
||||
# are _generally_ not interesting.
|
||||
CL_FLAGS="-Wno-unused-command-line-argument -fuse-ld=lld-link /imsvc/xwin/crt/include /imsvc/xwin/sdk/include/ucrt /imsvc/xwin/sdk/include/um /imsvc/xwin/sdk/include/shared" \
|
||||
# Let cargo know what linker to invoke if you haven't already specified it
|
||||
# in a .cargo/config.toml file
|
||||
CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_LINKER="lld-link" \
|
||||
CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_RUSTFLAGS="-Lnative=/xwin/crt/lib/x86_64 -Lnative=/xwin/sdk/lib/um/x86_64 -Lnative=/xwin/sdk/lib/ucrt/x86_64"
|
||||
|
||||
# These are separate since docker/podman won't transform environment variables defined in the same ENV block
|
||||
ENV CFLAGS_x86_64_pc_windows_msvc="$CL_FLAGS" \
|
||||
CXXFLAGS_x86_64_pc_windows_msvc="$CL_FLAGS"
|
||||
|
||||
WORKDIR /src/plugin
|
||||
|
||||
# Run wineboot just to setup the default WINEPREFIX so we don't do it every
|
||||
# container run
|
||||
RUN wine wineboot --init
|
||||
|
||||
FROM rust-xwin AS rust-xwin-ci
|
||||
|
||||
RUN set -eux; \
|
||||
apt-get update; \
|
||||
apt-get install --no-install-recommends -y \
|
||||
git \
|
||||
jq \
|
||||
; \
|
||||
sh -c "git config --global --add safe.directory '*'"; \
|
||||
apt-get remove -y --auto-remove; \
|
||||
rm -rf /var/lib/apt/lists/*;
|
||||
|
56
pipelines/build-and-push.json
Normal file
56
pipelines/build-and-push.json
Normal file
|
@ -0,0 +1,56 @@
|
|||
{
|
||||
"images": [
|
||||
{
|
||||
"type": "simple",
|
||||
"name": "lua-clib"
|
||||
},
|
||||
{
|
||||
"type": "simple",
|
||||
"name": "python-script"
|
||||
},
|
||||
{
|
||||
"type": "simple",
|
||||
"name": "node-script"
|
||||
},
|
||||
{
|
||||
"type": "simple",
|
||||
"name": "ruby-script"
|
||||
},
|
||||
{
|
||||
"type": "simple",
|
||||
"name": "base"
|
||||
},
|
||||
{
|
||||
"type": "simple",
|
||||
"name": "nextcloud"
|
||||
},
|
||||
{
|
||||
"type": "simple",
|
||||
"name": "gotenberg"
|
||||
},
|
||||
{
|
||||
"type": "simple",
|
||||
"name": "fluentd"
|
||||
},
|
||||
{
|
||||
"type": "simple",
|
||||
"name": "forgejo"
|
||||
},
|
||||
{
|
||||
"type": "simple",
|
||||
"name": "beancount-import"
|
||||
},
|
||||
{
|
||||
"type": "simple",
|
||||
"name": "frp"
|
||||
},
|
||||
{
|
||||
"type": "simple",
|
||||
"name": "fava"
|
||||
},
|
||||
{
|
||||
"type": "file",
|
||||
"name": "rust-xwin"
|
||||
}
|
||||
]
|
||||
}
|
43
pipelines/build-and-push.yml.j2
Normal file
43
pipelines/build-and-push.yml.j2
Normal file
|
@ -0,0 +1,43 @@
|
|||
{%- import 'jobs/simple-image.yml.j2' as simple_image %}
|
||||
{%- macro simple_image_resource(name, registry_url) -%}
|
||||
- name: image-{{ name }}
|
||||
type: registry-image
|
||||
icon: docker
|
||||
source:
|
||||
repository: "{{ registry_url }}/{{ name }}"
|
||||
{% endmacro -%}
|
||||
---
|
||||
|
||||
resource_types:
|
||||
- name: github-release
|
||||
type: registry-image
|
||||
source:
|
||||
repository: concourse/github-release-resource
|
||||
|
||||
resources:
|
||||
- name: repo
|
||||
type: git
|
||||
icon: github
|
||||
source:
|
||||
uri: ((repo_url))
|
||||
branch: master
|
||||
|
||||
{%- set registry_url = "((registry_url))" %}
|
||||
{% for img in images -%}
|
||||
{%- if img.type == "simple" %}
|
||||
{{ simple_image_resource(img.name, registry_url) }}
|
||||
{%- elif img.type == "file" %}
|
||||
{%- import "jobs/" + img.name + ".yml.j2" as job %}
|
||||
{{ job.resources(registry_url) }}
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
|
||||
jobs:
|
||||
{%- for img in images %}
|
||||
{%- if img.type == "simple" %}
|
||||
{{ simple_image.jobs(img) }}
|
||||
{%- elif img.type == "file" %}
|
||||
{%- import "jobs/" + img.name + ".yml.j2" as job %}
|
||||
{{ job.jobs() }}
|
||||
{%- endif %}
|
||||
{% endfor %}
|
46
pipelines/jobs/rust-xwin.yml.j2
Normal file
46
pipelines/jobs/rust-xwin.yml.j2
Normal file
|
@ -0,0 +1,46 @@
|
|||
{% macro resources(registry_url) -%}
|
||||
- name: image-rust-xwin
|
||||
type: registry-image
|
||||
icon: docker
|
||||
source:
|
||||
repository: "{{ registry_url }}/rust-xwin"
|
||||
|
||||
- name: image-rust-xwin-ci
|
||||
type: registry-image
|
||||
icon: docker
|
||||
source:
|
||||
repository: "{{ registry_url }}/rust-xwin-ci"
|
||||
{% endmacro %}
|
||||
|
||||
{% macro jobs() -%}
|
||||
- name: rust-xwin
|
||||
plan:
|
||||
- get: repo
|
||||
trigger: true
|
||||
- in_parallel:
|
||||
fail_fast: true
|
||||
steps:
|
||||
- task: build-rust-xwin
|
||||
file: repo/tasks/build.yml
|
||||
vars:
|
||||
context: images/rust-xwin
|
||||
target: rust-xwin
|
||||
additional_targets: rust-xwin-ci
|
||||
output_mapping:
|
||||
image: image-rust-xwin
|
||||
- task: build-rust-xwin-ci
|
||||
file: repo/tasks/build.yml
|
||||
vars:
|
||||
context: images/rust-xwin
|
||||
target: rust-xwin-ci
|
||||
output_mapping:
|
||||
image: image-rust-xwin-ci
|
||||
- in_parallel:
|
||||
steps:
|
||||
- put: image-rust-xwin
|
||||
params:
|
||||
image: image-rust-xwin/image.tar
|
||||
- put: image-rust-xwin-ci
|
||||
params:
|
||||
image: image-rust-xwin-ci/image.tar
|
||||
{% endmacro %}
|
19
pipelines/jobs/simple-image.yml.j2
Normal file
19
pipelines/jobs/simple-image.yml.j2
Normal file
|
@ -0,0 +1,19 @@
|
|||
{% macro jobs(job) -%}
|
||||
- name: {{ job.name }}
|
||||
plan:
|
||||
- get: repo
|
||||
trigger: true
|
||||
- task: build-image
|
||||
privileged: true
|
||||
file: repo/tasks/build.yml
|
||||
vars:
|
||||
context: images/{{ job.name }}
|
||||
{%- if "args" in job %}
|
||||
params:
|
||||
{%- for name, value in job.args.items() %}
|
||||
BUILD_ARG_{{name}}: "{{value}}"
|
||||
{%- endfor %}
|
||||
{%- endif %}
|
||||
- put: image-{{ job.name }}
|
||||
params: { image: image/image.tar }
|
||||
{%- endmacro -%}
|
28
tasks/build-image.yml
Normal file
28
tasks/build-image.yml
Normal file
|
@ -0,0 +1,28 @@
|
|||
# yaml-language-server: $schema=https://raw.githubusercontent.com/cappyzawa/concourse-pipeline-jsonschema/master/concourse_jsonschema.json#/definitions/TaskConfig
|
||||
---
|
||||
platform: linux
|
||||
|
||||
image_resource:
|
||||
name: image
|
||||
type: registry-image
|
||||
source:
|
||||
repository: concourse/oci-build-task
|
||||
tag: latest
|
||||
|
||||
inputs:
|
||||
- name: repo
|
||||
|
||||
outputs:
|
||||
- name: image
|
||||
|
||||
caches:
|
||||
- path: cache
|
||||
- path: /var/cache
|
||||
|
||||
params:
|
||||
CONTEXT: ((context))
|
||||
DOCKERFILE: ((dockerfile))
|
||||
TARGET: ((target))
|
||||
|
||||
run:
|
||||
path: build
|
Loading…
Add table
Reference in a new issue