# ============================================================ # Jenkins Configuration as Code (JCasC) # # 目的:把安全域、授权策略、CSRF、凭据、节点协议全部声明化, # 避免"某次手工点了全局可写"这类不可追溯的漂移。 # # 挂载:CASC_JENKINS_CONFIG=/var/jenkins_config/casc.yaml # 校验:Jenkins -> Manage Jenkins -> Configuration as Code -> View Configuration # 或用 jenkins-plugin-cli 的 casc 校验器 docker run 预检 # # 变量来自 .env(容器 env),不要在此文件写明文。 # ============================================================ jenkins: systemMessage: | Novalon CI/CD (ci.f.novalon.cn) —— 生产环境,操作留痕。 未授权访问将被记录并追责。 # ---------- 安全域:Jenkins 自有用户库,禁用匿名 ---------- securityRealm: local: allowsSignup: false # 禁止自助注册 enableCaptcha: false users: - id: "${ADMIN_USER}" # 密码由 bcrypt 存储;首次由 JCasC 写入,之后通过 UI/API 改 password: "${ADMIN_PASSWORD}" # ---------- 授权:登录后可读,管理员全权 ---------- authorizationStrategy: loggedInUsersCanDoAnything: allowAnonymousRead: false # 关键:关闭匿名读取(构建日志含路径/命令,属敏感信息) # ---------- 全局安全 ---------- crumbIssuer: standard: excludeClientIPFromCrumb: false remotingSecurity: enabled: true # 启用 agent -> controller 的调用过滤(防 RCE 类滥用) # 无 agent 时关闭 JNLP 入站端口;有 agent 再改为 fixed:50000 agentProtocols: - "Ping" # Jenkins URL 必须与实际一致,否则 CSRF crumb 与邮件/通知链接会失效 location: url: "https://ci.f.novalon.cn/" adminAddress: "team@novalon.cn" # ---------- 构建并发与队列 ---------- numExecutors: 2 quietPeriod: 5 scmCheckoutRetryCount: 2 # ---------- 全局环境变量(作业里用 ${...} 引用) ---------- globalNodeProperties: - envVars: env: - key: "PROJECT_NAME" value: "novalon-website" - key: "SERVER_IP" value: "139.155.109.62" - key: "SERVER_USER" value: "root" - key: "DEPLOY_ROOT" value: "/home/novalon/docker-app" - key: "NGINX_CONTAINER" value: "novalon-nginx-secure" - key: "DOMAIN" value: "https://novalon.cn" - key: "NPM_REGISTRY" value: "https://registry.npmmirror.com" - key: "BACKUP_RETENTION_COUNT" value: "3" # ---------- 凭据:统一由环境变量注入,绝不写死在 JCasC ---------- credentials: system: domainCredentials: - credentials: - usernamePassword: scope: GLOBAL id: "gitea-credentials" username: "${ADMIN_USER}" password: "${GITEA_TOKEN}" description: "Gitea 代码拉取令牌(read:repository)" # ---------- 工具安装(与 Jenkinsfile 中 nodejs('18') 对应) ---------- tool: nodejs: installations: - name: "18" home: "" properties: - installSource: installers: - nodeJSInstaller: id: "18.20.4" npmPackagesRefreshHours: 72 # ---------- 插件更新站点 ---------- # updateCenter: # sites: # - id: "default" # url: "https://updates.jenkins.io/update-center.json" # ---------- 安全加固:禁用 CLI over HTTP / 旧协议 ---------- unclassified: # 关闭 Jenkins 内置 CLI over HTTP(历史漏洞面) # 通过 startupProbe 之外的手段无法在 JCasC 直接关, # 已在 docker-compose 的 JAVA_OPTS 中以 -Djenkins.CLI.disabled=true 处理