[v10.4.x] CI: Add github app token generation in pipelines that use GITHUB_TOKEN (#96870)
CI: Add github app token generation in pipelines that use GITHUB_TOKEN (#96646)
* Add github app token generation in pipelines that use GITHUB_TOKEN
* ci?
* clone gh repo using x-access-token user
* address linting issues
* use mounted volume for exporting token
* remove unused github_token env var swagger gen step
* replace pat on release_pr pipepline
* cleanup GH PAT references
* linting
* Update scripts/drone/steps/lib.star
* make drone
---------
Co-authored-by: Matheus Macabu <macabu.matheus@gmail.com>
(cherry picked from commit 2400483d6c)
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
"""
|
||||
This module is used to interface with the GitHub App to extract temporary installation tokens.
|
||||
"""
|
||||
|
||||
load(
|
||||
"scripts/drone/utils/images.star",
|
||||
"images",
|
||||
)
|
||||
load(
|
||||
"scripts/drone/vault.star",
|
||||
"from_secret",
|
||||
"github_app_app_id",
|
||||
"github_app_app_installation_id",
|
||||
"github_app_private_key",
|
||||
)
|
||||
|
||||
def github_app_step_volumes():
|
||||
return [
|
||||
{"name": "github-app", "path": "/github-app"},
|
||||
]
|
||||
|
||||
def github_app_pipeline_volumes():
|
||||
return [
|
||||
{"name": "github-app", "temp": {}},
|
||||
]
|
||||
|
||||
def github_app_generate_token_step():
|
||||
return {
|
||||
"name": "github-app-generate-token",
|
||||
"image": images["github_app_secret_writer"],
|
||||
"environment": {
|
||||
"GITHUB_APP_ID": from_secret(github_app_app_id),
|
||||
"GITHUB_APP_INSTALLATION_ID": from_secret(github_app_app_installation_id),
|
||||
"GITHUB_APP_PRIVATE_KEY": from_secret(github_app_private_key),
|
||||
},
|
||||
"commands": [
|
||||
"echo $(/usr/bin/github-app-external-token) > /github-app/token",
|
||||
],
|
||||
"volumes": github_app_step_volumes(),
|
||||
}
|
||||
@@ -2,6 +2,11 @@
|
||||
This module is a library of Drone steps and other pipeline components.
|
||||
"""
|
||||
|
||||
load(
|
||||
"scripts/drone/steps/github.star",
|
||||
"github_app_generate_token_step",
|
||||
"github_app_step_volumes",
|
||||
)
|
||||
load(
|
||||
"scripts/drone/steps/rgm.star",
|
||||
"rgm_build_backend_step",
|
||||
@@ -101,23 +106,25 @@ def clone_enterprise_step_pr(source = "${DRONE_COMMIT}", target = "main", canFai
|
||||
check = []
|
||||
else:
|
||||
check = [
|
||||
'is_fork=$(curl "https://$GITHUB_TOKEN@api.github.com/repos/grafana/grafana/pulls/$DRONE_PULL_REQUEST" | jq .head.repo.fork)',
|
||||
'is_fork=$(curl --retry 5 "https://$${GITHUB_TOKEN}@api.github.com/repos/grafana/grafana/pulls/$DRONE_PULL_REQUEST" | jq .head.repo.fork)',
|
||||
'if [ "$is_fork" != false ]; then return 1; fi', # Only clone if we're confident that 'fork' is 'false'. Fail if it's also empty.
|
||||
]
|
||||
|
||||
step = {
|
||||
"name": "clone-enterprise",
|
||||
"image": images["git"],
|
||||
"environment": {
|
||||
"GITHUB_TOKEN": from_secret("github_token"),
|
||||
},
|
||||
"commands": [
|
||||
"apk add --update curl jq bash",
|
||||
"GITHUB_TOKEN=$(cat /github-app/token)",
|
||||
] + check + [
|
||||
'git clone "https://$${GITHUB_TOKEN}@github.com/grafana/grafana-enterprise.git" ' + location,
|
||||
'git clone "https://x-access-token:$${GITHUB_TOKEN}@github.com/grafana/grafana-enterprise.git" ' + location,
|
||||
"cd {}".format(location),
|
||||
'if git checkout {0}; then echo "checked out {0}"; elif git checkout {1}; then echo "git checkout {1}"; else git checkout main; fi'.format(source, target),
|
||||
],
|
||||
"depends_on": [
|
||||
github_app_generate_token_step()["name"],
|
||||
],
|
||||
"volumes": github_app_step_volumes(),
|
||||
}
|
||||
|
||||
if canFail:
|
||||
@@ -328,6 +335,7 @@ def e2e_tests_artifacts():
|
||||
"end-to-end-tests-panels-suite",
|
||||
"end-to-end-tests-smoke-tests-suite",
|
||||
"end-to-end-tests-various-suite",
|
||||
github_app_generate_token_step()["name"],
|
||||
],
|
||||
"failure": "ignore",
|
||||
"when": {
|
||||
@@ -339,9 +347,9 @@ def e2e_tests_artifacts():
|
||||
"environment": {
|
||||
"GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY": from_secret(gcp_upload_artifacts_key),
|
||||
"E2E_TEST_ARTIFACTS_BUCKET": "releng-pipeline-artifacts-dev",
|
||||
"GITHUB_TOKEN": from_secret("github_token"),
|
||||
},
|
||||
"commands": [
|
||||
"export GITHUB_TOKEN=$(cat /github-app/token)",
|
||||
# if no videos found do nothing
|
||||
"if [ -z `find ./e2e -type f -name *spec.ts.mp4` ]; then echo 'missing videos'; false; fi",
|
||||
"apt-get update",
|
||||
@@ -356,15 +364,76 @@ def e2e_tests_artifacts():
|
||||
'curl -X POST https://api.github.com/repos/${DRONE_REPO}/statuses/${DRONE_COMMIT_SHA} -H "Authorization: token $${GITHUB_TOKEN}" -d ' +
|
||||
'"{\\"state\\":\\"success\\",\\"target_url\\":\\"$${E2E_ARTIFACTS_VIDEO_ZIP}\\", \\"description\\": \\"Click on the details to download e2e recording videos\\", \\"context\\": \\"e2e_artifacts\\"}"',
|
||||
],
|
||||
"volumes": github_app_step_volumes(),
|
||||
}
|
||||
|
||||
def upload_cdn_step(ver_mode, trigger = None):
|
||||
def playwright_e2e_report_upload():
|
||||
return {
|
||||
"name": "playwright-e2e-report-upload",
|
||||
"image": images["cloudsdk"],
|
||||
"depends_on": [
|
||||
"playwright-plugin-e2e",
|
||||
],
|
||||
"failure": "ignore",
|
||||
"when": {
|
||||
"status": [
|
||||
"success",
|
||||
"failure",
|
||||
],
|
||||
},
|
||||
"environment": {
|
||||
"GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY": from_secret(gcp_upload_artifacts_key),
|
||||
},
|
||||
"commands": [
|
||||
"apt-get update",
|
||||
"apt-get install -yq zip",
|
||||
"printenv GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY > /tmp/gcpkey_upload_artifacts.json",
|
||||
"gcloud auth activate-service-account --key-file=/tmp/gcpkey_upload_artifacts.json",
|
||||
"gsutil cp -r ./playwright-report/. gs://releng-pipeline-artifacts-dev/${DRONE_BUILD_NUMBER}/playwright-report",
|
||||
"export E2E_PLAYWRIGHT_REPORT_URL=https://storage.googleapis.com/releng-pipeline-artifacts-dev/${DRONE_BUILD_NUMBER}/playwright-report/index.html",
|
||||
'echo "E2E Playwright report uploaded to: \n $${E2E_PLAYWRIGHT_REPORT_URL}"',
|
||||
],
|
||||
}
|
||||
|
||||
def playwright_e2e_report_post_link():
|
||||
return {
|
||||
"name": "playwright-e2e-report-post-link",
|
||||
"image": images["curl"],
|
||||
"depends_on": [
|
||||
"playwright-e2e-report-upload",
|
||||
github_app_generate_token_step()["name"],
|
||||
],
|
||||
"failure": "ignore",
|
||||
"when": {
|
||||
"status": [
|
||||
"success",
|
||||
"failure",
|
||||
],
|
||||
},
|
||||
"commands": [
|
||||
"GITHUB_TOKEN=$(cat /github-app/token)",
|
||||
# if the trace doesn't folder exists, it means that there are no failed tests.
|
||||
"if [ ! -d ./playwright-report/trace ]; then echo 'all tests passed'; exit 0; fi",
|
||||
# if it exists, we will post a comment on the PR with the link to the report
|
||||
"export E2E_PLAYWRIGHT_REPORT_URL=https://storage.googleapis.com/releng-pipeline-artifacts-dev/${DRONE_BUILD_NUMBER}/playwright-report/index.html",
|
||||
"curl -L " +
|
||||
"-X POST https://api.github.com/repos/grafana/grafana/issues/${DRONE_PULL_REQUEST}/comments " +
|
||||
'-H "Accept: application/vnd.github+json" ' +
|
||||
'-H "Authorization: Bearer $${GITHUB_TOKEN}" ' +
|
||||
'-H "X-GitHub-Api-Version: 2022-11-28" -d ' +
|
||||
'"{\\"body\\":\\"❌ Failed to run Playwright plugin e2e tests. <br /> <br /> Click [here]($${E2E_PLAYWRIGHT_REPORT_URL}) to browse the Playwright report and trace viewer. <br /> For information on how to run Playwright tests locally, refer to the [Developer guide](https://github.com/grafana/grafana/blob/main/contribute/developer-guide.md#to-run-the-playwright-tests). \\"}"',
|
||||
],
|
||||
"volumes": github_app_step_volumes(),
|
||||
}
|
||||
|
||||
def upload_cdn_step(ver_mode, trigger = None, depends_on = ["grafana-server"]):
|
||||
"""Uploads CDN assets using the Grafana build tool.
|
||||
|
||||
Args:
|
||||
ver_mode: only uses the step trigger when ver_mode == 'release-branch' or 'main'
|
||||
trigger: a Drone trigger for the step.
|
||||
Defaults to None.
|
||||
depends_on: names of steps that must run before this one will run.
|
||||
|
||||
Returns:
|
||||
Drone step.
|
||||
@@ -373,9 +442,7 @@ def upload_cdn_step(ver_mode, trigger = None):
|
||||
step = {
|
||||
"name": "upload-cdn-assets",
|
||||
"image": images["publish"],
|
||||
"depends_on": [
|
||||
"grafana-server",
|
||||
],
|
||||
"depends_on": depends_on,
|
||||
"environment": {
|
||||
"GCP_KEY": from_secret(gcp_grafanauploads),
|
||||
"PRERELEASE_BUCKET": from_secret(prerelease_bucket),
|
||||
@@ -756,7 +823,6 @@ def cloud_plugins_e2e_tests_step(suite, cloud, trigger = None):
|
||||
environment = {
|
||||
"CYPRESS_CI": "true",
|
||||
"HOST": "grafana-server",
|
||||
"GITHUB_TOKEN": from_secret("github_token"),
|
||||
"AZURE_SP_APP_ID": from_secret("azure_sp_app_id"),
|
||||
"AZURE_SP_PASSWORD": from_secret("azure_sp_app_pw"),
|
||||
"AZURE_TENANT": from_secret("azure_tenant"),
|
||||
@@ -777,9 +843,15 @@ def cloud_plugins_e2e_tests_step(suite, cloud, trigger = None):
|
||||
"image": "us-docker.pkg.dev/grafanalabs-dev/cloud-data-sources/e2e-13.1.0:1.0.0",
|
||||
"depends_on": [
|
||||
"grafana-server",
|
||||
github_app_generate_token_step()["name"],
|
||||
],
|
||||
"environment": environment,
|
||||
"commands": ["cd /", "./cpp-e2e/scripts/ci-run.sh {} {}".format(cloud, branch)],
|
||||
"commands": [
|
||||
"GITHUB_TOKEN=$(cat /github-app/token)",
|
||||
"cd /",
|
||||
"./cpp-e2e/scripts/ci-run.sh {} {}".format(cloud, branch),
|
||||
],
|
||||
"volumes": github_app_step_volumes(),
|
||||
}
|
||||
step = dict(step, when = when)
|
||||
return step
|
||||
|
||||
Reference in New Issue
Block a user