Commit 61147001 authored by Garrett Beaty's avatar Garrett Beaty Committed by Commit Bot

Enable starlark "generation" of the LUCI services configuration.

The configuration is "generated" by copying the hand-written files to
the generated subdirectory. The LUCI project configuration must be
updated to point at the new location before the hand-written
configuration files can be removed in favor of being actually generated
by starlark.

Bug: 1011908
Change-Id: I81349a96876315045694df809ab1fbf6c28ce91d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1845698
Auto-Submit: Garrett Beaty <gbeaty@chromium.org>
Reviewed-by: default avatarJohn Budorick <jbudorick@chromium.org>
Commit-Queue: John Budorick <jbudorick@chromium.org>
Cr-Commit-Position: refs/heads/master@{#703525}
parent 37edc4d2
......@@ -41,6 +41,11 @@ def _CommonChecks(input_api, output_api):
kwargs={}, message=output_api.PresubmitError),
)
commands.extend(input_api.canned_checks.CheckLucicfgGenOutput(
input_api, output_api, 'main.star'))
commands.extend(input_api.canned_checks.CheckLucicfgGenOutput(
input_api, output_api, 'dev.star'))
commands.extend(input_api.canned_checks.GetUnitTestsRecursively(
input_api, output_api,
input_api.os_path.join(input_api.PresubmitLocalPath()),
......
......@@ -9,3 +9,17 @@ For example, [cr-buildbucket.cfg](cr-buildbucket.cfg) defines builders.
Currently active version can be checked at
https://luci-config.appspot.com/#/projects/chromium .
The configuration files are currently in the process of being migrated to
lucicfg/starlark. If a hand-written configuration file is still present
alongside this file, you can modify that file directly.
The remainder of the configuration files are generated by starlark. The starlark
configuration is rooted in main.star and dev.star, which execute other starlark
files to generate a subset of the LUCI service configuration files to the
`generated` subdirectory. A presubmit check enforces that the generated files
are kept in sync with the generated output of the starlark configuration.
The starlark configuration also copies over the not-yet migrated files to the
`generated` directory, so updating the hand-written configuration files will
require re-'generating' the configuration.
#!/usr/bin/env lucicfg
# Tell lucicfg what files it is allowed to touch
lucicfg.config(
config_dir = 'generated',
tracked_files = [
'cr-buildbucket-dev.cfg',
'luci-logdog-dev.cfg',
'luci-milo-dev.cfg',
'luci-scheduler-dev.cfg',
],
fail_on_warnings = True,
)
# Copy the not-yet migrated files to the generated outputs
# TODO(https://crbug.com/1011908) Migrate the configuration in these files to starlark
[lucicfg.emit(dest = f, data = io.read_file(f)) for f in (
'cr-buildbucket-dev.cfg',
'luci-logdog-dev.cfg',
'luci-milo-dev.cfg',
'luci-scheduler-dev.cfg',
)]
This diff is collapsed.
# Defines buckets on cr-buildbucket-dev.appspot.com, used by to schedule builds
# on buildbot. In particular, CQ uses some of these buckets to schedule tryjobs.
#
# See http://luci-config.appspot.com/schemas/projects:buildbucket.cfg for
# schema of this file and documentation. Also see README.md in this dir.
#
# Please keep this list sorted by bucket name.
acl_sets {
# This is pure-LUCI w/o buildbot.
name: "default"
acls {
role: READER
group: "all"
}
acls {
role: SCHEDULER
identity: "luci-scheduler-dev@appspot.gserviceaccount.com"
}
}
acl_sets {
name: "tryserver"
acls {
role: READER
group: "all"
}
acls {
role: SCHEDULER
group: "project-chromium-tryjob-access"
}
acls {
role: SCHEDULER
group: "service-account-cq"
}
acls {
role: SCHEDULER
identity: "findit-for-me@appspot.gserviceaccount.com"
}
acls {
role: WRITER
group: "service-account-chromium-tryserver"
}
}
builder_mixins {
name: "swarm-ci"
dimensions: "cpu:x86-64"
recipe {
name: "swarming/staging"
properties: "mastername:chromium.swarm"
}
}
builder_mixins {
name: "xcode-mac-9a235"
caches: {
name: "xcode_mac_9a235"
path: "xcode_mac_9a235.app"
}
recipe {
properties_j: <<END
$depot_tools/osx_sdk: {
"sdk_version": "9a235"
}
END
}
}
buckets {
name: "luci.chromium.ci"
acl_sets: "default"
acls {
role: SCHEDULER
# Support builder triggering other builders in the same bucket.
identity: "chromium-ci-builder-dev@chops-service-accounts.iam.gserviceaccount.com"
}
acls {
# Allow task force to bump next build number.
role: WRITER
group: "google/luci-task-force@google.com"
}
swarming {
hostname: "chromium-swarm-dev.appspot.com"
builder_defaults {
category: "Chromium"
execution_timeout_secs: 10800 # 3h
service_account: "chromium-ci-builder-dev@chops-service-accounts.iam.gserviceaccount.com"
swarming_tags: "vpython:native-python-wrapper"
build_numbers: YES
recipe {
cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
cipd_version: "refs/heads/master"
name: "chromium"
}
}
builders {
name: "Android N5 Swarm"
dimensions: "os:Ubuntu-16.04"
mixins: "swarm-ci"
}
builders {
name: "Android N5X Swarm"
dimensions: "os:Ubuntu-16.04"
mixins: "swarm-ci"
}
builders {
name: "ChromeOS Swarm"
dimensions: "os:Ubuntu-16.04"
mixins: "swarm-ci"
}
builders {
name: "Linux Swarm"
dimensions: "os:Ubuntu-16.04"
mixins: "swarm-ci"
}
builders {
name: "Mac Swarm"
dimensions: "os:Mac-10.13"
mixins: "swarm-ci"
}
builders {
name: "Windows Swarm"
dimensions: "os:Windows-10"
mixins: "swarm-ci"
}
}
}
buckets {
name: "luci.chromium.cron"
acl_sets: "default"
acls {
role: SCHEDULER
identity: "snapshot-builder@chops-service-accounts.iam.gserviceaccount.com"
}
swarming {
hostname: "chromium-swarm-dev.appspot.com"
builders {
name: "Snapshot Builder"
dimensions: "os:Ubuntu-16.04"
execution_timeout_secs: 3600
service_account: "snapshot-builder@chops-service-accounts.iam.gserviceaccount.com"
recipe {
cipd_package: "infra/recipe_bundles/chromium.googlesource.com/infra/infra"
cipd_version: "refs/heads/master"
name: "snapshots/builder"
}
}
builders {
name: "Snapshots"
execution_timeout_secs: 3600
recipe {
cipd_package: "infra/recipe_bundles/chromium.googlesource.com/infra/infra"
cipd_version: "refs/heads/master"
name: "snapshots/snapshot"
}
}
}
}
buckets {
name: "try"
acl_sets: "tryserver"
swarming {
hostname: "chromium-swarm-dev.appspot.com"
builder_defaults {
category: "Chromium CQ"
service_account: "chromium-try-builder-dev@chops-service-accounts.iam.gserviceaccount.com"
# Max. pending time for builds. CQ considers builds pending >2h as timed
# out: http://shortn/_8PaHsdYmlq. Keep this in sync.
expiration_secs: 7200 # 2h
execution_timeout_secs: 14400 # 4h
swarming_tags: "vpython:native-python-wrapper"
build_numbers: YES
# Adds dimension: "builder:<builder name>" to ensure builder affinity.
# To "assign" a bot to a builder, bot config of swarming service should
# add the same dimension to the bot.
auto_builder_dimension: YES
recipe {
cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
cipd_version: "refs/heads/master"
name: "chromium_trybot"
properties_j: "$kitchen:{\"git_auth\": true, \"devshell\": true}"
}
}
builders {
name: "mac_upload_clang"
dimensions: "os:Mac"
mixins: "xcode-mac-9a235"
recipe {
name: "chromium_upload_clang"
properties: "mastername:tryserver.chromium.mac"
}
}
}
}
This diff is collapsed.
# Copyright (c) 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# For the schema of this file and documentation, see ProjectConfig message in
# https://luci-config.appspot.com/schemas/projects:luci-logdog.cfg
# Auth groups who can read log streams.
reader_auth_groups: "all"
# Auth groups who can register and emit new log streams.
writer_auth_groups: "luci-logdog-chromium-dev-writers"
# The base Google Storage archival path for this project.
#
# Archived LogDog logs will be written to this bucket/path.
archive_gs_bucket: "chromium-luci-logdog"
# Copyright (c) 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# For the schema of this file and documentation, see ProjectConfig message in
# https://luci-config.appspot.com/schemas/projects:luci-logdog.cfg
# Auth groups who can read log streams.
reader_auth_groups: "all"
# Auth groups who can register and emit new log streams.
writer_auth_groups: "luci-logdog-chromium-writers"
# The base Google Storage archival path for this project.
#
# Archived LogDog logs will be written to this bucket/path.
archive_gs_bucket: "chromium-luci-logdog"
logo_url: "https://storage.googleapis.com/chrome-infra-public/logo/chromium.svg"
headers: {
id: "chromium"
oncalls: {
name: "Chromium"
url: "https://build.chromium.org/p/chromium/sheriff.json"
}
oncalls: {
name: "Android"
url: "https://build.chromium.org/p/chromium/sheriff_android.json"
}
oncalls: {
name: "iOS"
url: "https://build.chromium.org/p/chromium/sheriff_ios.json"
}
oncalls: {
name: "CrOS MTV"
url: "https://build.chromium.org/p/chromium/sheriff_cros_mtv.json"
}
oncalls: {
name: "CrOS non-MTV"
url: "https://build.chromium.org/p/chromium/sheriff_cros_nonmtv.json"
}
oncalls: {
name: "ChromeOS Gardener"
url: "https://build.chromium.org/p/chromium/sheriff_cr_cros_gardeners.json"
}
oncalls: {
name: "GPU"
url: "https://build.chromium.org/p/chromium/sheriff_gpu.json"
}
oncalls: {
name: "Angle"
url: "https://build.chromium.org/p/chromium/sheriff_angle.json"
}
oncalls: {
name: "Perf"
url: "https://build.chromium.org/p/chromium/sheriff_perf.json"
}
oncalls: {
name: "Perfbot"
url: "https://build.chromium.org/p/chromium/sheriff_perfbot.json"
}
oncalls: {
name: "V8"
url: "https://build.chromium.org/p/chromium/sheriff_v8.json"
}
oncalls: {
name: "Trooper"
url: "https://build.chromium.org/p/chromium/trooper.json"
}
links: {
name: "Builds"
links: {
text: "continuous"
url: "https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html"
alt: "Continuous browser snapshots"
}
links: {
text: "symbols"
url: "https://www.chromium.org/developers/how-tos/debugging-on-windows"
alt: "Windows Symbols"
}
links: {
text: "status"
url: "https://chromium-status.appspot.com/"
alt: "Current tree status"
}
}
links: {
name: "Dashboards"
links: {
text: "perf"
url: "https://chromeperf.appspot.com/"
alt: "Chrome perf dashboard"
}
links {
text: "flake-portal"
url: "https://analysis.chromium.org/p/chromium/flake-portal"
alt: "New flake portal"
}
links {
text: "legacy-flakiness"
url: "https://test-results.appspot.com/dashboards/flakiness_dashboard.html"
alt: "Legacy flakiness dashboard"
}
}
links: {
name: "Chromium"
links: {
text: "source"
url: "https://chromium.googlesource.com/chromium/src"
alt: "Chromium source code repository"
}
links: {
text: "reviews"
url: "https://chromium-review.googlesource.com"
alt: "Chromium code review tool"
}
links: {
text: "bugs"
url: "https://crbug.com"
alt: "Chromium bug tracker"
}
links: {
text: "dev"
url: "https://dev.chromium.org/Home"
alt: "Chromium developer home page"
}
links: {
text: "support"
url: "https://support.google.com/chrome/#topic=7438008"
alt: "Google Chrome help center"
}
}
links: {
name: "Consoles"
links: {
text: "swarm"
url: "/p/chromium/g/chromium.swarm"
alt: "Chromium Swarm console"
}
links: {
text: "prod"
url: "https://luci-milo.appspot.com/p/chromium/g/main/console"
alt: "Main luci-milo console"
}
}
links: {
name: "Navigate"
links: {
text: "about"
url: "http://dev.chromium.org/developers/testing/chromium-build-infrastructure/tour-of-the-chromium-buildbot"
alt: "Tour of the console"
}
links: {
text: "customize"
url: "https://chromium.googlesource.com/chromium/src/+/master/infra/config/luci-milo-dev.cfg"
alt: "Customize this console"
}
}
tree_status_host: "chromium-status.appspot.com"
}
consoles {
header_id: "chromium"
id: "chromium.swarm"
name: "chromium.swarm"
repo_url: "https://chromium.googlesource.com/chromium/src"
refs: "refs/heads/master"
manifest_name: "REVISION"
builders {
name: "buildbucket/luci.chromium.ci/Android N5 Swarm"
}
builders {
name: "buildbucket/luci.chromium.ci/Android N5X Swarm"
}
builders {
name: "buildbucket/luci.chromium.ci/ChromeOS Swarm"
}
builders {
name: "buildbucket/luci.chromium.ci/Linux Swarm"
}
builders {
name: "buildbucket/luci.chromium.ci/Mac Swarm"
}
builders {
name: "buildbucket/luci.chromium.ci/Windows Swarm"
}
}
consoles {
id: "snapshots"
builder_view_only: true
header_id: "chromium"
manifest_name: "REVISION"
name: "Snapshot Builder"
builders {
name: "buildbucket/luci.chromium.cron/Snapshot Builder"
}
builders {
name: "buildbucket/luci.chromium.cron/Snapshots"
}
}
This diff is collapsed.
# Defines email notifications for builders.
# See schema at
# https://chromium.googlesource.com/infra/luci/luci-go/+/master/luci_notify/api/config/notify.proto
#
# Please keep this list sorted by name.
notifiers {
name: "chromesec-lkgr-failures"
notifications {
on_change: true
on_success: false
on_failure: false
on_new_failure: false
email {
recipients: "chromesec-lkgr-failures@google.com"
}
}
builders {
name: "ASAN Debug"
bucket: "ci"
}
builders {
name: "ASAN Release"
bucket: "ci"
}
builders {
name: "ASAN Release Media"
bucket: "ci"
}
builders {
name: "ASan Debug (32-bit x86 with V8-ARM)"
bucket: "ci"
}
builders {
name: "ASan Release (32-bit x86 with V8-ARM)"
bucket: "ci"
}
builders {
name: "ASan Release Media (32-bit x86 with V8-ARM)"
bucket: "ci"
}
builders {
name: "Afl Upload Linux ASan"
bucket: "ci"
}
builders {
name: "ChromiumOS ASAN Release"
bucket: "ci"
}
builders {
name: "Libfuzzer Upload Chrome OS ASan"
bucket: "ci"
}
builders {
name: "Libfuzzer Upload Linux32 ASan"
bucket: "ci"
}
builders {
name: "Libfuzzer Upload Linux32 ASan Debug"
bucket: "ci"
}
builders {
name: "Libfuzzer Upload Linux32 V8-ARM ASan"
bucket: "ci"
}
builders {
name: "Libfuzzer Upload Linux32 V8-ARM ASan Debug"
bucket: "ci"
}
builders {
name: "Libfuzzer Upload Linux ASan"
bucket: "ci"
}
builders {
name: "Libfuzzer Upload Linux ASan Debug"
bucket: "ci"
}
builders {
name: "Libfuzzer Upload Linux V8-ARM64 ASan"
bucket: "ci"
}
builders {
name: "Libfuzzer Upload Linux V8-ARM64 ASan Debug"
bucket: "ci"
}
builders {
name: "Libfuzzer Upload Linux MSan"
bucket: "ci"
}
builders {
name: "Libfuzzer Upload Linux UBSan"
bucket: "ci"
}
# TODO(crbug.com/790372): Enable notifications for the mac bot when it gets
# flipped to luci.
#builders {
# name: "Libfuzzer Upload Mac ASan"
# bucket: "ci"
#}
builders {
name: "Libfuzzer Upload Windows ASan"
bucket: "ci"
}
builders {
name: "MSAN Release (chained origins)"
bucket: "ci"
}
builders {
name: "MSAN Release (no origins)"
bucket: "ci"
}
builders {
name: "Mac ASAN Release"
bucket: "ci"
}
builders {
name: "Mac ASAN Release Media"
bucket: "ci"
}
builders {
name: "TSAN Debug"
bucket: "ci"
}
builders {
name: "TSAN Release"
bucket: "ci"
}
builders {
name: "UBSan Release"
bucket: "ci"
}
builders {
name: "UBSan vptr Release"
bucket: "ci"
}
builders {
name: "Win ASan Release"
bucket: "ci"
}
builders {
name: "Win ASan Release Media"
bucket: "ci"
}
}
notifiers {
name: "chrome-memory-sheriffs"
notifications {
on_change: true
on_success: false
on_failure: false
on_new_failure: false
email {
recipients: "chrome-memory-sheriffs+bots@google.com"
}
}
builders {
name: "Memory Infra tester"
bucket: "ci"
}
}
notifiers {
name: "cr-fuchsia"
notifications {
on_change: true
email {
recipients: "cr-fuchsia+bot@chromium.org"
}
}
builders {
name: "Fuchsia ARM64"
bucket: "ci"
}
builders {
name: "Fuchsia x64"
bucket: "ci"
}
builders {
name: "fuchsia-arm64-cast"
bucket: "ci"
}
builders {
name: "fuchsia-fyi-arm64-rel"
bucket: "ci"
}
builders {
name: "fuchsia-fyi-x64-dbg"
bucket: "ci"
}
builders {
name: "fuchsia-fyi-x64-rel"
bucket: "ci"
}
builders {
name: "fuchsia-x64-cast"
bucket: "ci"
}
builders {
name: "fuchsia-x64-dbg"
bucket: "ci"
}
}
notifiers {
name: "cronet"
notifications {
on_change: true
email {
recipients: "cronet-bots-observer@google.com"
}
}
builders {
name: "android-cronet-arm-dbg"
bucket: "ci"
}
builders {
name: "android-cronet-arm-rel"
bucket: "ci"
}
builders {
name: "android-cronet-arm64-dbg"
bucket: "ci"
}
builders {
name: "android-cronet-arm64-rel"
bucket: "ci"
}
builders {
name: "android-cronet-asan-arm-rel"
bucket: "ci"
}
builders {
name: "android-cronet-kitkat-arm-rel"
bucket: "ci"
}
builders {
name: "android-cronet-lollipop-arm-rel"
bucket: "ci"
}
builders {
name: "android-cronet-marshmallow-arm-rel"
bucket: "ci"
}
builders {
name: "android-cronet-marshmallow-arm64-rel"
bucket: "ci"
}
builders {
name: "android-cronet-marshmallow-arm64-perf-rel"
bucket: "ci"
}
builders {
name: "android-cronet-x86-dbg"
bucket: "ci"
}
builders {
name: "android-cronet-x86-rel"
bucket: "ci"
}
builders {
name: "ios-simulator-cronet"
bucket: "ci"
}
}
notifiers {
name: "release-tarballs"
notifications {
on_success: false
on_failure: true
email {
recipients: "raphael.kubo.da.costa@intel.com"
recipients: "thestig@chromium.org"
recipients: "thomasanderson@chromium.org"
}
}
builders {
name: "Build From Tarball"
bucket: "cron"
}
builders {
name: "publish_tarball"
bucket: "cron"
}
}
# Defines jobs on luci-scheduler-dev.appspot.com.
#
# For schema of this file and documentation see ProjectConfig message in
#
# https://chromium.googlesource.com/infra/luci/luci-go/+/master/scheduler/appengine/messages/config.proto
acl_sets {
name: "default"
acls {
role: READER
granted_to: "group:all"
}
acls {
role: OWNER
granted_to: "group:project-chromium-admins"
}
}
################################################################################
# Master branch
trigger {
id: "master-gitiles-trigger"
acl_sets: "default"
gitiles: {
repo: "https://chromium.googlesource.com/chromium/src.git"
refs: "refs/heads/master"
}
triggers: "Android N5 Swarm"
triggers: "Android N5X Swarm"
triggers: "ChromeOS Swarm"
triggers: "Linux Swarm"
triggers: "Mac Swarm"
triggers: "Windows Swarm"
}
job {
id: "Android N5 Swarm"
acl_sets: "default"
buildbucket: {
server: "cr-buildbucket-dev.appspot.com"
bucket: "luci.chromium.ci"
builder: "Android N5 Swarm"
}
}
job {
id: "Android N5X Swarm"
acl_sets: "default"
buildbucket: {
server: "cr-buildbucket-dev.appspot.com"
bucket: "luci.chromium.ci"
builder: "Android N5X Swarm"
}
}
job {
id: "ChromeOS Swarm"
acl_sets: "default"
buildbucket: {
server: "cr-buildbucket-dev.appspot.com"
bucket: "luci.chromium.ci"
builder: "ChromeOS Swarm"
}
}
job {
id: "Linux Swarm"
acl_sets: "default"
buildbucket: {
server: "cr-buildbucket-dev.appspot.com"
bucket: "luci.chromium.ci"
builder: "Linux Swarm"
}
}
job {
id: "Mac Swarm"
acl_sets: "default"
buildbucket: {
server: "cr-buildbucket-dev.appspot.com"
bucket: "luci.chromium.ci"
builder: "Mac Swarm"
}
}
job {
id: "Windows Swarm"
acl_sets: "default"
buildbucket: {
server: "cr-buildbucket-dev.appspot.com"
bucket: "luci.chromium.ci"
builder: "Windows Swarm"
}
}
################################################################################
# Cron jobs
job {
id: "Snapshot Builder"
acl_sets: "default"
buildbucket {
bucket: "luci.chromium.cron"
builder: "Snapshot Builder"
server: "cr-buildbucket-dev.appspot.com"
}
# TODO(smut): Adjust frequency.
schedule: "with 300s interval"
}
This diff is collapsed.
# For the schema of this file and documentation, see ProjectCfg message in
# https://luci-config.appspot.com/schemas/projects:project.cfg
name: "chromium"
access: "group:all" # public
# Schema for this config file: ProjectConfig in
# luci-config.appspot.com/schemas/projects:tricium-prod.cfg
acls {
role: REQUESTER
group: "tricium-chromium-requesters"
}
selections {
function: "Cpplint"
platform: UBUNTU
configs {
name: "filter"
value: "-,+readability/todo,+readability/check,+readability/fn_size,+build/header_guard,+build/include_order"
}
configs {
name: "verbose"
value: "4"
}
}
selections {
function: "GitFileIsolator"
platform: UBUNTU
}
selections {
function: "MojomCommentator"
platform: UBUNTU
}
selections {
function: "SpellChecker"
platform: UBUNTU
}
selections {
function: "Pylint"
platform: UBUNTU
configs {
name: "disable"
value: "all"
}
configs {
name: "enable"
value: "syntax-error,unused-variable,undefined-variable,unused-import"
}
}
repos {
gerrit_project {
host: "chromium-review.googlesource.com"
project: "chromium/src"
git_url: "https://chromium.googlesource.com/chromium/src"
}
whitelisted_group: "project-chromium-tryjob-access"
}
service_account: "tricium-prod@appspot.gserviceaccount.com"
swarming_service_account: "swarming@tricium-prod.iam.gserviceaccount.com"
#!/usr/bin/env lucicfg
# Tell lucicfg what files it is allowed to touch
lucicfg.config(
config_dir = 'generated',
tracked_files = [
'commit-queue.cfg',
'cr-buildbucket.cfg',
'luci-logdog.cfg',
'luci-milo.cfg',
'luci-notify.cfg',
'luci-scheduler.cfg',
'project.cfg',
'tricium-prod.cfg',
],
fail_on_warnings = True,
)
# Copy the not-yet migrated files to the generated outputs
# TODO(https://crbug.com/1011908) Migrate the configuration in these files to starlark
[lucicfg.emit(dest = f, data = io.read_file(f)) for f in (
'commit-queue.cfg',
'cr-buildbucket.cfg',
'luci-logdog.cfg',
'luci-milo.cfg',
'luci-notify.cfg',
'luci-scheduler.cfg',
'project.cfg',
)]
# Just copy tricium-prod.cfg to the generated outputs
lucicfg.emit(
dest = 'tricium-prod.cfg',
data = io.read_file('tricium-prod.cfg'),
)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment