CI: Backport CI/Release related code to v9.3.x (#62752)

* Batch-move everything

* go mod tidy

* make drone

* Remove genversions

* Bump alpine image

* Revert back pkg/build/docker/build.go

* Make sure correct enterprise branch is checked out

* Add enterprise2 version

* Remove extensions

* Bump build container

* backport node 18 test fix

(cherry picked from commit 4ff03fdbfb)

* Update scripts/drone

* Add more commands

* Fix starlark link

* Copy .drone.star

* Add drone target branch for custom events

---------
This commit is contained in:
Dimitris Sotirakis
2023-02-03 11:43:48 +02:00
committed by GitHub
parent d9b5c5f4c6
commit 03b1cf763d
85 changed files with 8622 additions and 2695 deletions
+628
View File
@@ -0,0 +1,628 @@
events/release.star,6652
ver_mode =ver_mode64,1602
release_trigger =release_trigger65,1623
def store_npm_packages_step():store_npm_packages_step74,1752
def retrieve_npm_packages_step():retrieve_npm_packages_step90,2193
def release_npm_packages_step():release_npm_packages_step107,2663
def oss_pipelines(ver_mode = ver_mode, trigger = release_trigger):oss_pipelines123,3076
environment =environment135,3492
edition =edition136,3529
services =services137,3549
volumes =volumes138,3609
package_steps =package_steps139,3659
publish_steps =publish_steps140,3682
should_publish =should_publish141,3705
should_upload =should_upload142,3748
init_steps =init_steps143,3818
build_steps =build_steps152,4033
integration_test_steps =integration_test_steps159,4342
build_storybook =build_storybook182,5254
publish_step =publish_step190,5674
store_npm_step =store_npm_step191,5758
windows_package_steps =windows_package_steps196,5957
windows_pipeline =windows_pipeline198,6044
name =name199,6077
edition =edition200,6127
trigger =trigger201,6154
steps =steps202,6181
platform =platform203,6256
depends_on =depends_on204,6286
environment =environment207,6393
pipelines =pipelines209,6434
name =name211,6470
edition =edition212,6550
trigger =trigger213,6581
services =services214,6612
steps =steps215,6639
environment =environment216,6717
volumes =volumes217,6756
name =name225,6970
edition =edition226,7038
trigger =trigger227,7073
services =services228,7108
steps =steps229,7145
environment =environment230,7329
volumes =volumes231,7372
deps =deps234,7433
def enterprise_pipelines(ver_mode = ver_mode, trigger = release_trigger):enterprise_pipelines247,7856
environment =environment259,8284
edition =edition260,8328
services =services261,8355
volumes =volumes262,8415
package_steps =package_steps263,8465
publish_steps =publish_steps264,8488
should_publish =should_publish265,8511
should_upload =should_upload266,8554
include_enterprise =include_enterprise267,8624
edition2 =edition2268,8673
init_steps =init_steps269,8702
build_steps =build_steps277,8909
integration_test_steps =integration_test_steps284,9218
build_storybook =build_storybook312,10299
publish_step =publish_step324,10892
store_npm_step =store_npm_step325,10976
windows_package_steps =windows_package_steps330,11175
step =step333,11284
deps_on_clone_enterprise_step =deps_on_clone_enterprise_step337,11418
windows_pipeline =windows_pipeline347,11746
name =name348,11779
edition =edition349,11836
trigger =trigger350,11863
steps =steps351,11890
platform =platform352,11965
depends_on =depends_on353,11995
environment =environment356,12109
pipelines =pipelines358,12150
name =name360,12186
edition =edition361,12273
trigger =trigger362,12304
services =services363,12335
steps =steps364,12362
environment =environment365,12440
volumes =volumes366,12479
name =name374,12711
edition =edition375,12786
trigger =trigger376,12821
services =services377,12856
steps =steps378,12893
environment =environment379,13213
volumes =volumes380,13256
deps =deps383,13317
def enterprise2_pipelines(prefix = "", ver_mode = ver_mode, trigger = release_trigger):enterprise2_pipelines397,13769
environment =environment412,14364
edition =edition415,14424
volumes =volumes416,14451
package_steps =package_steps417,14501
publish_steps =publish_steps418,14524
should_publish =should_publish419,14547
should_upload =should_upload420,14590
include_enterprise =include_enterprise421,14660
edition2 =edition2422,14709
init_steps =init_steps423,14738
build_steps =build_steps431,14945
fetch_images =fetch_images442,15355
upload_cdn =upload_cdn444,15497
step =step458,16187
deps_on_clone_enterprise_step =deps_on_clone_enterprise_step462,16321
pipelines =pipelines472,16608
name =name474,16644
edition =edition475,16742
trigger =trigger476,16773
services =services477,16804
steps =steps478,16831
volumes =volumes479,16909
environment =environment480,16940
def publish_artifacts_step(mode):publish_artifacts_step486,17019
security =security487,17053
security =security489,17098
def publish_artifacts_pipelines(mode):publish_artifacts_pipelines501,17538
trigger =trigger502,17577
steps =steps506,17655
name =name512,17768
trigger =trigger513,17820
steps =steps514,17847
edition =edition515,17870
environment =environment516,17895
def publish_packages_pipeline():publish_packages_pipeline519,17945
trigger =trigger526,18162
oss_steps =oss_steps530,18244
enterprise_steps =enterprise_steps538,18560
deps =deps545,18903
name =name552,19062
trigger =trigger553,19101
steps =steps554,19128
edition =edition555,19155
depends_on =depends_on556,19180
environment =environment557,19207
name =name559,19266
trigger =trigger560,19312
steps =steps561,19339
edition =edition562,19373
depends_on =depends_on563,19398
environment =environment564,19425
def publish_npm_pipelines(mode):publish_npm_pipelines567,19482
trigger =trigger568,19515
steps =steps572,19593
name =name580,19772
trigger =trigger581,19827
steps =steps582,19854
edition =edition583,19877
environment =environment584,19902
def artifacts_page_pipeline():artifacts_page_pipeline587,19952
trigger =trigger588,19983
name =name593,20087
trigger =trigger594,20128
steps =steps595,20155
edition =edition596,20220
environment =environment597,20245
def get_e2e_suffix():get_e2e_suffix600,20295
events/cron.star,1016
aquasec_trivy_image =aquasec_trivy_image8,209
def cronjobs(edition):cronjobs10,255
grafana_com_nightly_pipeline =grafana_com_nightly_pipeline11,278
cronName =cronName12,332
name =name13,374
steps =steps14,412
def cron_job_pipeline(cronName, name, steps):cron_job_pipeline24,773
def scan_docker_image_pipeline(edition, tag):scan_docker_image_pipeline43,1175
edition =edition55,1530
edition =edition57,1579
docker_image =docker_image59,1608
cronName =cronName62,1695
name =name63,1725
steps =steps64,1775
def scan_docker_image_unkown_low_medium_vulnerabilities_step(docker_image):scan_docker_image_unkown_low_medium_vulnerabilities_step71,2047
def scan_docker_image_high_critical_vulnerabilities_step(docker_image):scan_docker_image_high_critical_vulnerabilities_step80,2353
def slack_job_failed_step(channel, image):slack_job_failed_step89,2646
def post_to_grafana_com_step():post_to_grafana_com_step103,3069
events/main.star,633
ver_mode =ver_mode49,966
trigger =trigger50,984
def main_pipelines(edition):main_pipelines62,1168
drone_change_trigger =drone_change_trigger63,1197
pipelines =pipelines79,1513
name =name89,1951
slack_channel =slack_channel90,1994
trigger =trigger91,2045
template =template92,2089
secret =secret93,2135
name =name97,2276
slack_channel =slack_channel98,2310
trigger =trigger99,2366
depends_on =depends_on100,2425
template =template101,2563
secret =secret102,2604
events/pr.star,252
ver_mode =ver_mode48,997
trigger =trigger49,1013
def pr_pipelines(edition):pr_pipelines62,1198
def get_pr_trigger(include_paths = None, exclude_paths = None):get_pr_trigger76,2396
paths_ex =paths_ex91,3080
paths_in =paths_in92,3115
services/services.star,225
def integration_test_services_volumes():integration_test_services_volumes5,79
def integration_test_services(edition):integration_test_services14,292
services =services15,332
def ldap_service():ldap_service59,1616
utils/utils.star,561
failure_template =failure_template11,191
drone_change_template =drone_change_template12,509
services =services19,932
platform =platform20,955
depends_on =depends_on21,983
environment =environment22,1008
volumes =volumes23,1036
platform_conf =platform_conf50,2166
platform_conf =platform_conf62,2534
pipeline =pipeline70,2713
def notify_pipeline(name, slack_channel, trigger, depends_on = [], template = None, secret = None):notify_pipeline105,3545
trigger =trigger106,3645
pipelines/trigger_downstream.star,440
trigger =trigger14,249
def enterprise_downstream_pipeline(edition, ver_mode):enterprise_downstream_pipeline26,433
environment =environment27,488
steps =steps28,527
deps =deps29,587
name =name31,672
edition =edition32,714
trigger =trigger33,741
services =services34,768
steps =steps35,791
depends_on =depends_on36,814
environment =environment37,841
pipelines/verify_starlark.star,323
def verify_starlark(trigger, ver_mode):verify_starlark17,305
environment =environment18,345
steps =steps19,382
name =name26,546
edition =edition27,600
trigger =trigger28,625
services =services29,652
steps =steps30,675
environment =environment31,698
pipelines/build.star,508
def build_e2e(trigger, ver_mode, edition):build_e2e39,936
environment =environment50,1096
variants =variants51,1135
init_steps =init_steps52,1219
build_steps =build_steps61,1491
publish_suffix =publish_suffix107,4049
publish_suffix =publish_suffix109,4100
name =name112,4158
edition =edition113,4224
environment =environment114,4249
services =services115,4284
steps =steps116,4307
trigger =trigger117,4349
pipelines/shellcheck.star,386
trigger =trigger15,235
def shellcheck_step():shellcheck_step31,483
def shellcheck_pipeline():shellcheck_pipeline43,725
environment =environment44,752
steps =steps45,789
name =name50,886
edition =edition51,918
trigger =trigger52,943
services =services53,970
steps =steps54,993
environment =environment55,1016
pipelines/verify_drone.star,317
def verify_drone(trigger, ver_mode):verify_drone17,293
environment =environment18,330
steps =steps19,367
name =name26,528
edition =edition27,579
trigger =trigger28,604
services =services29,631
steps =steps30,654
environment =environment31,677
pipelines/test_backend.star,474
def test_backend(trigger, ver_mode, edition = "oss"):test_backend23,463
environment =environment35,882
init_steps =init_steps36,921
test_steps =test_steps46,1291
pipeline_name =pipeline_name51,1387
pipeline_name =pipeline_name53,1492
name =name55,1584
edition =edition56,1614
trigger =trigger57,1641
services =services58,1668
steps =steps59,1691
environment =environment60,1732
pipelines/lint_frontend.star,415
def lint_frontend_pipeline(trigger, ver_mode):lint_frontend_pipeline16,260
environment =environment26,546
yarn_step =yarn_step27,583
init_steps =init_steps29,660
test_steps =test_steps33,736
name =name37,812
edition =edition38,864
trigger =trigger39,889
services =services40,916
steps =steps41,939
environment =environment42,980
pipelines/docs.star,494
docs_paths =docs_paths19,383
def docs_pipelines(edition, ver_mode, trigger):docs_pipelines28,511
environment =environment29,559
steps =steps30,598
name =name40,815
edition =edition41,858
trigger =trigger42,885
services =services43,912
steps =steps44,935
environment =environment45,958
def lint_docs():lint_docs48,1000
def trigger_docs_main():trigger_docs_main63,1328
def trigger_docs_pr():trigger_docs_pr72,1478
pipelines/test_frontend.star,476
def test_frontend(trigger, ver_mode, edition = "oss"):test_frontend20,374
environment =environment32,794
init_steps =init_steps33,833
test_steps =test_steps41,1102
pipeline_name =pipeline_name45,1205
pipeline_name =pipeline_name47,1311
name =name49,1404
edition =edition50,1434
trigger =trigger51,1461
services =services52,1488
steps =steps53,1511
environment =environment54,1552
pipelines/integration_tests.star,483
def integration_tests(trigger, ver_mode, edition):integration_tests26,542
environment =environment37,900
services =services38,939
volumes =volumes39,989
init_steps =init_steps40,1039
test_steps =test_steps48,1282
name =name54,1412
edition =edition55,1468
trigger =trigger56,1493
services =services57,1520
steps =steps58,1549
environment =environment59,1590
volumes =volumes60,1625
pipelines/windows.star,954
def windows(trigger, edition, ver_mode):windows17,339
environment =environment29,798
init_cmds =init_cmds30,837
steps =steps38,1205
bucket =bucket49,1497
ver_part =ver_part51,1590
dir =dir52,1628
dir =dir54,1670
bucket =bucket55,1695
build_no =build_no56,1736
ver_part =ver_part57,1780
installer_commands =installer_commands58,1842
committish =committish100,3763
committish =committish102,3846
committish =committish104,3906
download_grabpl_step_cmds =download_grabpl_step_cmds107,4057
clone_cmds =clone_cmds113,4363
name =name146,5711
edition =edition147,5742
trigger =trigger148,5769
steps =steps149,5830
depends_on =depends_on150,5889
platform =platform151,6007
environment =environment152,6037
pipelines/lint_backend.star,418
def lint_backend_pipeline(trigger, ver_mode):lint_backend_pipeline18,306
environment =environment28,590
wire_step =wire_step29,627
init_steps =init_steps31,704
test_steps =test_steps36,809
name =name43,959
edition =edition44,1010
trigger =trigger45,1035
services =services46,1062
steps =steps47,1085
environment =environment48,1126
pipelines/publish_images.star,998
def publish_image_steps(edition, mode, docker_repo):publish_image_steps17,303
additional_docker_repo =additional_docker_repo31,922
additional_docker_repo =additional_docker_repo33,979
steps =steps34,1034
def publish_image_pipelines_public():publish_image_pipelines_public45,1369
mode =mode51,1521
trigger =trigger52,1541
name =name57,1641
trigger =trigger58,1694
steps =steps59,1721
edition =edition60,1813
environment =environment61,1835
name =name63,1894
trigger =trigger64,1954
steps =steps65,1981
edition =edition66,2091
environment =environment67,2113
def publish_image_pipelines_security():publish_image_pipelines_security70,2170
mode =mode71,2210
trigger =trigger72,2232
name =name77,2332
trigger =trigger78,2392
steps =steps79,2419
edition =edition80,2529
environment =environment81,2551
steps/lib.star,8579
grabpl_version =grabpl_version7,181
build_image =build_image8,208
publish_image =publish_image9,254
deploy_docker_image =deploy_docker_image10,304
alpine_image =alpine_image11,380
curl_image =curl_image12,411
windows_image =windows_image13,452
wix_image =wix_image14,501
go_image =go_image15,536
disable_tests =disable_tests17,564
trigger_oss =trigger_oss18,586
def slack_step(channel, template, secret):slack_step24,653
def yarn_install_step(edition = "oss"):yarn_install_step35,918
deps =deps36,958
deps =deps38,1004
def wire_install_step():wire_install_step48,1222
def identify_runner_step(platform = "linux"):identify_runner_step60,1454
def clone_enterprise_step(ver_mode):clone_enterprise_step78,1916
committish =committish87,2193
committish =committish89,2268
committish =committish91,2317
def init_enterprise_step(ver_mode):init_enterprise_step105,2747
source_commit =source_commit115,3098
source_commit =source_commit117,3151
environment =environment118,3191
token =token121,3280
environment =environment123,3369
token =token126,3458
environment =environment128,3518
token =token129,3543
def download_grabpl_step(platform = "linux"):download_grabpl_step148,4147
def lint_drone_step():lint_drone_step173,4973
def lint_starlark_step():lint_starlark_step185,5216
def enterprise_downstream_step(edition, ver_mode):enterprise_downstream_step206,6000
repo =repo219,6482
step =step225,6623
def lint_backend_step():lint_backend_step247,7248
def benchmark_ldap_step():benchmark_ldap_step265,7713
def build_storybook_step(edition, ver_mode):build_storybook_step278,8087
def store_storybook_step(edition, ver_mode, trigger = None):store_storybook_step300,8743
commands =commands314,9202
commands =commands323,9521
step =step325,9593
when_cond =when_cond338,10125
step =step346,10330
def e2e_tests_artifacts(edition):e2e_tests_artifacts349,10391
def upload_cdn_step(edition, ver_mode, trigger = None):upload_cdn_step386,12378
deps =deps397,12763
step =step407,12970
step =step420,13423
def build_backend_step(edition, ver_mode, variants = None):build_backend_step423,13482
variants_str =variants_str437,14070
variants_str =variants_str439,14109
cmds =cmds443,14256
build_no =build_no449,14418
cmds =cmds450,14461
def build_frontend_step(edition, ver_mode):build_frontend_step468,14906
build_no =build_no478,15246
cmds =cmds482,15356
cmds =cmds487,15505
def build_frontend_package_step(edition, ver_mode):build_frontend_package_step505,15960
build_no =build_no515,16312
cmds =cmds519,16422
cmds =cmds524,16580
def build_plugins_step(edition, ver_mode):build_plugins_step542,17053
env =env544,17121
env =env548,17220
def test_backend_step():test_backend_step563,17607
def test_backend_integration_step():test_backend_integration_step575,17880
def betterer_frontend_step(edition = "oss"):betterer_frontend_step587,18187
deps =deps596,18427
def test_frontend_step(edition = "oss"):test_frontend_step609,18728
deps =deps618,18962
def lint_frontend_step():lint_frontend_step634,19343
def test_a11y_frontend_step(ver_mode, edition, port = 3001):test_a11y_frontend_step652,19793
commands =commands664,20279
failure =failure667,20345
failure =failure672,20483
def frontend_metrics_step(edition, trigger = None):frontend_metrics_step693,21146
step =step706,21507
step =step721,22007
def codespell_step():codespell_step724,22066
def package_step(edition, ver_mode, variants = None):package_step736,22468
deps =deps750,23006
variants_str =variants_str757,23167
variants_str =variants_str759,23206
sign_args =sign_args762,23332
env =env763,23362
test_args =test_args769,23628
sign_args =sign_args771,23661
env =env772,23684
test_args =test_args773,23703
cmds =cmds777,23829
build_no =build_no784,24036
cmds =cmds785,24079
def grafana_server_step(edition, port = 3001):grafana_server_step798,24459
package_file_pfx =package_file_pfx808,24729
package_file_pfx =package_file_pfx810,24788
package_file_pfx =package_file_pfx812,24889
environment =environment814,24938
def e2e_tests_step(suite, edition, port = 3001, tries = None):e2e_tests_step837,25554
cmd =cmd838,25617
def cloud_plugins_e2e_tests_step(suite, edition, cloud, trigger = None):cloud_plugins_e2e_tests_step856,26186
environment =environment869,26649
when =when870,26670
when =when872,26700
environment =environment874,26748
when =when882,27129
branch =branch888,27345
step =step889,27401
step =step901,27822
def build_docs_website_step():build_docs_website_step904,27874
def copy_packages_for_docker_step(edition = None):copy_packages_for_docker_step916,28272
def build_docker_images_step(edition, archs = None, ubuntu = False, publish = False):build_docker_images_step929,28622
cmd =cmd943,29193
ubuntu_sfx =ubuntu_sfx947,29307
ubuntu_sfx =ubuntu_sfx949,29342
environment =environment955,29468
def fetch_images_step(edition):fetch_images_step979,30079
def publish_images_step(edition, ver_mode, mode, docker_repo, trigger = None):publish_images_step997,30745
name =name1013,31562
docker_repo =docker_repo1014,31585
mode =mode1016,31663
mode =mode1018,31709
environment =environment1020,31728
cmd =cmd1026,31912
deps =deps1029,32041
deps =deps1032,32147
name =name1035,32250
docker_repo =docker_repo1036,32273
cmd =cmd1038,32459
step =step1040,32565
step =step1052,32929
def postgres_integration_tests_step():postgres_integration_tests_step1056,32989
cmds =cmds1057,33028
def mysql_integration_tests_step():mysql_integration_tests_step1079,33850
cmds =cmds1080,33886
def redis_integration_tests_step():redis_integration_tests_step1100,34629
def memcached_integration_tests_step():memcached_integration_tests_step1114,35026
def release_canary_npm_packages_step(edition, trigger = None):release_canary_npm_packages_step1128,35435
step =step1141,35805
step =step1153,36143
def enterprise2_suffix(edition):enterprise2_suffix1156,36202
def upload_packages_step(edition, ver_mode, trigger = None):upload_packages_step1161,36320
deps =deps1176,36816
step =step1184,37036
step =step1195,37471
def publish_grafanacom_step(edition, ver_mode):publish_grafanacom_step1198,37530
cmd =cmd1211,38044
build_no =build_no1215,38188
cmd =cmd1216,38231
def publish_linux_packages_step(edition, package_manager = "deb"):publish_linux_packages_step1239,38866
def get_windows_steps(edition, ver_mode):get_windows_steps1261,39989
init_cmds =init_cmds1270,40281
steps =steps1278,40649
bucket =bucket1289,40941
ver_part =ver_part1291,41034
dir =dir1292,41072
dir =dir1294,41114
bucket =bucket1295,41139
build_no =build_no1296,41180
ver_part =ver_part1297,41224
installer_commands =installer_commands1298,41286
committish =committish1340,43207
committish =committish1342,43290
committish =committish1344,43350
download_grabpl_step_cmds =download_grabpl_step_cmds1347,43501
clone_cmds =clone_cmds1353,43807
def verify_gen_cue_step(edition):verify_gen_cue_step1387,45152
deps =deps1388,45186
def verify_gen_jsonnet_step(edition):verify_gen_jsonnet_step1402,45694
deps =deps1403,45732
def trigger_test_release():trigger_test_release1417,46236
def artifacts_page_step():artifacts_page_step1451,47731
def end_to_end_tests_deps():end_to_end_tests_deps1466,48058
def compile_build_cmd(edition = "oss"):compile_build_cmd1476,48321
dependencies =dependencies1477,48361
dependencies =dependencies1479,48432
def get_trigger_storybook(ver_mode):get_trigger_storybook1492,48780
trigger_storybook =trigger_storybook1500,49031
trigger_storybook =trigger_storybook1502,49088
trigger_storybook =trigger_storybook1506,49168
vault.star,444
pull_secret =pull_secret4,87
github_token =github_token5,120
drone_token =drone_token6,150
prerelease_bucket =prerelease_bucket7,178
gcp_upload_artifacts_key =gcp_upload_artifacts_key8,218
azure_sp_app_id =azure_sp_app_id9,272
azure_sp_app_pw =azure_sp_app_pw10,308
azure_tenant =azure_tenant11,344
def from_secret(secret):from_secret13,375
def vault_secret(name, path, key):vault_secret18,451
def secrets():secrets28,633
version.star,116
ver_mode =ver_mode12,197
trigger =trigger13,225
def version_branch_pipelines():version_branch_pipelines15,268
+83 -67
View File
@@ -1,99 +1,115 @@
load('scripts/drone/vault.star', 'from_secret', 'pull_secret')
load('scripts/drone/steps/lib.star', 'publish_image', 'compile_build_cmd')
"""
This module provides functions for cronjob pipelines and steps used within.
"""
aquasec_trivy_image = 'aquasec/trivy:0.21.0'
load("scripts/drone/vault.star", "from_secret")
load(
"scripts/drone/steps/lib.star",
"compile_build_cmd",
"publish_image",
)
def cronjobs(edition):
grafana_com_nightly_pipeline = cron_job_pipeline(
cronName='grafana-com-nightly',
name='grafana-com-nightly',
steps=[compile_build_cmd(),post_to_grafana_com_step()]
)
aquasec_trivy_image = "aquasec/trivy:0.21.0"
def cronjobs():
return [
scan_docker_image_pipeline(edition, 'latest'),
scan_docker_image_pipeline(edition, 'main'),
scan_docker_image_pipeline(edition, 'latest-ubuntu'),
scan_docker_image_pipeline(edition, 'main-ubuntu'),
grafana_com_nightly_pipeline,
scan_docker_image_pipeline("latest"),
scan_docker_image_pipeline("main"),
scan_docker_image_pipeline("latest-ubuntu"),
scan_docker_image_pipeline("main-ubuntu"),
grafana_com_nightly_pipeline(),
]
def cron_job_pipeline(cronName, name, steps):
return {
'kind': 'pipeline',
'type': 'docker',
'platform': {
'os': 'linux',
'arch': 'amd64',
"kind": "pipeline",
"type": "docker",
"platform": {
"os": "linux",
"arch": "amd64",
},
'name': name,
'trigger': {
'event': 'cron',
'cron': cronName,
"name": name,
"trigger": {
"event": "cron",
"cron": cronName,
},
'clone': {
'retries': 3,
"clone": {
"retries": 3,
},
'steps': steps,
"steps": steps,
}
def scan_docker_image_pipeline(edition, tag):
if edition != 'oss':
edition='grafana-enterprise'
else:
edition='grafana'
def scan_docker_image_pipeline(tag):
"""Generates a cronjob pipeline for nightly scans of grafana Docker images.
dockerImage='grafana/{}:{}'.format(edition, tag)
Args:
tag: determines which image tag is scanned.
Returns:
Drone cronjob pipeline.
"""
docker_image = "grafana/grafana:{}".format(tag)
return cron_job_pipeline(
cronName='nightly',
name='scan-' + dockerImage + '-image',
steps=[
scan_docker_image_unkown_low_medium_vulnerabilities_step(dockerImage),
scan_docker_image_high_critical_vulnerabilities_step(dockerImage),
slack_job_failed_step('grafana-backend-ops', dockerImage),
])
cronName = "nightly",
name = "scan-" + docker_image + "-image",
steps = [
scan_docker_image_unkown_low_medium_vulnerabilities_step(docker_image),
scan_docker_image_high_critical_vulnerabilities_step(docker_image),
slack_job_failed_step("grafana-backend-ops", docker_image),
],
)
def scan_docker_image_unkown_low_medium_vulnerabilities_step(dockerImage):
def scan_docker_image_unkown_low_medium_vulnerabilities_step(docker_image):
return {
'name': 'scan-unkown-low-medium-vulnerabilities',
'image': aquasec_trivy_image,
'commands': [
'trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM ' + dockerImage,
"name": "scan-unkown-low-medium-vulnerabilities",
"image": aquasec_trivy_image,
"commands": [
"trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM " + docker_image,
],
}
def scan_docker_image_high_critical_vulnerabilities_step(dockerImage):
def scan_docker_image_high_critical_vulnerabilities_step(docker_image):
return {
'name': 'scan-high-critical-vulnerabilities',
'image': aquasec_trivy_image,
'commands': [
'trivy --exit-code 1 --severity HIGH,CRITICAL ' + dockerImage,
"name": "scan-high-critical-vulnerabilities",
"image": aquasec_trivy_image,
"commands": [
"trivy --exit-code 1 --severity HIGH,CRITICAL " + docker_image,
],
}
def slack_job_failed_step(channel, image):
return {
'name': 'slack-notify-failure',
'image': 'plugins/slack',
'settings': {
'webhook': from_secret('slack_webhook_backend'),
'channel': channel,
'template': 'Nightly docker image scan job for ' + image + ' failed: {{build.link}}',
"name": "slack-notify-failure",
"image": "plugins/slack",
"settings": {
"webhook": from_secret("slack_webhook_backend"),
"channel": channel,
"template": "Nightly docker image scan job for " +
image +
" failed: {{build.link}}",
},
'when': {
'status': 'failure'
}
"when": {"status": "failure"},
}
def post_to_grafana_com_step():
return {
'name': 'post-to-grafana-com',
'image': publish_image,
'environment': {
'GRAFANA_COM_API_KEY': from_secret('grafana_api_key'),
'GCP_KEY': from_secret('gcp_key'),
},
'depends_on': ['compile-build-cmd'],
'commands': ['./bin/build publish grafana-com --edition oss'],
}
"name": "post-to-grafana-com",
"image": publish_image,
"environment": {
"GRAFANA_COM_API_KEY": from_secret("grafana_api_key"),
"GCP_KEY": from_secret("gcp_key"),
},
"depends_on": ["compile-build-cmd"],
"commands": ["./bin/build publish grafana-com --edition oss"],
}
def grafana_com_nightly_pipeline():
return cron_job_pipeline(
cronName = "grafana-com-nightly",
name = "grafana-com-nightly",
steps = [
compile_build_cmd(),
post_to_grafana_com_step(),
],
)
+77 -69
View File
@@ -1,108 +1,116 @@
load(
'scripts/drone/utils/utils.star',
'pipeline',
'notify_pipeline',
'failure_template',
'drone_change_template',
)
"""
This module returns all the pipelines used in the event of pushes to the main branch.
"""
load(
'scripts/drone/pipelines/docs.star',
'docs_pipelines',
'trigger_docs_main',
"scripts/drone/utils/utils.star",
"drone_change_template",
"failure_template",
"notify_pipeline",
)
load(
'scripts/drone/pipelines/test_frontend.star',
'test_frontend',
"scripts/drone/pipelines/docs.star",
"docs_pipelines",
"trigger_docs_main",
)
load(
'scripts/drone/pipelines/test_backend.star',
'test_backend',
"scripts/drone/pipelines/test_frontend.star",
"test_frontend",
)
load(
'scripts/drone/pipelines/integration_tests.star',
'integration_tests',
"scripts/drone/pipelines/test_backend.star",
"test_backend",
)
load(
'scripts/drone/pipelines/build.star',
'build_e2e',
"scripts/drone/pipelines/integration_tests.star",
"integration_tests",
)
load(
'scripts/drone/pipelines/windows.star',
'windows',
"scripts/drone/pipelines/build.star",
"build_e2e",
)
load(
'scripts/drone/pipelines/trigger_downstream.star',
'enterprise_downstream_pipeline',
"scripts/drone/pipelines/windows.star",
"windows",
)
load(
'scripts/drone/pipelines/lint_backend.star',
'lint_backend_pipeline',
"scripts/drone/pipelines/trigger_downstream.star",
"enterprise_downstream_pipeline",
)
load(
'scripts/drone/pipelines/lint_frontend.star',
'lint_frontend_pipeline',
"scripts/drone/pipelines/lint_backend.star",
"lint_backend_pipeline",
)
load(
"scripts/drone/pipelines/lint_frontend.star",
"lint_frontend_pipeline",
)
load('scripts/drone/vault.star', 'from_secret')
ver_mode = 'main'
ver_mode = "main"
trigger = {
'event': ['push',],
'branch': 'main',
'paths': {
'exclude': [
'*.md',
'docs/**',
'latest.json',
"event": [
"push",
],
"branch": "main",
"paths": {
"exclude": [
"*.md",
"docs/**",
"latest.json",
],
},
}
def main_pipelines(edition):
def main_pipelines():
drone_change_trigger = {
'event': ['push',],
'branch': 'main',
'repo': [
'grafana/grafana',
"event": [
"push",
],
'paths': {
'include': [
'.drone.yml',
"branch": "main",
"repo": [
"grafana/grafana",
],
"paths": {
"include": [
".drone.yml",
],
'exclude': [
'exclude',
"exclude": [
"exclude",
],
},
}
pipelines = [
docs_pipelines(edition, ver_mode, trigger_docs_main()),
docs_pipelines(ver_mode, trigger_docs_main()),
test_frontend(trigger, ver_mode),
lint_frontend_pipeline(trigger, ver_mode),
test_backend(trigger, ver_mode),
lint_backend_pipeline(trigger, ver_mode),
build_e2e(trigger, ver_mode, edition),
integration_tests(trigger, ver_mode, edition),
windows(trigger, edition, ver_mode),
notify_pipeline(
name='notify-drone-changes', slack_channel='slack-webhooks-test', trigger=drone_change_trigger,
template=drone_change_template, secret='drone-changes-webhook',
),
enterprise_downstream_pipeline(edition, ver_mode),
notify_pipeline(
name='main-notify', slack_channel='grafana-ci-notifications', trigger=dict(trigger, status=['failure']),
depends_on=['main-test-frontend', 'main-test-backend', 'main-build-e2e-publish', 'main-integration-tests', 'main-windows'],
template=failure_template, secret='slack_webhook'
)]
build_e2e(trigger, ver_mode),
integration_tests(trigger, prefix = ver_mode, ver_mode = ver_mode),
windows(trigger, edition = "oss", ver_mode = ver_mode),
notify_pipeline(
name = "notify-drone-changes",
slack_channel = "slack-webhooks-test",
trigger = drone_change_trigger,
template = drone_change_template,
secret = "drone-changes-webhook",
),
enterprise_downstream_pipeline(),
notify_pipeline(
name = "main-notify",
slack_channel = "grafana-ci-notifications",
trigger = dict(trigger, status = ["failure"]),
depends_on = [
"main-test-frontend",
"main-test-backend",
"main-build-e2e-publish",
"main-integration-tests",
"main-windows",
],
template = failure_template,
secret = "slack_webhook",
),
]
return pipelines
+126 -57
View File
@@ -1,85 +1,155 @@
load(
'scripts/drone/utils/utils.star',
'pipeline',
)
"""
This module returns all pipelines used in the event of a pull request.
It also includes a function generating a PR trigger from a list of included and excluded paths.
"""
load(
'scripts/drone/pipelines/test_frontend.star',
'test_frontend',
"scripts/drone/pipelines/test_frontend.star",
"test_frontend",
)
load(
'scripts/drone/pipelines/test_backend.star',
'test_backend',
"scripts/drone/pipelines/test_backend.star",
"test_backend",
)
load(
'scripts/drone/pipelines/integration_tests.star',
'integration_tests',
"scripts/drone/pipelines/integration_tests.star",
"integration_tests",
)
load(
'scripts/drone/pipelines/build.star',
'build_e2e',
"scripts/drone/pipelines/build.star",
"build_e2e",
)
load(
'scripts/drone/pipelines/verify_drone.star',
'verify_drone',
"scripts/drone/pipelines/verify_drone.star",
"verify_drone",
)
load(
'scripts/drone/pipelines/docs.star',
'docs_pipelines',
'trigger_docs_pr',
"scripts/drone/pipelines/verify_starlark.star",
"verify_starlark",
)
load(
'scripts/drone/pipelines/shellcheck.star',
'shellcheck_pipeline',
"scripts/drone/pipelines/docs.star",
"docs_pipelines",
"trigger_docs_pr",
)
load(
'scripts/drone/pipelines/lint_backend.star',
'lint_backend_pipeline',
"scripts/drone/pipelines/shellcheck.star",
"shellcheck_pipeline",
)
load(
'scripts/drone/pipelines/lint_frontend.star',
'lint_frontend_pipeline',
"scripts/drone/pipelines/lint_backend.star",
"lint_backend_pipeline",
)
load(
"scripts/drone/pipelines/lint_frontend.star",
"lint_frontend_pipeline",
)
ver_mode = 'pr'
ver_mode = "pr"
trigger = {
'event': [
'pull_request',
"event": [
"pull_request",
],
'paths': {
'exclude': [
'*.md',
'docs/**',
'latest.json',
"paths": {
"exclude": [
"*.md",
"docs/**",
"latest.json",
],
},
}
def pr_pipelines(edition):
def pr_pipelines():
return [
verify_drone(get_pr_trigger(include_paths=['scripts/drone/**', '.drone.yml', '.drone.star']), ver_mode),
test_frontend(get_pr_trigger(exclude_paths=['pkg/**', 'packaging/**', 'go.sum', 'go.mod']), ver_mode),
lint_frontend_pipeline(get_pr_trigger(exclude_paths=['pkg/**', 'packaging/**', 'go.sum', 'go.mod']), ver_mode),
test_backend(get_pr_trigger(include_paths=['pkg/**', 'packaging/**', '.drone.yml', 'conf/**', 'go.sum', 'go.mod', 'public/app/plugins/**/plugin.json', 'devenv/**']), ver_mode),
lint_backend_pipeline(get_pr_trigger(include_paths=['pkg/**', 'packaging/**', 'conf/**', 'go.sum', 'go.mod', 'public/app/plugins/**/plugin.json', 'devenv/**']), ver_mode),
build_e2e(trigger, ver_mode, edition),
integration_tests(get_pr_trigger(include_paths=['pkg/**', 'packaging/**', '.drone.yml', 'conf/**', 'go.sum', 'go.mod', 'public/app/plugins/**/plugin.json']), ver_mode, edition),
docs_pipelines(edition, ver_mode, trigger_docs_pr()),
verify_drone(
get_pr_trigger(
include_paths = ["scripts/drone/**", ".drone.yml", ".drone.star"],
),
ver_mode,
),
verify_starlark(
get_pr_trigger(
include_paths = ["scripts/drone/**", ".drone.star"],
),
ver_mode,
),
test_frontend(
get_pr_trigger(
exclude_paths = ["pkg/**", "packaging/**", "go.sum", "go.mod"],
),
ver_mode,
),
lint_frontend_pipeline(
get_pr_trigger(
exclude_paths = ["pkg/**", "packaging/**", "go.sum", "go.mod"],
),
ver_mode,
),
test_backend(
get_pr_trigger(
include_paths = [
"pkg/**",
"packaging/**",
".drone.yml",
"conf/**",
"go.sum",
"go.mod",
"public/app/plugins/**/plugin.json",
"devenv/**",
],
),
ver_mode,
),
lint_backend_pipeline(
get_pr_trigger(
include_paths = [
"pkg/**",
"packaging/**",
"conf/**",
"go.sum",
"go.mod",
"public/app/plugins/**/plugin.json",
"devenv/**",
".bingo/**",
],
),
ver_mode,
),
build_e2e(trigger, ver_mode),
integration_tests(
get_pr_trigger(
include_paths = [
"pkg/**",
"packaging/**",
".drone.yml",
"conf/**",
"go.sum",
"go.mod",
"public/app/plugins/**/plugin.json",
],
),
prefix = ver_mode,
),
docs_pipelines(ver_mode, trigger_docs_pr()),
shellcheck_pipeline(),
]
def get_pr_trigger(include_paths = None, exclude_paths = None):
"""Generates a trigger filter from the lists of included and excluded path patterns.
def get_pr_trigger(include_paths=None, exclude_paths=None):
paths_ex = ['docs/**', '*.md']
This function is primarily intended to generate a trigger for code changes
as the patterns 'docs/**' and '*.md' are always excluded.
Args:
include_paths: a list of path patterns using the same syntax as gitignore.
Changes affecting files matching these path patterns trigger the pipeline.
exclude_paths: a list of path patterns using the same syntax as gitignore.
Changes affecting files matching these path patterns do not trigger the pipeline.
Returns:
Drone trigger.
"""
paths_ex = ["docs/**", "*.md"]
paths_in = []
if include_paths:
for path in include_paths:
@@ -88,12 +158,11 @@ def get_pr_trigger(include_paths=None, exclude_paths=None):
for path in exclude_paths:
paths_ex.extend([path])
return {
'event': [
'pull_request',
"event": [
"pull_request",
],
'paths': {
'exclude': paths_ex,
'include': paths_in,
"paths": {
"exclude": paths_ex,
"include": paths_in,
},
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,43 @@
"""
This module contains steps and pipelines publishing to AWS Marketplace.
"""
load(
"scripts/drone/steps/lib.star",
"compile_build_cmd",
"fetch_images_step",
"publish_image",
)
load("scripts/drone/vault.star", "from_secret")
load(
"scripts/drone/utils/utils.star",
"pipeline",
)
def publish_aws_marketplace_step():
return {
"name": "publish-aws-marketplace",
"image": publish_image,
"commands": ["./bin/build publish aws --image grafana/grafana-enterprise --repo grafana-labs/grafanaenterprise --product 422b46fb-bea6-4f27-8bcc-832117bd627e"],
"depends_on": ["fetch-images-enterprise"],
"environment": {
"AWS_REGION": from_secret("aws_region"),
"AWS_ACCESS_KEY_ID": from_secret("aws_access_key_id"),
"AWS_SECRET_ACCESS_KEY": from_secret("aws_secret_access_key"),
},
"volumes": [{"name": "docker", "path": "/var/run/docker.sock"}],
}
def publish_aws_marketplace_pipeline(mode):
trigger = {
"event": ["promote"],
"target": [mode],
}
return [pipeline(
name = "publish-aws-marketplace-{}".format(mode),
trigger = trigger,
steps = [compile_build_cmd(), fetch_images_step("enterprise"), publish_aws_marketplace_step()],
edition = "",
depends_on = ["publish-docker-enterprise-public"],
environment = {"EDITION": "enterprise2"},
)]
+152 -92
View File
@@ -1,110 +1,170 @@
load(
'scripts/drone/steps/lib.star',
'download_grabpl_step',
'build_image',
'identify_runner_step',
'wire_install_step',
'yarn_install_step',
'build_backend_step',
'build_frontend_step',
'build_frontend_package_step',
'build_plugins_step',
'package_step',
'grafana_server_step',
'e2e_tests_step',
'e2e_tests_artifacts',
'build_storybook_step',
'copy_packages_for_docker_step',
'build_docker_images_step',
'publish_images_step',
'postgres_integration_tests_step',
'mysql_integration_tests_step',
'redis_integration_tests_step',
'memcached_integration_tests_step',
'get_windows_steps',
'benchmark_ldap_step',
'enterprise_downstream_step',
'frontend_metrics_step',
'store_storybook_step',
'release_canary_npm_packages_step',
'upload_packages_step',
'upload_cdn_step',
'verify_gen_cue_step',
'verify_gen_jsonnet_step',
'test_a11y_frontend_step',
'trigger_oss',
'betterer_frontend_step',
'trigger_test_release',
'compile_build_cmd',
'cloud_plugins_e2e_tests_step',
)
"""This module contains the comprehensive build pipeline."""
load(
'scripts/drone/utils/utils.star',
'pipeline',
"scripts/drone/steps/lib.star",
"build_backend_step",
"build_docker_images_step",
"build_frontend_package_step",
"build_frontend_step",
"build_plugins_step",
"build_storybook_step",
"cloud_plugins_e2e_tests_step",
"compile_build_cmd",
"copy_packages_for_docker_step",
"download_grabpl_step",
"e2e_tests_artifacts",
"e2e_tests_step",
"enterprise_downstream_step",
"frontend_metrics_step",
"grafana_server_step",
"identify_runner_step",
"package_step",
"publish_images_step",
"release_canary_npm_packages_step",
"store_storybook_step",
"test_a11y_frontend_step",
"trigger_oss",
"trigger_test_release",
"upload_cdn_step",
"upload_packages_step",
"verify_gen_cue_step",
"verify_gen_jsonnet_step",
"wire_install_step",
"yarn_install_step",
)
load(
"scripts/drone/utils/utils.star",
"pipeline",
)
def build_e2e(trigger, ver_mode, edition):
variants = ['linux-amd64', 'linux-amd64-musl', 'darwin-amd64', 'windows-amd64',]
# @unused
def build_e2e(trigger, ver_mode):
"""Perform e2e building, testing, and publishing.
Args:
trigger: controls which events can trigger the pipeline execution.
ver_mode: used in the naming of the pipeline.
Returns:
Drone pipeline.
"""
edition = "oss"
environment = {"EDITION": edition}
init_steps = [
identify_runner_step(),
download_grabpl_step(),
compile_build_cmd(),
verify_gen_cue_step(edition="oss"),
verify_gen_jsonnet_step(edition="oss"),
verify_gen_cue_step(),
verify_gen_jsonnet_step(),
wire_install_step(),
yarn_install_step(),
]
build_steps = []
if ver_mode == 'pr':
build_steps.extend([trigger_test_release()])
build_steps.extend([enterprise_downstream_step(edition=edition, ver_mode=ver_mode)])
build_steps.extend([
build_backend_step(edition=edition, ver_mode=ver_mode),
build_frontend_step(edition=edition, ver_mode=ver_mode),
build_frontend_package_step(edition=edition, ver_mode=ver_mode),
build_plugins_step(edition=edition, ver_mode=ver_mode),
])
if ver_mode == 'main':
build_steps.extend([package_step(edition=edition, ver_mode=ver_mode)])
elif ver_mode == 'pr':
build_steps.extend([package_step(edition=edition, ver_mode=ver_mode, variants=variants)])
variants = None
build_steps.extend([
grafana_server_step(edition=edition),
e2e_tests_step('dashboards-suite', edition=edition),
e2e_tests_step('smoke-tests-suite', edition=edition),
e2e_tests_step('panels-suite', edition=edition),
e2e_tests_step('various-suite', edition=edition),
cloud_plugins_e2e_tests_step('cloud-plugins-suite', edition=edition, cloud='azure', trigger=trigger_oss),
e2e_tests_artifacts(edition=edition),
build_storybook_step(edition=edition, ver_mode=ver_mode),
copy_packages_for_docker_step(),
test_a11y_frontend_step(ver_mode=ver_mode, edition=edition),
])
if ver_mode == 'main':
build_steps.extend([
store_storybook_step(edition=edition, ver_mode=ver_mode, trigger=trigger_oss),
frontend_metrics_step(edition=edition, trigger=trigger_oss)
])
if ver_mode == "pr":
build_steps.extend(
[
trigger_test_release(),
enterprise_downstream_step(ver_mode = ver_mode),
],
)
if ver_mode == 'main':
build_steps.extend([
build_docker_images_step(edition=edition, ver_mode=ver_mode, publish=False),
build_docker_images_step(edition=edition, ver_mode=ver_mode, ubuntu=True, publish=False),
publish_images_step(edition=edition, ver_mode=ver_mode, mode='', docker_repo='grafana/grafana', trigger=trigger_oss),
publish_images_step(edition=edition, ver_mode=ver_mode, mode='', docker_repo='grafana/grafana-oss', trigger=trigger_oss),
release_canary_npm_packages_step(edition, trigger=trigger_oss),
upload_packages_step(edition=edition, ver_mode=ver_mode, trigger=trigger_oss),
upload_cdn_step(edition=edition, ver_mode=ver_mode, trigger=trigger_oss)
])
elif ver_mode == 'pr':
build_steps.extend([build_docker_images_step(edition=edition, ver_mode=ver_mode, archs=['amd64', ])])
variants = [
"linux-amd64",
"linux-amd64-musl",
"darwin-amd64",
"windows-amd64",
]
publish_suffix = ''
if ver_mode == 'main':
publish_suffix = '-publish'
build_steps.extend(
[
build_backend_step(edition = edition, ver_mode = ver_mode),
build_frontend_step(edition = edition, ver_mode = ver_mode),
build_frontend_package_step(edition = edition, ver_mode = ver_mode),
build_plugins_step(edition = edition, ver_mode = ver_mode),
package_step(edition = edition, variants = variants, ver_mode = ver_mode),
grafana_server_step(edition = edition),
e2e_tests_step("dashboards-suite"),
e2e_tests_step("smoke-tests-suite"),
e2e_tests_step("panels-suite"),
e2e_tests_step("various-suite"),
cloud_plugins_e2e_tests_step(
"cloud-plugins-suite",
cloud = "azure",
trigger = trigger_oss,
),
e2e_tests_artifacts(),
build_storybook_step(ver_mode = ver_mode),
copy_packages_for_docker_step(),
test_a11y_frontend_step(ver_mode = ver_mode),
],
)
if ver_mode == "main":
build_steps.extend(
[
store_storybook_step(trigger = trigger_oss, ver_mode = ver_mode),
frontend_metrics_step(trigger = trigger_oss),
build_docker_images_step(
edition = edition,
publish = False,
),
build_docker_images_step(
edition = edition,
publish = False,
ubuntu = True,
),
publish_images_step(
docker_repo = "grafana",
edition = edition,
mode = "",
trigger = trigger_oss,
ver_mode = ver_mode,
),
publish_images_step(
docker_repo = "grafana-oss",
edition = edition,
mode = "",
trigger = trigger_oss,
ver_mode = ver_mode,
),
release_canary_npm_packages_step(trigger = trigger_oss),
upload_packages_step(
edition = edition,
trigger = trigger_oss,
ver_mode = ver_mode,
),
upload_cdn_step(
edition = edition,
trigger = trigger_oss,
ver_mode = ver_mode,
),
],
)
elif ver_mode == "pr":
build_steps.extend(
[
build_docker_images_step(
archs = [
"amd64",
],
edition = edition,
),
],
)
publish_suffix = ""
if ver_mode == "main":
publish_suffix = "-publish"
return pipeline(
name='{}-build-e2e{}'.format(ver_mode, publish_suffix), edition="oss", trigger=trigger, services=[], steps=init_steps + build_steps,
name = "{}-build-e2e{}".format(ver_mode, publish_suffix),
edition = "oss",
environment = environment,
services = [],
steps = init_steps + build_steps,
trigger = trigger,
)
+40 -41
View File
@@ -1,37 +1,32 @@
load(
'scripts/drone/steps/lib.star',
'build_image',
'yarn_install_step',
'identify_runner_step',
'download_grabpl_step',
'lint_frontend_step',
'codespell_step',
'test_frontend_step',
'build_storybook_step',
'build_docs_website_step',
)
"""
This module returns all the pipelines used in the event of documentation changes along with supporting functions.
"""
load(
'scripts/drone/services/services.star',
'integration_test_services',
'ldap_service',
"scripts/drone/steps/lib.star",
"build_docs_website_step",
"build_image",
"codespell_step",
"download_grabpl_step",
"identify_runner_step",
"yarn_install_step",
)
load(
'scripts/drone/utils/utils.star',
'pipeline',
"scripts/drone/utils/utils.star",
"pipeline",
)
docs_paths = {
'include': [
'*.md',
'docs/**',
'packages/**/*.md',
'latest.json',
"include": [
"*.md",
"docs/**",
"packages/**/*.md",
"latest.json",
],
}
def docs_pipelines(edition, ver_mode, trigger):
def docs_pipelines(ver_mode, trigger):
environment = {"EDITION": "oss"}
steps = [
download_grabpl_step(),
identify_runner_step(),
@@ -42,38 +37,42 @@ def docs_pipelines(edition, ver_mode, trigger):
]
return pipeline(
name='{}-docs'.format(ver_mode), edition=edition, trigger=trigger, services=[], steps=steps,
name = "{}-docs".format(ver_mode),
edition = "oss",
trigger = trigger,
services = [],
steps = steps,
environment = environment,
)
def lint_docs():
return {
'name': 'lint-docs',
'image': build_image,
'depends_on': [
'yarn-install',
"name": "lint-docs",
"image": build_image,
"depends_on": [
"yarn-install",
],
'environment': {
'NODE_OPTIONS': '--max_old_space_size=8192',
"environment": {
"NODE_OPTIONS": "--max_old_space_size=8192",
},
'commands': [
'yarn run prettier:checkDocs',
"commands": [
"yarn run prettier:checkDocs",
],
}
def trigger_docs_main():
return {
'branch': 'main',
'event': [
'push',
"branch": "main",
"event": [
"push",
],
'paths': docs_paths,
"paths": docs_paths,
}
def trigger_docs_pr():
return {
'event': [
'pull_request',
"event": [
"pull_request",
],
'paths': docs_paths,
"paths": docs_paths,
}
+26 -22
View File
@@ -1,36 +1,40 @@
"""
This module contains steps and pipelines relating to GitHub.
"""
load(
'scripts/drone/steps/lib.star',
'download_grabpl_step',
'publish_images_step',
'compile_build_cmd',
'fetch_images_step',
'publish_image',
"scripts/drone/steps/lib.star",
"compile_build_cmd",
"fetch_images_step",
"publish_image",
)
load('scripts/drone/vault.star', 'from_secret')
load("scripts/drone/vault.star", "from_secret")
load(
'scripts/drone/utils/utils.star',
'pipeline',
"scripts/drone/utils/utils.star",
"pipeline",
)
def publish_github_step():
return {
'name': 'publish-github',
'image': publish_image,
'commands': ['./bin/build publish github --repo $${GH_REGISTRY} --create'],
'depends_on': ['fetch-images-enterprise2'],
'environment': {
'GH_TOKEN': from_secret('github_token'),
'GH_REGISTRY': from_secret('gh_registry'),
"name": "publish-github",
"image": publish_image,
"commands": ["./bin/build publish github --repo $${GH_REGISTRY} --create"],
"depends_on": ["fetch-images-enterprise2"],
"environment": {
"GH_TOKEN": from_secret("github_token"),
"GH_REGISTRY": from_secret("gh_registry"),
},
}
def publish_github_pipeline(mode):
trigger = {
'event': ['promote'],
'target': [mode],
"event": ["promote"],
"target": [mode],
}
return [pipeline(
name='publish-github-{}'.format(mode), trigger=trigger, steps=[compile_build_cmd(), fetch_images_step('enterprise2'), publish_github_step()], edition="", environment = {'EDITION': 'enterprise2'}
),]
name = "publish-github-{}".format(mode),
trigger = trigger,
steps = [compile_build_cmd(), fetch_images_step("enterprise2"), publish_github_step()],
edition = "",
environment = {"EDITION": "enterprise2"},
)]
+62 -27
View File
@@ -1,44 +1,79 @@
load(
'scripts/drone/steps/lib.star',
'identify_runner_step',
'download_grabpl_step',
'verify_gen_cue_step',
'verify_gen_jsonnet_step',
'wire_install_step',
'postgres_integration_tests_step',
'mysql_integration_tests_step',
'compile_build_cmd',
)
"""
This module returns the pipeline used for integration tests.
"""
load(
'scripts/drone/services/services.star',
'integration_test_services',
'integration_test_services_volumes',
'ldap_service',
"scripts/drone/steps/lib.star",
"compile_build_cmd",
"download_grabpl_step",
"enterprise_setup_step",
"identify_runner_step",
"mysql_integration_tests_step",
"postgres_integration_tests_step",
"verify_gen_cue_step",
"verify_gen_jsonnet_step",
"wire_install_step",
)
load(
'scripts/drone/utils/utils.star',
'pipeline',
"scripts/drone/services/services.star",
"integration_test_services",
"integration_test_services_volumes",
)
load(
"scripts/drone/utils/utils.star",
"pipeline",
)
def integration_tests(trigger, ver_mode, edition):
services = integration_test_services(edition)
def integration_tests(trigger, prefix, ver_mode = "pr"):
"""Generate a pipeline for integration tests.
Args:
trigger: controls which events can trigger the pipeline execution.
prefix: used in the naming of the pipeline.
ver_mode: defines the event / origin of this build. In this function, if it is set to pr, then it will attempt to clone grafana-enterprise. Otherwise it has no effect.
Returns:
Drone pipeline.
"""
environment = {"EDITION": "oss"}
services = integration_test_services(edition = "oss")
volumes = integration_test_services_volumes()
init_steps = [
init_steps = []
verify_step = verify_gen_cue_step()
verify_jsonnet_step = verify_gen_jsonnet_step()
if ver_mode == "pr":
# In pull requests, attempt to clone grafana enterprise.
init_steps.append(enterprise_setup_step())
# Ensure that verif_gen_cue happens after we clone enterprise
# At the time of writing this, very_gen_cue is depended on by the wire step which is what everything else depends on.
verify_step["depends_on"].append("clone-enterprise")
verify_jsonnet_step["depends_on"].append("clone-enterprise")
init_steps += [
download_grabpl_step(),
compile_build_cmd(),
identify_runner_step(),
verify_gen_cue_step(edition="oss"),
verify_gen_jsonnet_step(edition="oss"),
verify_step,
verify_jsonnet_step,
wire_install_step(),
]
test_steps = [
postgres_integration_tests_step(edition=edition, ver_mode=ver_mode),
mysql_integration_tests_step(edition=edition, ver_mode=ver_mode),
postgres_integration_tests_step(),
mysql_integration_tests_step(),
]
return pipeline(
name='{}-integration-tests'.format(ver_mode), edition="oss", trigger=trigger, services=services, steps=init_steps + test_steps,
volumes=volumes
name = "{}-integration-tests".format(prefix),
edition = "oss",
trigger = trigger,
environment = environment,
services = services,
volumes = volumes,
steps = init_steps + test_steps,
)
+45 -16
View File
@@ -1,31 +1,60 @@
load(
'scripts/drone/steps/lib.star',
'identify_runner_step',
'wire_install_step',
'lint_backend_step',
'lint_drone_step',
'compile_build_cmd',
)
"""
This module returns the pipeline used for linting backend code.
"""
load(
'scripts/drone/utils/utils.star',
'pipeline',
"scripts/drone/steps/lib.star",
"compile_build_cmd",
"enterprise_setup_step",
"identify_runner_step",
"lint_backend_step",
"lint_drone_step",
"wire_install_step",
)
load(
"scripts/drone/utils/utils.star",
"pipeline",
)
def lint_backend_pipeline(trigger, ver_mode):
"""Generates the pipelines used linting backend code.
Args:
trigger: controls which events can trigger the pipeline execution.
ver_mode: used in the naming of the pipeline.
Returns:
Drone pipeline.
"""
environment = {"EDITION": "oss"}
wire_step = wire_install_step()
wire_step.update({ 'depends_on': [] })
wire_step.update({"depends_on": []})
init_steps = [
identify_runner_step(),
compile_build_cmd(),
wire_step,
]
if ver_mode == "pr":
# In pull requests, attempt to clone grafana enterprise.
init_steps.append(enterprise_setup_step())
wire_step["depends_on"].append("clone-enterprise")
init_steps.append(wire_step)
test_steps = [
lint_backend_step(edition="oss"),
lint_backend_step(),
]
if ver_mode == 'main':
test_steps.extend([lint_drone_step()])
if ver_mode == "main":
test_steps.append(lint_drone_step())
return pipeline(
name='{}-lint-backend'.format(ver_mode), edition="oss", trigger=trigger, services=[], steps=init_steps + test_steps,
name = "{}-lint-backend".format(ver_mode),
edition = "oss",
trigger = trigger,
services = [],
steps = init_steps + test_steps,
environment = environment,
)
+43 -14
View File
@@ -1,25 +1,54 @@
load(
'scripts/drone/steps/lib.star',
'identify_runner_step',
'yarn_install_step',
'lint_frontend_step',
)
"""
This module returns the pipeline used for linting frontend code.
"""
load(
'scripts/drone/utils/utils.star',
'pipeline',
"scripts/drone/steps/lib.star",
"enterprise_setup_step",
"identify_runner_step",
"lint_frontend_step",
"yarn_install_step",
)
load(
"scripts/drone/utils/utils.star",
"pipeline",
)
def lint_frontend_pipeline(trigger, ver_mode):
yarn_step = yarn_install_step()
yarn_step.update({ 'depends_on': [] })
init_steps = [
"""Generates the pipelines used linting frontend code.
Args:
trigger: controls which events can trigger the pipeline execution.
ver_mode: used in the naming of the pipeline.
Returns:
Drone pipeline.
"""
environment = {"EDITION": "oss"}
init_steps = []
lint_step = lint_frontend_step()
if ver_mode == "pr":
# In pull requests, attempt to clone grafana enterprise.
init_steps = [enterprise_setup_step()]
# Ensure the lint step happens after the clone-enterprise step
lint_step["depends_on"].append("clone-enterprise")
init_steps += [
identify_runner_step(),
yarn_step,
yarn_install_step(),
]
test_steps = [
lint_frontend_step(),
lint_step,
]
return pipeline(
name='{}-lint-frontend'.format(ver_mode), edition="oss", trigger=trigger, services=[], steps=init_steps + test_steps,
name = "{}-lint-frontend".format(ver_mode),
edition = "oss",
trigger = trigger,
services = [],
steps = init_steps + test_steps,
environment = environment,
)
+77 -30
View File
@@ -1,50 +1,97 @@
load(
'scripts/drone/steps/lib.star',
'download_grabpl_step',
'publish_images_step',
'compile_build_cmd',
'fetch_images_step',
)
"""
This module returns the pipeline used for publishing Docker images and its steps.
"""
load(
'scripts/drone/utils/utils.star',
'pipeline',
"scripts/drone/steps/lib.star",
"compile_build_cmd",
"download_grabpl_step",
"fetch_images_step",
"identify_runner_step",
"publish_images_step",
)
load(
"scripts/drone/utils/utils.star",
"pipeline",
)
def publish_image_steps(edition, mode, docker_repo):
additional_docker_repo = ""
if edition == 'oss':
additional_docker_repo='grafana/grafana-oss'
"""Generates the steps used for publising Docker images using grabpl.
Args:
edition: controls which version of an image is fetched in the case of a release.
It also controls which publishing implementation is used.
If edition == 'oss', it additionally publishes the grafana/grafana-oss repository.
mode: uses to control the publishing of security images when mode == 'security'.
docker_repo: the Docker image name.
It is combined with the 'grafana/' library prefix.
Returns:
List of Drone steps.
"""
steps = [
identify_runner_step(),
download_grabpl_step(),
compile_build_cmd(),
fetch_images_step(edition),
publish_images_step(edition, 'release', mode, docker_repo),
publish_images_step(edition, "release", mode, docker_repo),
]
if additional_docker_repo != "":
steps.extend([publish_images_step(edition, 'release', mode, additional_docker_repo)])
if edition == "oss":
steps.append(
publish_images_step(edition, "release", mode, "grafana-oss"),
)
return steps
def publish_image_pipelines_public():
mode='public'
"""Generates the pipeline used for publising public Docker images.
Returns:
Drone pipeline
"""
mode = "public"
trigger = {
'event': ['promote'],
'target': [mode],
"event": ["promote"],
"target": [mode],
}
return [pipeline(
name='publish-docker-oss-{}'.format(mode), trigger=trigger, steps=publish_image_steps(edition='oss', mode=mode, docker_repo='grafana/grafana'), edition=""
), pipeline(
name='publish-docker-enterprise-{}'.format(mode), trigger=trigger, steps=publish_image_steps(edition='enterprise', mode=mode, docker_repo='grafana/grafana-enterprise'), edition=""
),]
return [
pipeline(
name = "publish-docker-oss-{}".format(mode),
trigger = trigger,
steps = publish_image_steps(edition = "oss", mode = mode, docker_repo = "grafana"),
edition = "",
environment = {"EDITION": "oss"},
),
pipeline(
name = "publish-docker-enterprise-{}".format(mode),
trigger = trigger,
steps = publish_image_steps(
edition = "enterprise",
mode = mode,
docker_repo = "grafana-enterprise",
),
edition = "",
environment = {"EDITION": "enterprise"},
),
]
def publish_image_pipelines_security():
mode='security'
mode = "security"
trigger = {
'event': ['promote'],
'target': [mode],
"event": ["promote"],
"target": [mode],
}
return [pipeline(
name='publish-docker-enterprise-{}'.format(mode), trigger=trigger, steps=publish_image_steps(edition='enterprise', mode=mode, docker_repo='grafana/grafana-enterprise'), edition=""
),]
return [
pipeline(
name = "publish-docker-enterprise-{}".format(mode),
trigger = trigger,
steps = publish_image_steps(
edition = "enterprise",
mode = mode,
docker_repo = "grafana-enterprise",
),
edition = "",
environment = {"EDITION": "enterprise"},
),
]
+27 -25
View File
@@ -1,48 +1,50 @@
load(
'scripts/drone/steps/lib.star',
'build_image',
'compile_build_cmd'
)
"""
This module returns a Drone step and pipeline for linting with shellcheck.
"""
load("scripts/drone/steps/lib.star", "build_image", "compile_build_cmd")
load(
'scripts/drone/utils/utils.star',
'pipeline',
"scripts/drone/utils/utils.star",
"pipeline",
)
trigger = {
'event': [
'pull_request',
"event": [
"pull_request",
],
'paths': {
'exclude': [
'*.md',
'docs/**',
'latest.json',
],
'include': [
'scripts/**/*.sh'
"paths": {
"exclude": [
"*.md",
"docs/**",
"latest.json",
],
"include": ["scripts/**/*.sh"],
},
}
def shellcheck_step():
return {
'name': 'shellcheck',
'image': build_image,
'depends_on': [
'compile-build-cmd',
"name": "shellcheck",
"image": build_image,
"depends_on": [
"compile-build-cmd",
],
'commands': [
'./bin/build shellcheck',
"commands": [
"./bin/build shellcheck",
],
}
def shellcheck_pipeline():
environment = {"EDITION": "oss"}
steps = [
compile_build_cmd(),
shellcheck_step(),
]
return pipeline(
name='pr-shellcheck', edition="oss", trigger=trigger, services=[], steps=steps,
name = "pr-shellcheck",
edition = "oss",
trigger = trigger,
services = [],
steps = steps,
environment = environment,
)
+110 -31
View File
@@ -1,42 +1,121 @@
load(
'scripts/drone/steps/lib.star',
'identify_runner_step',
'download_grabpl_step',
'wire_install_step',
'test_backend_step',
'test_backend_integration_step',
'verify_gen_cue_step',
'verify_gen_jsonnet_step',
'compile_build_cmd',
'clone_enterprise_step',
'init_enterprise_step',
)
"""
This module returns the pipeline used for testing backend code.
"""
load(
'scripts/drone/utils/utils.star',
'pipeline',
"scripts/drone/steps/lib.star",
"clone_enterprise_step",
"compile_build_cmd",
"download_grabpl_step",
"enterprise_setup_step",
"identify_runner_step",
"init_enterprise_step",
"test_backend_integration_step",
"test_backend_step",
"verify_gen_cue_step",
"verify_gen_jsonnet_step",
"wire_install_step",
)
load(
"scripts/drone/utils/utils.star",
"pipeline",
"with_deps",
)
def test_backend(trigger, ver_mode, edition="oss"):
environment = {'EDITION': edition}
init_steps = []
if edition != 'oss':
init_steps.extend([clone_enterprise_step(ver_mode), download_grabpl_step(), init_enterprise_step(ver_mode),])
init_steps.extend([
def test_backend(trigger, ver_mode):
"""Generates the pipeline used for testing OSS backend code.
Args:
trigger: a Drone trigger for the pipeline.
ver_mode: affects the pipeline name.
Returns:
Drone pipeline.
"""
environment = {"EDITION": "oss"}
steps = []
verify_step = verify_gen_cue_step()
verify_jsonnet_step = verify_gen_jsonnet_step()
if ver_mode == "pr":
# In pull requests, attempt to clone grafana enterprise.
steps.append(enterprise_setup_step())
# Ensure that verif_gen_cue happens after we clone enterprise
# At the time of writing this, very_gen_cue is depended on by the wire step which is what everything else depends on.
verify_step["depends_on"].append("clone-enterprise")
verify_jsonnet_step["depends_on"].append("clone-enterprise")
steps += [
identify_runner_step(),
compile_build_cmd(edition),
verify_gen_cue_step(edition),
verify_gen_jsonnet_step(edition),
compile_build_cmd(edition = "oss"),
verify_step,
verify_jsonnet_step,
wire_install_step(),
])
test_steps = [
test_backend_step(edition),
test_backend_integration_step(edition),
test_backend_step(),
test_backend_integration_step(),
]
pipeline_name = '{}-test-backend'.format(ver_mode)
pipeline_name = "{}-test-backend".format(ver_mode)
if ver_mode in ("release-branch", "release"):
pipeline_name = '{}-{}-test-backend'.format(ver_mode, edition)
pipeline_name = "{}-{}-test-backend".format(ver_mode, "oss")
return pipeline(
name=pipeline_name, edition=edition, trigger=trigger, services=[], steps=init_steps + test_steps, environment=environment
name = pipeline_name,
edition = "oss",
trigger = trigger,
steps = steps,
environment = environment,
)
def test_backend_enterprise(trigger, ver_mode, source, edition = "enterprise"):
"""Generates the pipeline used for testing backend enterprise code.
Args:
trigger: a Drone trigger for the pipeline.
ver_mode: affects the pipeline name.
source: controls what revision of enterprise code to test with. The source of the PR, usually.
edition: affects the clone step in the pipeline and also affects the pipeline name.
Returns:
Drone pipeline.
"""
environment = {"EDITION": edition}
steps = (
[
clone_enterprise_step(source),
download_grabpl_step(),
init_enterprise_step(ver_mode),
identify_runner_step(),
compile_build_cmd(edition),
] +
with_deps(
[
verify_gen_cue_step(),
verify_gen_jsonnet_step(),
],
[
"init-enterprise",
],
) +
[
wire_install_step(),
test_backend_step(),
test_backend_integration_step(),
]
)
pipeline_name = "{}-test-backend".format(ver_mode)
if ver_mode in ("release-branch", "release"):
pipeline_name = "{}-{}-test-backend".format(ver_mode, edition)
return pipeline(
name = pipeline_name,
edition = edition,
trigger = trigger,
steps = steps,
environment = environment,
)
+93 -26
View File
@@ -1,36 +1,103 @@
load(
'scripts/drone/steps/lib.star',
'identify_runner_step',
'clone_enterprise_step',
'init_enterprise_step',
'download_grabpl_step',
'yarn_install_step',
'betterer_frontend_step',
'test_frontend_step',
)
"""
This module returns the pipeline used for testing backend code.
"""
load(
'scripts/drone/utils/utils.star',
'pipeline',
"scripts/drone/steps/lib.star",
"betterer_frontend_step",
"clone_enterprise_step",
"download_grabpl_step",
"enterprise_setup_step",
"identify_runner_step",
"init_enterprise_step",
"test_frontend_step",
"yarn_install_step",
)
load(
"scripts/drone/utils/utils.star",
"pipeline",
"with_deps",
)
def test_frontend(trigger, ver_mode, edition="oss"):
environment = {'EDITION': edition}
init_steps = []
if edition != 'oss':
init_steps.extend([clone_enterprise_step(ver_mode), init_enterprise_step(ver_mode),])
init_steps.extend([
def test_frontend(trigger, ver_mode):
"""Generates the pipeline used for testing frontend code.
Args:
trigger: a Drone trigger for the pipeline
ver_mode: indirectly controls which revision of enterprise code to use.
Returns:
Drone pipeline.
"""
environment = {"EDITION": "oss"}
steps = [
identify_runner_step(),
download_grabpl_step(),
yarn_install_step(edition),
])
test_steps = [
betterer_frontend_step(edition),
test_frontend_step(edition),
yarn_install_step(),
betterer_frontend_step(edition = "oss"),
]
pipeline_name = '{}-test-frontend'.format(ver_mode)
pipeline_name = "{}-test-frontend".format(ver_mode)
test_step = test_frontend_step(edition = "oss")
if ver_mode == "pr":
# In pull requests, attempt to clone grafana enterprise.
steps.append(enterprise_setup_step())
# Also, make the test step depend on 'clone-enterprise
test_step["depends_on"].append("clone-enterprise")
steps.append(test_step)
pipeline_name = "{}-test-frontend".format(ver_mode)
if ver_mode in ("release-branch", "release"):
pipeline_name = '{}-{}-test-frontend'.format(ver_mode, edition)
pipeline_name = "{}-oss-test-frontend".format(ver_mode)
return pipeline(
name=pipeline_name, edition=edition, trigger=trigger, services=[], steps=init_steps + test_steps,
name = pipeline_name,
edition = "oss",
trigger = trigger,
steps = steps,
environment = environment,
)
def test_frontend_enterprise(trigger, ver_mode, source, edition = "enterprise"):
"""Generates the pipeline used for testing frontend enterprise code.
Args:
trigger: a Drone trigger for the pipeline.
ver_mode: affects the pipeline name.
source: controls what revision of Grafana code to test with.
edition: affects the clone step in the pipeline and also affects the pipeline name.
Returns:
Drone pipeline.
"""
environment = {"EDITION": edition}
steps = (
[
clone_enterprise_step(source),
init_enterprise_step(ver_mode),
identify_runner_step(),
download_grabpl_step(),
] +
with_deps([yarn_install_step()], ["init-enterprise"]) +
[
betterer_frontend_step(edition),
test_frontend_step(edition),
]
)
pipeline_name = "{}-test-frontend".format(ver_mode)
if ver_mode in ("release-branch", "release"):
pipeline_name = "{}-{}-test-frontend".format(ver_mode, edition)
return pipeline(
name = pipeline_name,
edition = edition,
trigger = trigger,
steps = steps,
environment = environment,
)
+35 -18
View File
@@ -1,28 +1,45 @@
load(
'scripts/drone/steps/lib.star',
'enterprise_downstream_step',
)
"""
This module returns the pipeline used for triggering a downstream pipeline for Grafana Enterprise.
"""
load(
'scripts/drone/utils/utils.star',
'pipeline',
"scripts/drone/steps/lib.star",
"enterprise_downstream_step",
)
load(
"scripts/drone/utils/utils.star",
"pipeline",
)
trigger = {
'event': ['push',],
'branch': 'main',
'paths': {
'exclude': [
'*.md',
'docs/**',
'latest.json',
"event": [
"push",
],
"branch": "main",
"paths": {
"exclude": [
"*.md",
"docs/**",
"latest.json",
],
},
}
def enterprise_downstream_pipeline(edition, ver_mode):
steps = [enterprise_downstream_step(edition, ver_mode)]
deps = ['main-build-e2e-publish', 'main-integration-tests']
def enterprise_downstream_pipeline():
environment = {"EDITION": "oss"}
steps = [
enterprise_downstream_step(ver_mode = "main"),
]
deps = [
"main-build-e2e-publish",
"main-integration-tests",
]
return pipeline(
name='main-trigger-downstream', edition=edition, trigger=trigger, services=[], steps=steps, depends_on=deps
)
name = "main-trigger-downstream",
edition = "oss",
trigger = trigger,
services = [],
steps = steps,
depends_on = deps,
environment = environment,
)
+19 -10
View File
@@ -1,17 +1,21 @@
load(
'scripts/drone/steps/lib.star',
'identify_runner_step',
'download_grabpl_step',
'lint_drone_step',
'compile_build_cmd',
)
"""
This module returns the pipeline used for verifying Drone configuration.
"""
load(
'scripts/drone/utils/utils.star',
'pipeline',
"scripts/drone/steps/lib.star",
"compile_build_cmd",
"download_grabpl_step",
"identify_runner_step",
"lint_drone_step",
)
load(
"scripts/drone/utils/utils.star",
"pipeline",
)
def verify_drone(trigger, ver_mode):
environment = {"EDITION": "oss"}
steps = [
identify_runner_step(),
download_grabpl_step(),
@@ -19,5 +23,10 @@ def verify_drone(trigger, ver_mode):
lint_drone_step(),
]
return pipeline(
name='{}-verify-drone'.format(ver_mode), edition="oss", trigger=trigger, services=[], steps=steps,
name = "{}-verify-drone".format(ver_mode),
edition = "oss",
trigger = trigger,
services = [],
steps = steps,
environment = environment,
)
@@ -0,0 +1,32 @@
"""
This module returns a Drone pipeline that verifies all Starlark files are linted.
"""
load(
"scripts/drone/steps/lib.star",
"compile_build_cmd",
"download_grabpl_step",
"identify_runner_step",
"lint_starlark_step",
)
load(
"scripts/drone/utils/utils.star",
"pipeline",
)
def verify_starlark(trigger, ver_mode):
environment = {"EDITION": "oss"}
steps = [
identify_runner_step(),
download_grabpl_step(),
compile_build_cmd(),
lint_starlark_step(),
]
return pipeline(
name = "{}-verify-starlark".format(ver_mode),
edition = "oss",
trigger = trigger,
services = [],
steps = steps,
environment = environment,
)
+32 -125
View File
@@ -1,134 +1,41 @@
load(
'scripts/drone/steps/lib.star',
'grabpl_version',
'wix_image',
'identify_runner_step',
)
"""
This module returns the pipeline used for building Grafana on Windows.
"""
load(
'scripts/drone/utils/utils.star',
'pipeline',
"scripts/drone/utils/utils.star",
"pipeline",
)
load(
"scripts/drone/steps/lib.star",
"get_windows_steps",
)
load('scripts/drone/vault.star', 'from_secret', 'prerelease_bucket', 'github_token')
def windows(trigger, edition, ver_mode):
init_cmds = []
sfx = ''
if edition in ('enterprise', 'enterprise2'):
sfx = '-{}'.format(edition)
else:
init_cmds.extend([
'$$ProgressPreference = "SilentlyContinue"',
'Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/{}/windows/grabpl.exe -OutFile grabpl.exe'.format(
grabpl_version),
])
steps = [
{
'name': 'windows-init',
'image': wix_image,
'commands': init_cmds,
},
]
if (ver_mode == 'main' and (edition not in ('enterprise', 'enterprise2'))) or ver_mode in (
'release', 'release-branch',
):
bucket = '%PRERELEASE_BUCKET%/artifacts/downloads'
if ver_mode == 'release':
ver_part = '${DRONE_TAG}'
dir = 'release'
else:
dir = 'main'
bucket = 'grafana-downloads'
build_no = 'DRONE_BUILD_NUMBER'
ver_part = '--build-id $$env:{}'.format(build_no)
installer_commands = [
'$$gcpKey = $$env:GCP_KEY',
'[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($$gcpKey)) > gcpkey.json',
# gcloud fails to read the file unless converted with dos2unix
'dos2unix gcpkey.json',
'gcloud auth activate-service-account --key-file=gcpkey.json',
'rm gcpkey.json',
'cp C:\\App\\nssm-2.24.zip .',
]
if (ver_mode == 'main' and (edition not in ('enterprise', 'enterprise2'))) or ver_mode in (
'release',
):
installer_commands.extend([
'.\\grabpl.exe windows-installer --edition {} {}'.format(edition, ver_part),
'$$fname = ((Get-Childitem grafana*.msi -name) -split "`n")[0]',
])
if ver_mode == 'main':
installer_commands.extend([
'gsutil cp $$fname gs://{}/{}/{}/'.format(bucket, edition, dir),
'gsutil cp "$$fname.sha256" gs://{}/{}/{}/'.format(bucket, edition, dir),
])
else:
installer_commands.extend([
'gsutil cp $$fname gs://{}/{}/{}/{}/'.format(bucket, ver_part, edition, dir),
'gsutil cp "$$fname.sha256" gs://{}/{}/{}/{}/'.format(bucket, ver_part, edition, dir),
])
steps.append({
'name': 'build-windows-installer',
'image': wix_image,
'depends_on': [
'windows-init',
],
'environment': {
'GCP_KEY': from_secret('gcp_key'),
'PRERELEASE_BUCKET': from_secret(prerelease_bucket),
'GITHUB_TOKEN': from_secret('github_token')
},
'commands': installer_commands,
})
"""Generates the pipeline used for building Grafana on Windows.
if edition in ('enterprise', 'enterprise2'):
if ver_mode == 'release':
committish = '${DRONE_TAG}'
elif ver_mode == 'release-branch':
committish = '$$env:DRONE_BRANCH'
else:
committish = '$$env:DRONE_COMMIT'
# For enterprise, we have to clone both OSS and enterprise and merge the latter into the former
download_grabpl_step_cmds = [
'$$ProgressPreference = "SilentlyContinue"',
'Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/{}/windows/grabpl.exe -OutFile grabpl.exe'.format(
grabpl_version),
]
clone_cmds = [
'git clone "https://$$env:GITHUB_TOKEN@github.com/grafana/grafana-enterprise.git"',
]
clone_cmds.extend([
'cd grafana-enterprise',
'git checkout {}'.format(committish),
])
steps.insert(0, {
'name': 'clone',
'image': wix_image,
'environment': {
'GITHUB_TOKEN': from_secret(github_token),
},
'commands': download_grabpl_step_cmds + clone_cmds,
})
steps[1]['depends_on'] = [
'clone',
]
steps[1]['commands'].extend([
# Need to move grafana-enterprise out of the way, so directory is empty and can be cloned into
'cp -r grafana-enterprise C:\\App\\grafana-enterprise',
'rm -r -force grafana-enterprise',
'cp grabpl.exe C:\\App\\grabpl.exe',
'rm -force grabpl.exe',
'C:\\App\\grabpl.exe init-enterprise --github-token $$env:GITHUB_TOKEN C:\\App\\grafana-enterprise',
'cp C:\\App\\grabpl.exe grabpl.exe',
])
if 'environment' in steps[1]:
steps[1]['environment'] + {'GITHUB_TOKEN': from_secret(github_token)}
else:
steps[1]['environment'] = {'GITHUB_TOKEN': from_secret(github_token)}
Args:
trigger: a Drone trigger for the pipeline.
edition: controls whether enterprise code is included in the pipeline steps.
ver_mode: controls whether a pre-release or actual release pipeline is generated.
Also indirectly controls which version of enterprise code is used.
Returns:
Drone pipeline.
"""
environment = {"EDITION": edition}
return pipeline(
name='main-windows', edition=edition, trigger=dict(trigger, repo=['grafana/grafana']),
steps=[identify_runner_step('windows')] + steps,
depends_on=['main-test-frontend', 'main-test-backend', 'main-build-e2e-publish', 'main-integration-tests'], platform='windows',
name = "main-windows",
edition = edition,
trigger = dict(trigger, repo = ["grafana/grafana"]),
steps = get_windows_steps(edition, ver_mode),
depends_on = [
"main-test-frontend",
"main-test-backend",
"main-build-e2e-publish",
"main-integration-tests",
],
platform = "windows",
environment = environment,
)
+46 -41
View File
@@ -1,61 +1,66 @@
"""
This module has functions for Drone services to be used in pipelines.
"""
def integration_test_services_volumes():
return [
{ 'name': 'postgres', 'temp': { 'medium': 'memory' } },
{ 'name': 'mysql', 'temp': { 'medium': 'memory' }
}]
{"name": "postgres", "temp": {"medium": "memory"}},
{"name": "mysql", "temp": {"medium": "memory"}},
]
def integration_test_services(edition):
services = [
{
'name': 'postgres',
'image': 'postgres:12.3-alpine',
'environment': {
'POSTGRES_USER': 'grafanatest',
'POSTGRES_PASSWORD': 'grafanatest',
'POSTGRES_DB': 'grafanatest',
'PGDATA': '/var/lib/postgresql/data/pgdata',
"name": "postgres",
"image": "postgres:12.3-alpine",
"environment": {
"POSTGRES_USER": "grafanatest",
"POSTGRES_PASSWORD": "grafanatest",
"POSTGRES_DB": "grafanatest",
"PGDATA": "/var/lib/postgresql/data/pgdata",
},
'volumes': [{
'name': 'postgres',
'path': '/var/lib/postgresql/data/pgdata'
}],
"volumes": [
{"name": "postgres", "path": "/var/lib/postgresql/data/pgdata"},
],
},
{
'name': 'mysql',
'image': 'mysql:5.7.39',
'environment': {
'MYSQL_ROOT_PASSWORD': 'rootpass',
'MYSQL_DATABASE': 'grafana_tests',
'MYSQL_USER': 'grafana',
'MYSQL_PASSWORD': 'password',
"name": "mysql",
"image": "mysql:5.7.39",
"environment": {
"MYSQL_ROOT_PASSWORD": "rootpass",
"MYSQL_DATABASE": "grafana_tests",
"MYSQL_USER": "grafana",
"MYSQL_PASSWORD": "password",
},
'volumes': [{
'name': 'mysql',
'path': '/var/lib/mysql'
}]
"volumes": [{"name": "mysql", "path": "/var/lib/mysql"}],
},
]
if edition in ('enterprise', 'enterprise2'):
services.extend([{
'name': 'redis',
'image': 'redis:6.2.1-alpine',
'environment': {},
}, {
'name': 'memcached',
'image': 'memcached:1.6.9-alpine',
'environment': {},
}])
if edition in ("enterprise", "enterprise2"):
services.extend(
[
{
"name": "redis",
"image": "redis:6.2.1-alpine",
"environment": {},
},
{
"name": "memcached",
"image": "memcached:1.6.9-alpine",
"environment": {},
},
],
)
return services
def ldap_service():
return {
'name': 'ldap',
'image': 'osixia/openldap:1.4.0',
'environment': {
'LDAP_ADMIN_PASSWORD': 'grafana',
'LDAP_DOMAIN': 'grafana.org',
'SLAPD_ADDITIONAL_MODULES': 'memberof',
"name": "ldap",
"image": "osixia/openldap:1.4.0",
"environment": {
"LDAP_ADMIN_PASSWORD": "grafana",
"LDAP_DOMAIN": "grafana.org",
"SLAPD_ADDITIONAL_MODULES": "memberof",
},
}
+1128 -843
View File
File diff suppressed because it is too large Load Diff
+102 -57
View File
@@ -1,91 +1,136 @@
"""
This module contains utility functions for generating Drone pipelines.
"""
load(
'scripts/drone/steps/lib.star',
'download_grabpl_step',
'slack_step',
"scripts/drone/steps/lib.star",
"slack_step",
)
load("scripts/drone/vault.star", "pull_secret")
load('scripts/drone/vault.star', 'from_secret', 'github_token', 'pull_secret', 'drone_token')
failure_template = 'Build {{build.number}} failed for commit: <https://github.com/{{repo.owner}}/{{repo.name}}/commit/{{build.commit}}|{{ truncate build.commit 8 }}>: {{build.link}}\nBranch: <https://github.com/{{ repo.owner }}/{{ repo.name }}/commits/{{ build.branch }}|{{ build.branch }}>\nAuthor: {{build.author}}'
drone_change_template = '`.drone.yml` and `starlark` files have been changed on the OSS repo, by: {{build.author}}. \nBranch: <https://github.com/{{ repo.owner }}/{{ repo.name }}/commits/{{ build.branch }}|{{ build.branch }}>\nCommit hash: <https://github.com/{{repo.owner}}/{{repo.name}}/commit/{{build.commit}}|{{ truncate build.commit 8 }}>'
failure_template = "Build {{build.number}} failed for commit: <https://github.com/{{repo.owner}}/{{repo.name}}/commit/{{build.commit}}|{{ truncate build.commit 8 }}>: {{build.link}}\nBranch: <https://github.com/{{ repo.owner }}/{{ repo.name }}/commits/{{ build.branch }}|{{ build.branch }}>\nAuthor: {{build.author}}"
drone_change_template = "`.drone.yml` and `starlark` files have been changed on the OSS repo, by: {{build.author}}. \nBranch: <https://github.com/{{ repo.owner }}/{{ repo.name }}/commits/{{ build.branch }}|{{ build.branch }}>\nCommit hash: <https://github.com/{{repo.owner}}/{{repo.name}}/commit/{{build.commit}}|{{ truncate build.commit 8 }}>"
def pipeline(
name, edition, trigger, steps, services=[], platform='linux', depends_on=[], environment=None, volumes=[],
):
if platform != 'windows':
name,
edition,
trigger,
steps,
services = [],
platform = "linux",
depends_on = [],
environment = None,
volumes = []):
"""Generate a Drone Docker pipeline with commonly used values.
In addition to the parameters provided, it configures:
- the use of an image pull secret
- a retry count for cloning
- a volume 'docker' that can be used to access the Docker socket
Args:
name: controls the pipeline name.
edition: used to differentiate the pipeline for enterprise builds.
trigger: a Drone trigger for the pipeline.
steps: the Drone steps for the pipeline.
services: auxilliary services used during the pipeline.
Defaults to [].
platform: abstracts platform specific configuration primarily for different Drone behavior on Windows.
Defaults to 'linux'.
depends_on: list of pipelines that must have succeeded before this pipeline can start.
Defaults to [].
environment: environment variables passed through to pipeline steps.
Defaults to None.
volumes: additional volumes available to be mounted by pipeline steps.
Defaults to [].
Returns:
Drone pipeline
"""
if platform != "windows":
platform_conf = {
'platform': {
'os': 'linux',
'arch': 'amd64'
},
"platform": {"os": "linux", "arch": "amd64"},
# A shared cache is used on the host
# To avoid issues with parallel builds, we run this repo on single build agents
'node': {
'type': 'no-parallel'
}
"node": {"type": "no-parallel"},
}
else:
platform_conf = {
'platform': {
'os': 'windows',
'arch': 'amd64',
'version': '1809',
}
"platform": {
"os": "windows",
"arch": "amd64",
"version": "1809",
},
}
pipeline = {
'kind': 'pipeline',
'type': 'docker',
'name': name,
'trigger': trigger,
'services': services,
'steps': steps,
'clone': {
'retries': 3,
"kind": "pipeline",
"type": "docker",
"name": name,
"trigger": trigger,
"services": services,
"steps": steps,
"clone": {
"retries": 3,
},
'volumes': [{
'name': 'docker',
'host': {
'path': '/var/run/docker.sock',
"volumes": [
{
"name": "docker",
"host": {
"path": "/var/run/docker.sock",
},
},
}],
'depends_on': depends_on,
'image_pull_secrets': [pull_secret],
],
"depends_on": depends_on,
"image_pull_secrets": [pull_secret],
}
if environment:
pipeline.update({
'environment': environment,
})
pipeline.update(
{
"environment": environment,
},
)
pipeline['volumes'].extend(volumes)
pipeline["volumes"].extend(volumes)
pipeline.update(platform_conf)
if edition in ('enterprise', 'enterprise2'):
if edition in ("enterprise", "enterprise2"):
# We have a custom clone step for enterprise
pipeline['clone'] = {
'disable': True,
pipeline["clone"] = {
"disable": True,
}
return pipeline
def notify_pipeline(name, slack_channel, trigger, depends_on=[], template=None, secret=None):
def notify_pipeline(
name,
slack_channel,
trigger,
depends_on = [],
template = None,
secret = None):
trigger = dict(trigger)
return {
'kind': 'pipeline',
'type': 'docker',
'platform': {
'os': 'linux',
'arch': 'amd64',
"kind": "pipeline",
"type": "docker",
"platform": {
"os": "linux",
"arch": "amd64",
},
'name': name,
'trigger': trigger,
'steps': [
"name": name,
"trigger": trigger,
"steps": [
slack_step(slack_channel, template, secret),
],
'clone': {
'retries': 3,
"clone": {
"retries": 3,
},
'depends_on': depends_on,
"depends_on": depends_on,
}
# TODO: this overrides any existing dependencies because we're following the existing logic
# it should append to any existing dependencies
def with_deps(steps, deps = []):
for step in steps:
step["depends_on"] = deps
return steps
+68 -53
View File
@@ -1,82 +1,97 @@
pull_secret = 'dockerconfigjson'
github_token = 'github_token'
drone_token = 'drone_token'
prerelease_bucket = 'prerelease_bucket'
gcp_upload_artifacts_key = 'gcp_upload_artifacts_key'
azure_sp_app_id = 'azure_sp_app_id'
azure_sp_app_pw = 'azure_sp_app_pw'
azure_tenant = 'azure_tenant'
"""
This module returns functions for generating Drone secrets fetched from Vault.
"""
pull_secret = "dockerconfigjson"
drone_token = "drone_token"
prerelease_bucket = "prerelease_bucket"
gcp_upload_artifacts_key = "gcp_upload_artifacts_key"
azure_sp_app_id = "azure_sp_app_id"
azure_sp_app_pw = "azure_sp_app_pw"
azure_tenant = "azure_tenant"
def from_secret(secret):
return {
'from_secret': secret
}
return {"from_secret": secret}
def vault_secret(name, path, key):
return {
'kind': 'secret',
'name': name,
'get': {
'path': path,
'name': key,
}
"kind": "secret",
"name": name,
"get": {
"path": path,
"name": key,
},
}
def secrets():
return [
vault_secret(pull_secret, 'secret/data/common/gcr', '.dockerconfigjson'),
vault_secret(github_token, 'infra/data/ci/github/grafanabot', 'pat'),
vault_secret(drone_token, 'infra/data/ci/drone', 'machine-user-token'),
vault_secret(prerelease_bucket, 'infra/data/ci/grafana/prerelease', 'bucket'),
vault_secret(gcp_upload_artifacts_key, 'infra/data/ci/grafana/releng/artifacts-uploader-service-account', 'credentials.json'),
vault_secret(azure_sp_app_id, 'infra/data/ci/datasources/cpp-azure-resourcemanager-credentials', 'application_id'),
vault_secret(azure_sp_app_pw, 'infra/data/ci/datasources/cpp-azure-resourcemanager-credentials', 'application_secret'),
vault_secret(azure_tenant, 'infra/data/ci/datasources/cpp-azure-resourcemanager-credentials', 'tenant_id'),
vault_secret(pull_secret, "secret/data/common/gcr", ".dockerconfigjson"),
vault_secret("github_token", "infra/data/ci/github/grafanabot", "pat"),
vault_secret(drone_token, "infra/data/ci/drone", "machine-user-token"),
vault_secret(prerelease_bucket, "infra/data/ci/grafana/prerelease", "bucket"),
vault_secret(
gcp_upload_artifacts_key,
"infra/data/ci/grafana/releng/artifacts-uploader-service-account",
"credentials.json",
),
vault_secret(
azure_sp_app_id,
"infra/data/ci/datasources/cpp-azure-resourcemanager-credentials",
"application_id",
),
vault_secret(
azure_sp_app_pw,
"infra/data/ci/datasources/cpp-azure-resourcemanager-credentials",
"application_secret",
),
vault_secret(
azure_tenant,
"infra/data/ci/datasources/cpp-azure-resourcemanager-credentials",
"tenant_id",
),
# Package publishing
vault_secret(
'packages_gpg_public_key',
'infra/data/ci/packages-publish/gpg',
'public-key-b64',
"packages_gpg_public_key",
"infra/data/ci/packages-publish/gpg",
"public-key-b64",
),
vault_secret(
'packages_gpg_private_key',
'infra/data/ci/packages-publish/gpg',
'private-key-b64',
"packages_gpg_private_key",
"infra/data/ci/packages-publish/gpg",
"private-key-b64",
),
vault_secret(
'packages_gpg_passphrase',
'infra/data/ci/packages-publish/gpg',
'passphrase',
"packages_gpg_passphrase",
"infra/data/ci/packages-publish/gpg",
"passphrase",
),
vault_secret(
'packages_service_account',
'infra/data/ci/packages-publish/service-account',
'credentials.json',
"packages_service_account",
"infra/data/ci/packages-publish/service-account",
"credentials.json",
),
vault_secret(
'packages_access_key_id',
'infra/data/ci/packages-publish/bucket-credentials',
'AccessID',
"packages_access_key_id",
"infra/data/ci/packages-publish/bucket-credentials",
"AccessID",
),
vault_secret(
'packages_secret_access_key',
'infra/data/ci/packages-publish/bucket-credentials',
'Secret',
"packages_secret_access_key",
"infra/data/ci/packages-publish/bucket-credentials",
"Secret",
),
vault_secret(
'aws_region',
'secret/data/common/aws-marketplace',
'aws_region',
"aws_region",
"secret/data/common/aws-marketplace",
"aws_region",
),
vault_secret(
'aws_access_key_id',
'secret/data/common/aws-marketplace',
'aws_access_key_id',
"aws_access_key_id",
"secret/data/common/aws-marketplace",
"aws_access_key_id",
),
vault_secret(
'aws_secret_access_key',
'secret/data/common/aws-marketplace',
'aws_secret_access_key',
"aws_secret_access_key",
"secret/data/common/aws-marketplace",
"aws_secret_access_key",
),
]
+15 -6
View File
@@ -1,11 +1,20 @@
"""
This module returns the pipeline used for version branches.
"""
load(
'scripts/drone/events/release.star',
'release_pipelines',
"scripts/drone/events/release.star",
"enterprise2_pipelines",
"enterprise_pipelines",
"oss_pipelines",
)
ver_mode = 'release-branch'
ver_mode = "release-branch"
trigger = {"ref": ["refs/heads/v[0-9]*"]}
def version_branch_pipelines():
return release_pipelines(ver_mode=ver_mode, trigger={
'ref': ['refs/heads/v[0-9]*'],
})
return (
oss_pipelines(ver_mode = ver_mode, trigger = trigger) +
enterprise_pipelines(ver_mode = ver_mode, trigger = trigger) +
enterprise2_pipelines(ver_mode = ver_mode, trigger = trigger)
)