buildEnvVars function

Future<Map<String, String>> buildEnvVars({
  1. required ApiClient apiClient,
  2. required BuildJob buildJob,
  3. required String projectId,
  4. required String buildJobId,
  5. required String runId,
})

Implementation

Future<Map<String, String>> buildEnvVars({
  required ApiClient apiClient,
  required BuildJob buildJob,
  required String projectId,
  required String buildJobId,
  required String runId,
}) async {
  final tagName = buildJob.tagName;
  final tagVersion = tagName != null && tagName.isNotEmpty
      ? (tagName.startsWith('v') || tagName.startsWith('V')
            ? tagName.substring(1)
            : tagName)
      : null;

  final teamId = buildJob.teamId;

  final envVars = <String, String>{
    'LANG': 'en_US.UTF-8',
    'OPENCI_PROJECT_ID': projectId,
    'OPENCI_BUILD_JOB_ID': buildJobId,
    'OPENCI_SERVER_URL': apiClient.serverUrl,
    if (tagName != null && tagName.isNotEmpty) 'OPENCI_TAG': tagName,
    'OPENCI_TAG_VERSION': tagVersion ?? '',
    'OPENCI_TEAM_ID': teamId ?? '',
    'OPENCI_ID_TOKEN': await apiClient.authManager.getIdToken(
      forceRefresh: true,
    ),
  };

  if (teamId != null) {
    try {
      final secretMetadataList = await apiClient.getSecrets(teamId);

      final hasBuildNumber = secretMetadataList.any(
        (meta) => meta['name'] == 'OPENCI_BUILD_NUMBER',
      );
      if (hasBuildNumber) {
        try {
          final value = await apiClient.getSecretValue(
            teamId,
            'OPENCI_BUILD_NUMBER',
          );
          if (value.isNotEmpty) {
            final numValue = int.tryParse(value);
            if (numValue != null) {
              final nextVal = '${numValue + 1}';
              await apiClient.saveSecret(
                teamId: teamId,
                name: 'OPENCI_BUILD_NUMBER',
                value: nextVal,
              );
              await logInfo(
                buildJobId,
                runId,
                'Auto-incremented OPENCI_BUILD_NUMBER: $value → $nextVal',
              );
              envVars['OPENCI_BUILD_NUMBER'] = nextVal;
            } else {
              envVars['OPENCI_BUILD_NUMBER'] = value;
            }
          }
        } catch (e) {
          await logWarning(
            buildJobId,
            runId,
            'Failed to load or auto-increment OPENCI_BUILD_NUMBER: $e',
          );
        }
      }

      final hasRunNumber = secretMetadataList.any(
        (meta) => meta['name'] == 'OPENCI_RUN_NUMBER',
      );
      try {
        if (hasRunNumber) {
          final value = await apiClient.getSecretValue(
            teamId,
            'OPENCI_RUN_NUMBER',
          );
          final numValue = int.tryParse(value) ?? 0;
          final nextVal = '${numValue + 1}';
          await apiClient.saveSecret(
            teamId: teamId,
            name: 'OPENCI_RUN_NUMBER',
            value: nextVal,
          );
          await logInfo(
            buildJobId,
            runId,
            'Auto-incremented OPENCI_RUN_NUMBER: $value → $nextVal',
          );
          envVars['OPENCI_RUN_NUMBER'] = nextVal;
        } else {
          await apiClient.saveSecret(
            teamId: teamId,
            name: 'OPENCI_RUN_NUMBER',
            value: '1',
          );
          await logInfo(
            buildJobId,
            runId,
            'Initialized OPENCI_RUN_NUMBER to 1 in Secrets',
          );
          envVars['OPENCI_RUN_NUMBER'] = '1';
        }
      } catch (e) {
        await logWarning(
          buildJobId,
          runId,
          'Failed to load or auto-increment OPENCI_RUN_NUMBER: $e',
        );
      }
    } catch (e) {
      await logWarning(
        buildJobId,
        runId,
        'Failed to fetch secrets list for team $teamId: $e',
      );
    }
  }

  if (tagName != null && tagName.isNotEmpty) {
    await logInfo(
      buildJobId,
      runId,
      'Tag: $tagName (available as \$OPENCI_TAG)',
    );
  }

  return envVars;
}