本文档以构建一个 Java 软件项目并部署到阿里云容器服务的 Kubernetes 集群为例,为您介绍如何使用 Bamboo在阿里云Kubernetes服务上运行Remote Agents并在agents上运行Build Plans。

前提条件

  • 您已经成功创建一个 Kubernetes 集群,参见创建Kubernetes集群
  • 您已经创建好一个Bomboo Server。

源码项目

本示例中创建的GitHub源码项目地址为如下:
https://github.com/AliyunContainerService/jenkins-demo.git

分支为bamboo

在Kubernetes中部署Remote Agent

  1. 创建kaniko-docker-cfg secret。

    在Remote Agent上构建任务并且使用kaniko推送容器镜像时,kaniko-docker-cfg secret用于的配置镜像仓库访问权限。

    1. 在Linux服务器上使用root用户执行如下命令,生成/root/.docker/config.json
      docker login registry.cn-hangzhou.aliyuncs.com
    2. 通过CloudShell 连接 Kubernetes 集群,并执行如下命令,创建kaniko-docker-cfg secret。
      kubectl -n bamboo create secret generic kaniko-docker-cfg  --from-file=/root/.docker/config.json
  2. 创建Bamboo Agent 应用。
    创建serviceaccount bamboo以及clusterrolebinding,用于kubectl部署应用到kubernetes集群的权限设置。
    1. 创建并拷贝以下内容到bamboo-agent.yaml,并执行kubectl -n bamboo apply -f bamboo-agent.yaml命令,创建Bamboo Agent 应用。
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        namespace: bamboo
        name: bamboo
      
      ---
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: bamboo-cluster-admin
      subjects:
        - kind: ServiceAccount
          name: bamboo
          namespace: bamboo
      roleRef:
        kind: ClusterRole
        name: cluster-admin
        apiGroup: rbac.authorization.k8s.io
      
      ---
      apiVersion: apps/v1beta2
      kind: Deployment
      metadata:
        name: bamboo-agent
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: bamboo-agent
        template:
          metadata:
            labels:
              app: bamboo-agent
          spec:
            serviceAccountName: bamboo
            containers:
            - name: bamboo-agent
              env:
              - name: BAMBOO_SERVER_URL
                value: http://xx.xx.xx.xx:8085
              image: registry.cn-hangzhou.aliyuncs.com/haoshuwei/docker-bamboo-agent:v1
              imagePullPolicy: Always
              volumeMounts:
                - mountPath: /root/.docker/
                  name: kaniko-docker-cfg
            volumes:
              - name: kaniko-docker-cfg
                secret:
                  secretName: kaniko-docker-cfg
    2. 完成后,执行如下命令查看日志。
      kubectl -n bamboo logs -f <bamboo agent pod name>
      说明 示例中bamboo agent pod name需要替换成实际的文件名。
    3. Remote Agent注册成功后,登录Bamboo。单击右上角,在下拉框中选择Agent,在Bamboo administration页面,可以看到部署好的Agent。

配置一个Build plan

完成应用源码拉取、编译打包、容器镜像打包和推送、应用部署的过程。

  1. 创建一个Build plan。
    1. 登录Bamboo,选择Create > Create plan,进入Configure plan页面。
    2. Project选择bamboo-ack-demo,填写Plan namePlan keyPlan descriptionRepository host选择java-demo,完成后单击Configure plan

  2. 进入Configure Job页面,配置Stages并添加Job。
    1. 源码拉取

      在创建Bulid plan时,参数Repository host选择java-demo,即已完成源码拉取,您可以通过如下操作,修改源码拉取位置。

      1. Create tasks区域,单击Source Code Checkout

      2. 在右侧的Source Code Checkout configuration页面,修改参数Repository host的取值,单击Save
    2. mvn打包
      1. Create tasks区域,单击Add task,在弹出的Task types页面选择Command

      2. 在右侧弹出Command configuration页面,填写Task descriptionExecutableArgument后,单击Save

    3. kaniko打包和推送容器镜像
      1. Create tasks区域,单击Add task,在弹出的Task types页面选择Script

      2. 在右侧弹出Script configuration页面,填写Task descriptionScript location后(其他参数保持默认值即可),单击Save

        本示例中,Script location如下:
        kaniko -f `pwd`/Dockerfile -c `pwd` --destination=registry.cn-hangzhou.aliyuncs.com/haoshuwei/bamboo-java-demo:latest
    4. Kubectl 部署应用到 Kubernetes
      1. Create tasks区域,单击Add task,在弹出的Task types页面选择Script

      2. 在右侧弹出Script configuration页面,填写Task descriptionScript location后(其他参数保持默认值即可),单击Save

        本示例中,Script location如下:
        sed -i 's#IMAGE_URL#registry.cn-hangzhou.aliyuncs.com/haoshuwei/bamboo-java-demo:latest#' ./*.yaml
        kubectl apply -f ./
  3. 运行 Build。
    1. 上述配置完成后,单击Create,进入bamboo-ack-demo页面。

    2. 在右上角选择Run > Run plan,运行Build。

      您可以通过单击Logs页签,可以运行日志。

  4. 访问应用服务。
    1. 执行kubectl -n bamboo get svc命令,查看应用服务。
      [root@iZbp12i73koztp1cz75skaZ bamboo]# kubectl -n bamboo get svc
      NAME                TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)        AGE
      jenkins-java-demo   LoadBalancer   xx.xx.xx.xx     xx.xx.xx.xx       80:32668/TCP   39m
    2. 在浏览器中使用http://EXTERNAL-IP,访问应用。

相关参考

单击这里查看本示例中镜像registry.cn-hangzhou.aliyuncs.com/haoshuwei/docker-bamboo-agent:v1的制作。

了解更多Bamboo的相关内容,请参见Bamboo