105 lines
3.7 KiB
Diff
105 lines
3.7 KiB
Diff
|
From 6fbbf368f5a6d181b21f448255d5a4182dc2ab3a Mon Sep 17 00:00:00 2001
|
||
|
From: Frantisek Sumsal <frantisek@sumsal.cz>
|
||
|
Date: Mon, 29 Nov 2021 13:00:21 +0100
|
||
|
Subject: [PATCH] tests: add helper function to autodetect CI environments
|
||
|
|
||
|
Sadly there is no standarized way to check if we're running in some
|
||
|
CI environment. So let's try to gather the heuristics in one helper
|
||
|
function.
|
||
|
|
||
|
Loosely cherry-picked from 4eb0c875f8825199a829ddc597874915fbee0a84.
|
||
|
|
||
|
Related: #2017033
|
||
|
---
|
||
|
src/basic/string-util.h | 6 ++++++
|
||
|
src/shared/tests.c | 42 +++++++++++++++++++++++++++++++++++++++++
|
||
|
src/shared/tests.h | 3 +++
|
||
|
3 files changed, 51 insertions(+)
|
||
|
|
||
|
diff --git a/src/basic/string-util.h b/src/basic/string-util.h
|
||
|
index 96a9260f93..742b566932 100644
|
||
|
--- a/src/basic/string-util.h
|
||
|
+++ b/src/basic/string-util.h
|
||
|
@@ -32,6 +32,12 @@ static inline bool streq_ptr(const char *a, const char *b) {
|
||
|
return strcmp_ptr(a, b) == 0;
|
||
|
}
|
||
|
|
||
|
+static inline char* strstr_ptr(const char *haystack, const char *needle) {
|
||
|
+ if (!haystack || !needle)
|
||
|
+ return NULL;
|
||
|
+ return strstr(haystack, needle);
|
||
|
+}
|
||
|
+
|
||
|
static inline const char* strempty(const char *s) {
|
||
|
return s ?: "";
|
||
|
}
|
||
|
diff --git a/src/shared/tests.c b/src/shared/tests.c
|
||
|
index 100b62b9b0..1da80d653f 100644
|
||
|
--- a/src/shared/tests.c
|
||
|
+++ b/src/shared/tests.c
|
||
|
@@ -7,7 +7,9 @@
|
||
|
#include <util.h>
|
||
|
|
||
|
#include "tests.h"
|
||
|
+#include "env-util.h"
|
||
|
#include "path-util.h"
|
||
|
+#include "strv.h"
|
||
|
|
||
|
char* setup_fake_runtime_dir(void) {
|
||
|
char t[] = "/tmp/fake-xdg-runtime-XXXXXX", *p;
|
||
|
@@ -75,3 +77,43 @@ void test_setup_logging(int level) {
|
||
|
log_parse_environment();
|
||
|
log_open();
|
||
|
}
|
||
|
+
|
||
|
+const char *ci_environment(void) {
|
||
|
+ /* We return a string because we might want to provide multiple bits of information later on: not
|
||
|
+ * just the general CI environment type, but also whether we're sanitizing or not, etc. The caller is
|
||
|
+ * expected to use strstr on the returned value. */
|
||
|
+ static const char *ans = (void*) UINTPTR_MAX;
|
||
|
+ const char *p;
|
||
|
+ int r;
|
||
|
+
|
||
|
+ if (ans != (void*) UINTPTR_MAX)
|
||
|
+ return ans;
|
||
|
+
|
||
|
+ /* We allow specifying the environment with $CITYPE. Nobody uses this so far, but we are ready. */
|
||
|
+ p = getenv("CITYPE");
|
||
|
+ if (!isempty(p))
|
||
|
+ return (ans = p);
|
||
|
+
|
||
|
+ if (getenv_bool("TRAVIS") > 0)
|
||
|
+ return (ans = "travis");
|
||
|
+ if (getenv_bool("SEMAPHORE") > 0)
|
||
|
+ return (ans = "semaphore");
|
||
|
+ if (getenv_bool("GITHUB_ACTIONS") > 0)
|
||
|
+ return (ans = "github-actions");
|
||
|
+ if (getenv("AUTOPKGTEST_ARTIFACTS") || getenv("AUTOPKGTEST_TMP"))
|
||
|
+ return (ans = "autopkgtest");
|
||
|
+
|
||
|
+ FOREACH_STRING(p, "CI", "CONTINOUS_INTEGRATION") {
|
||
|
+ /* Those vars are booleans according to Semaphore and Travis docs:
|
||
|
+ * https://docs.travis-ci.com/user/environment-variables/#default-environment-variables
|
||
|
+ * https://docs.semaphoreci.com/ci-cd-environment/environment-variables/#ci
|
||
|
+ */
|
||
|
+ r = getenv_bool(p);
|
||
|
+ if (r > 0)
|
||
|
+ return (ans = "unknown"); /* Some other unknown thing */
|
||
|
+ if (r == 0)
|
||
|
+ return (ans = NULL);
|
||
|
+ }
|
||
|
+
|
||
|
+ return (ans = NULL);
|
||
|
+}
|
||
|
diff --git a/src/shared/tests.h b/src/shared/tests.h
|
||
|
index 3d696d02fd..4f8f349097 100644
|
||
|
--- a/src/shared/tests.h
|
||
|
+++ b/src/shared/tests.h
|
||
|
@@ -5,3 +5,6 @@ char* setup_fake_runtime_dir(void);
|
||
|
bool test_is_running_from_builddir(char **exedir);
|
||
|
const char* get_testdata_dir(void);
|
||
|
void test_setup_logging(int level);
|
||
|
+
|
||
|
+/* Provide a convenient way to check if we're running in CI. */
|
||
|
+const char *ci_environment(void);
|