Skip to content

Commit 4bdcaa9

Browse files
committed
Merge pull request #693 from Altinity/24.8/cicd-fix/get_docker_from_secrets
24.8 Use credentials from secrets
1 parent e280e95 commit 4bdcaa9

10 files changed

+76
-34
lines changed

.github/workflows/regression.yml

+3-3
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,9 @@ name: Regression test workflow - Release
8888
env:
8989
# Force the stdout and stderr streams to be unbuffered
9090
PYTHONUNBUFFERED: 1
91-
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_REPORT_KEY_ID }}
92-
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_REPORT_SECRET_ACCESS_KEY }}
93-
AWS_DEFAULT_REGION: ${{ secrets.AWS_REPORT_REGION }}
91+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
92+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
93+
AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
9494
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
9595
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
9696
CHECKS_DATABASE_HOST: ${{ secrets.CHECKS_DATABASE_HOST }}

.github/workflows/release_branches.yml

+5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ env:
77
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
88
AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
99
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
10+
CLICKHOUSE_TEST_STAT_LOGIN: ${{ secrets.CLICKHOUSE_TEST_STAT_LOGIN }}
11+
CLICKHOUSE_TEST_STAT_PASSWORD: ${{ secrets.CLICKHOUSE_TEST_STAT_PASSWORD }}
12+
CLICKHOUSE_TEST_STAT_URL: ${{ secrets.CLICKHOUSE_TEST_STAT_URL }}
13+
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
14+
ROBOT_TOKEN: ${{ secrets.ROBOT_TOKEN }}
1015

1116
on: # yamllint disable-line rule:truthy
1217
pull_request:

.github/workflows/reusable_build.yml

+5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ env:
77
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
88
AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
99
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
10+
CLICKHOUSE_TEST_STAT_LOGIN: ${{ secrets.CLICKHOUSE_TEST_STAT_LOGIN }}
11+
CLICKHOUSE_TEST_STAT_PASSWORD: ${{ secrets.CLICKHOUSE_TEST_STAT_PASSWORD }}
12+
CLICKHOUSE_TEST_STAT_URL: ${{ secrets.CLICKHOUSE_TEST_STAT_URL }}
13+
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
14+
ROBOT_TOKEN: ${{ secrets.ROBOT_TOKEN }}
1015

1116
name: Build ClickHouse
1217
'on':

.github/workflows/reusable_sign.yml

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
### For the pure soul wishes to move it to another place
2-
# https://github.com/orgs/community/discussions/9050
3-
4-
name: Testing workflow
1+
name: Sigining workflow
52
'on':
63
workflow_call:
74
inputs:
@@ -63,6 +60,11 @@ env:
6360
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
6461
AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
6562
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
63+
CLICKHOUSE_TEST_STAT_LOGIN: ${{ secrets.CLICKHOUSE_TEST_STAT_LOGIN }}
64+
CLICKHOUSE_TEST_STAT_PASSWORD: ${{ secrets.CLICKHOUSE_TEST_STAT_PASSWORD }}
65+
CLICKHOUSE_TEST_STAT_URL: ${{ secrets.CLICKHOUSE_TEST_STAT_URL }}
66+
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
67+
ROBOT_TOKEN: ${{ secrets.ROBOT_TOKEN }}
6668

6769
jobs:
6870
runner_labels_setup:

.github/workflows/reusable_test.yml

+22-2
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,25 @@ name: Testing workflow
4444
description: if given, it's passed to the environments
4545
required: false
4646
AWS_SECRET_ACCESS_KEY:
47-
description: the access key to the aws param store.
47+
description: the access key to the aws s3 bucket.
4848
required: true
4949
AWS_ACCESS_KEY_ID:
50-
description: the access key id to the aws param store.
50+
description: the access key id to the aws s3 bucket.
51+
required: true
52+
CLICKHOUSE_TEST_STAT_LOGIN:
53+
description: username for ci db.
54+
required: true
55+
CLICKHOUSE_TEST_STAT_PASSWORD:
56+
description: password for ci db.
57+
required: true
58+
CLICKHOUSE_TEST_STAT_URL:
59+
description: url for ci db.
60+
required: true
61+
DOCKER_PASSWORD:
62+
description: token to upload docker images.
63+
required: true
64+
ROBOT_TOKEN:
65+
description: token to update ci status.
5166
required: true
5267

5368
env:
@@ -57,6 +72,11 @@ env:
5772
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
5873
AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
5974
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
75+
CLICKHOUSE_TEST_STAT_LOGIN: ${{ secrets.CLICKHOUSE_TEST_STAT_LOGIN }}
76+
CLICKHOUSE_TEST_STAT_PASSWORD: ${{ secrets.CLICKHOUSE_TEST_STAT_PASSWORD }}
77+
CLICKHOUSE_TEST_STAT_URL: ${{ secrets.CLICKHOUSE_TEST_STAT_URL }}
78+
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
79+
ROBOT_TOKEN: ${{ secrets.ROBOT_TOKEN }}
6080

6181
jobs:
6282
runner_labels_setup:

docker/packager/packager

+21-10
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@ import os
66
import subprocess
77
import sys
88
from pathlib import Path
9-
from typing import List, Optional
9+
from typing import Dict, List, Optional
1010

1111
SCRIPT_PATH = Path(__file__).absolute()
1212
IMAGE_TYPE = "binary-builder"
1313
IMAGE_NAME = f"altinityinfra/{IMAGE_TYPE}"
14-
14+
DEFAULT_TMP_PATH = SCRIPT_PATH.parent.absolute() / 'tmp'
15+
TEMP_PATH = Path(os.getenv("TEMP_PATH", DEFAULT_TMP_PATH))
1516

1617
class BuildException(Exception):
1718
pass
@@ -82,9 +83,22 @@ def run_docker_image_with_env(
8283
ch_root: Path,
8384
cargo_cache_dir: Path,
8485
ccache_dir: Optional[Path],
86+
aws_secrets : Optional[Dict[str,str]]
8587
) -> None:
8688
output_dir.mkdir(parents=True, exist_ok=True)
8789
cargo_cache_dir.mkdir(parents=True, exist_ok=True)
90+
extra_parts = ""
91+
92+
if aws_secrets:
93+
# Pass AWS credentials via file rather than via env to avoid leaking secrets
94+
env_part = {"AWS_CONFIG_FILE": "/home/clickhouse/.aws/credentials"}
95+
host_aws_config_file_path = Path(TEMP_PATH) / 'aws_config'
96+
with open(host_aws_config_file_path, 'wt') as f:
97+
f.write("[default]")
98+
for key, value in aws_secrets.items():
99+
f.write(f"\n{key}={value}")
100+
101+
extra_parts = f"--volume={host_aws_config_file_path}:{env_part['AWS_CONFIG_FILE']}"
88102

89103
env_part = " -e ".join(env_variables)
90104
if env_part:
@@ -107,6 +121,7 @@ def run_docker_image_with_env(
107121
cmd = (
108122
f"docker run --network=host --user={user} --rm {ccache_mount} "
109123
f"--volume={output_dir}:/output --volume={ch_root}:/build {env_part} "
124+
f" {extra_parts} "
110125
f"--volume={cargo_cache_dir}:/rust/cargo/registry {interactive} {image_name}"
111126
)
112127

@@ -130,11 +145,9 @@ def parse_env_variables(
130145
sanitizer: str,
131146
package_type: str,
132147
cache: str,
133-
s3_access_key_id: str,
134148
s3_bucket: str,
135149
s3_directory: str,
136150
s3_rw_access: bool,
137-
s3_secret_access_key: str,
138151
clang_tidy: bool,
139152
version: str,
140153
official: bool,
@@ -323,10 +336,6 @@ def parse_env_variables(
323336
result.append(f"SCCACHE_S3_KEY_PREFIX={sccache_dir}")
324337
if not s3_rw_access:
325338
result.append("SCCACHE_S3_NO_CREDENTIALS=true")
326-
if s3_access_key_id:
327-
result.append(f"AWS_ACCESS_KEY_ID={s3_access_key_id}")
328-
if s3_secret_access_key:
329-
result.append(f"AWS_SECRET_ACCESS_KEY={s3_secret_access_key}")
330339

331340
if clang_tidy:
332341
# `CTCACHE_DIR` has the same purpose as the `CCACHE_DIR` above.
@@ -544,11 +553,9 @@ def main() -> None:
544553
args.sanitizer,
545554
args.package_type,
546555
args.cache,
547-
args.s3_access_key_id,
548556
args.s3_bucket,
549557
args.s3_directory,
550558
args.s3_rw_access,
551-
args.s3_secret_access_key,
552559
args.clang_tidy,
553560
args.version,
554561
args.official,
@@ -567,6 +574,10 @@ def main() -> None:
567574
ch_root,
568575
args.cargo_cache_dir,
569576
args.ccache_dir,
577+
{
578+
"aws_access_key_id" : args.s3_access_key_id,
579+
"aws_secret_access_key" : args.s3_secret_access_key
580+
}
570581
)
571582
logging.info("Output placed into %s", args.output_dir)
572583

tests/ci/clickhouse_helper.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
import requests
1111

12-
from env_helper import GITHUB_REPOSITORY
12+
from env_helper import CLICKHOUSE_TEST_STAT_URL, CLICKHOUSE_TEST_STAT_PASSWORD, CLICKHOUSE_TEST_STAT_LOGIN
1313
from get_robot_token import get_parameter_from_ssm
1414
from pr_info import PRInfo
1515
from report import TestResults
@@ -28,12 +28,12 @@ def __init__(
2828
self, url: Optional[str] = None, auth: Optional[Dict[str, str]] = None
2929
):
3030
if url is None:
31-
url = get_parameter_from_ssm("clickhouse-test-stat-url")
31+
url = CLICKHOUSE_TEST_STAT_URL
3232

3333
self.url = url
3434
self.auth = auth or {
35-
"X-ClickHouse-User": get_parameter_from_ssm("clickhouse-test-stat-login"),
36-
"X-ClickHouse-Key": get_parameter_from_ssm("clickhouse-test-stat-password"),
35+
"X-ClickHouse-User": CLICKHOUSE_TEST_STAT_LOGIN,
36+
"X-ClickHouse-Key": CLICKHOUSE_TEST_STAT_PASSWORD,
3737
}
3838

3939
@staticmethod

tests/ci/docker_images_helper.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from pathlib import Path
77
from typing import Any, Dict, List, Optional
88

9+
from env_helper import ROOT_DIR, DOCKER_TAG, DOCKER_PASSWORD
910
from ci_utils import Shell
1011
from env_helper import DOCKER_TAG, ROOT_DIR
1112
from get_robot_token import get_parameter_from_ssm
@@ -22,7 +23,7 @@ def docker_login(relogin: bool = True) -> None:
2223
Shell.check( # pylint: disable=unexpected-keyword-arg
2324
"docker login --username 'altinityinfra' --password-stdin",
2425
strict=True,
25-
stdin_str=get_parameter_from_ssm("dockerhub-password"),
26+
stdin_str=DOCKER_PASSWORD,
2627
encoding="utf-8",
2728
)
2829

tests/ci/env_helper.py

+6
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,9 @@
4141
"{pr_or_release}/{commit}/{build_name}/{artifact}"
4242
)
4343
CI_CONFIG_PATH = f"{TEMP_PATH}/ci_config.json"
44+
CLICKHOUSE_TEST_STAT_LOGIN = os.getenv("CLICKHOUSE_TEST_STAT_LOGIN")
45+
CLICKHOUSE_TEST_STAT_PASSWORD = os.getenv("CLICKHOUSE_TEST_STAT_PASSWORD")
46+
CLICKHOUSE_TEST_STAT_URL = os.getenv("CLICKHOUSE_TEST_STAT_URL")
47+
DOCKER_PASSWORD = os.getenv("DOCKER_PASSWORD")
48+
ROBOT_TOKEN = os.getenv("ROBOT_TOKEN")
49+

tests/ci/get_robot_token.py

+2-10
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from github.GithubException import BadCredentialsException
1111
from github.NamedUser import NamedUser
1212

13+
from env_helper import ROBOT_TOKEN
1314

1415
@dataclass
1516
class Token:
@@ -56,20 +57,11 @@ def get_parameters_from_ssm(
5657

5758
return results
5859

59-
60-
ROBOT_TOKEN = None # type: Optional[Token]
61-
6260
# NOTE(Arthur Passos): Original CI code uses the "_original" version of this method. Each robot token is rate limited
6361
# and the original implementation selects the "best one". To make it simpler and iterate faster,
6462
# we are using only one robot and keeping the method signature. In the future we might reconsider
6563
# having multiple robot tokens
66-
def get_best_robot_token(token_prefix_env_name="github_robot_token"):
67-
# Re-use already fetched token (same as in get_best_robot_token_original)
68-
# except here we assume it is always a string (since we use only one token and don't do token rotation)
69-
global ROBOT_TOKEN
70-
if ROBOT_TOKEN is not None:
71-
return ROBOT_TOKEN
72-
ROBOT_TOKEN = get_parameter_from_ssm(token_prefix_env_name)
64+
def get_best_robot_token():
7365
return ROBOT_TOKEN
7466

7567
def get_best_robot_token_original(tokens_path: str = "/github-tokens") -> str:

0 commit comments

Comments
 (0)