import paramiko, sys, time sys.stdout.reconfigure(encoding='utf-8', errors='replace') client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect('101.79.17.164', username='root', password='1q2w3e!Q', timeout=30) JENKINS = 'http://127.0.0.1:9080' AUTH = 'admin:1q2w3e!Q' def run(label, cmd, timeout=120): print(f'\n[{label}]') _, o, e = client.exec_command(cmd, timeout=timeout) out = o.read().decode('utf-8', errors='replace').strip() err = e.read().decode('utf-8', errors='replace').strip() if out: print(out[:400]) if err: bad = [l for l in err.splitlines() if not any(k in l.lower() for k in ['warn','info','downloading','progress'])] if bad: print('ERR:', '\n'.join(bad[:2])) return out # 1. API 접속 확인 run('API 확인', f""" HTTP=$(curl -sf -o /dev/null -w "%{{http_code}}" {JENKINS}/api/json -u {AUTH} 2>/dev/null) echo "HTTP: $HTTP" if [ "$HTTP" = "200" ]; then curl -sf {JENKINS}/api/json -u {AUTH} 2>/dev/null | python3 -c " import sys,json; d=json.load(sys.stdin); print('Jenkins', d.get('fullName','OK')) " 2>/dev/null fi """) # 2. 필수 플러그인 설치 run('필수 플러그인 설치', f""" java -jar /tmp/jenkins-cli.jar -s {JENKINS} -auth {AUTH} install-plugin \ git workflow-aggregator pipeline-stage-view credentials-binding \ ssh-agent nodejs timestamper ansicolor http_request junit \ gitea 2>&1 | tail -5 echo "플러그인 설치 요청 완료" """) # 3. Gitea Credential 등록 (Groovy Script Console) run('Gitea Credential 등록', f""" CRUMB=$(curl -sf "{JENKINS}/crumbIssuer/api/json" -u {AUTH} 2>/dev/null | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['crumb'])" 2>/dev/null) echo "Crumb: $CRUMB" curl -sf -X POST "{JENKINS}/scriptText" -u {AUTH} \ -H "Jenkins-Crumb: $CRUMB" \ --data-urlencode 'script= import jenkins.model.* import com.cloudbees.plugins.credentials.* import com.cloudbees.plugins.credentials.domains.* import com.cloudbees.plugins.credentials.impl.* def store = Jenkins.instance.getExtensionList("com.cloudbees.plugins.credentials.SystemCredentialsProvider")[0]?.getStore() if (store) {{ def cred = new UsernamePasswordCredentialsImpl( CredentialsScope.GLOBAL, "gitea-token", "Gitea zio account", "zio", "Zio@Admin2026!" ) store.addCredentials(Domain.global(), cred) println "Credential 등록 완료" }} else {{ println "Store null - credentials 플러그인 확인 필요" }} ' 2>/dev/null """) # 4. 환경변수 설정 run('글로벌 환경변수 설정', f""" curl -sf -X POST "{JENKINS}/scriptText" -u {AUTH} \ --data-urlencode 'script= import jenkins.model.* import hudson.EnvVars def instance = Jenkins.instance def globalProps = instance.globalNodeProperties def envVarsNodeProperty = globalProps.getAll(hudson.slaves.EnvironmentVariablesNodeProperty.class) if (!envVarsNodeProperty) {{ def newProp = new hudson.slaves.EnvironmentVariablesNodeProperty() globalProps.add(newProp) envVarsNodeProperty = [newProp] }} def envVars = envVarsNodeProperty[0].getEnvVars() envVars.put("ITSM_BASE_URL", "http://127.0.0.1:9001") envVars.put("GITEA_URL", "http://127.0.0.1:9003") envVars.put("SERVER_HOST", "101.79.17.164") instance.save() println "환경변수 설정 완료" ' 2>/dev/null """) # 5. 상태 확인 run('최종 상태', f""" HTTP=$(curl -sf -o /dev/null -w "%{{http_code}}" {JENKINS}/api/json -u {AUTH} 2>/dev/null) echo "Jenkins API: HTTP $HTTP" java -jar /tmp/jenkins-cli.jar -s {JENKINS} -auth {AUTH} version 2>/dev/null """) client.close() print('\n=== Jenkins 기본 설정 완료 ===')