首页 > 解决方案 > 如何使用动态 url 启动 docker 容器

问题描述

我的要求如下:

  1. 开发人员在 Jenkins 中创建了一个分支。假设分支名称是“mystory-101”
  2. 现在开发者将代码推送到这个分支
  3. Jenkins 作业在提交被推送到分支“mystory-101”后立即开始,并为该分支创建一个新的 docker 镜像(如果尚未创建)
  4. 我的应用程序是基于 Node.js 的应用程序,因此 docker 容器以 node.js 开头并从分支“mystory-101”部署代码
  5. 部署代码并运行 node.js 后,我还希望可以通过 URL 访问此 node.js 应用程序:https ://mystory-101.mycompany.com

为此,我正在阅读此https://medium.com/swlh/ci-cd-pipeline-using-jenkins-dynamic-nodes-86ea854ff7a7 但我不确定如何完成第 5 步。您能否建议如何自动实现这一目标?

标签: node.jsgitdockerjenkins

解决方案


重新格式化评论中的答案,安装 Jenkins 和 Kubernetes 集群,您可以使用 Jenkins 插件(例如oc或)自动执行部署kubernetes,或者您可能更喜欢kubectl直接使用客户端,假设您的代理确实具有该二进制文件。

不了解 RBAC 细节,您可能需要 Jenkins 的 ServiceAccount,并使用令牌(可以在以您的 ServiceAccount 命名的 Secret 中找到)。该 ServiceAccount 应该有足够的权限在您打算将内容部署到的命名空间中创建资源——通常是editClusterRole,具有命名空间范围的 RoleBinding:

kubectl create sa jenkins -n my-namespace
kubectl create rolebinding jenkins-edit \
  --clusterrole=edit \
  --serviceaccount=my-namespace:jenkins-edit \
  --namespace=my-namespace

一旦 Jenkins 完成构建您的映像,您将其部署到 Kubernetes,很可能创建一个部署、一个服务和一个入口,替换资源名称、命名空间和入口请求的 FQDN 以满足您的要求。

准备您的部署 yaml,例如:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-BRANCH
spec:
  selector:
    matchLabels:
      name: app-BRANCH
  template:
     spec:
       containers:
       - image: my-registry/path/to/image:BRANCH
[...]
---
apiVersion: v1
kind: Service
metadata:
  name: app-BRANCH
spec:
  selector:
    name: app-BRANCH
  ports:
[...]
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: app-BRANCH
spec:
  rules:
  - host: app-BRANCH.my-base-domain.com
    http:
      paths:
      - backend:
          serviceName: app-BRANCH

然后,让您的 Jenkins 代理应用该配置,正确替换值:

sed "s|BRANCH|$BRANCH|" deploy.yaml | kubectl apply -n my-namespace -f-
kubectl wait -n my-namespace deploy/app-$BRANCH --for=condition=Available
kubectl logs -n my-namespace deploy/app-$BRANCH --tail=200

推荐阅读