做者 | 阿里雲智能事業羣技術專家 冬島 git
Build 模塊提供了一套 Pipeline 機制。Pipeline 的每個步驟均可以執行一個動做,這個動做能夠是把源碼編譯成二進制、能夠是編譯鏡像也能夠是其餘的任何事情。Knative Build 執行編譯的時候並不須要咱們提早準備編譯環境,全部這些都是直接在 Pod 中執行的。當有任務須要執行的時候 Build 模塊就自動建立 Pod 進行相應的處理。因此這一系列的動做都是 Kubernetes 原生的。github
既然是 Hello World 咱們就從一個具體的例子談起。docker
apiVersion: build.knative.dev/v1alpha1 kind: Build metadata: name: example-build-name spec: serviceAccountName: build-auth-example source: git: url: https://github.com/example/build-example.git revision: master steps: - name: ubuntu-example image: ubuntu args: ["ubuntu-build-example", "SECRETS-example.md"] - image: gcr.io/example-builders/build-example args: ["echo", "hello-example", "build"] - name: dockerfile-pushexample image: gcr.io/example-builders/push-example args: ["push", "${IMAGE}"] volumeMounts: - name: docker-socket-example mountPath: /var/run/docker.sock volumes: - name: example-volume emptyDir: {}
關鍵字段解釋:ubuntu
steps 字段和 template 字段互斥。若是未指定 template 就須要設置 steps 字段。此字段用於指定 Pipeline 的步驟。也能夠把 steps 定義在 BuildTemplate 中,這樣就能經過模板來複用 Pipeline 的能力了。api
每個 step 就是制定一個鏡像,在真正執行的時候啓動一個容器去作當前 step 的動做。bash
若是未設置 steps 就須要指定此字段。此字段經過引用 BuildTemplate 來設置 steps。ssh
經常使用的 Source 就是 git repo,經過此字段指定引用的 git repo ,repo 的受權信息經過關聯的 ServiceAccount 進行設定。curl
從 git repe 克隆代碼和向鏡像倉庫 push 鏡像都須要鑑權信息。這些鑑權信息能夠經過 Kubernetes 的 ServiceAccount 進行關聯。socket
能夠經過掛載 volume 的形式掛載 secret 或者 emptyDir 在多個 step 之間共享數據ide
整個 Build 過程默認超時時間是 10 分鐘,也就是若是在 10 分鐘內沒有還有 step 沒有執行完成就會超時退出。但有能夠經過 Timeout 字段自定義超時時間。
接下來分別對每個關鍵字段進行詳細的解讀。
下面這是一個設置 steps 的例子,這個例子中有三個 step。每個 step 都經過一個鏡像執行一個容器完成本身的動做。
spec: steps: - name: ubuntu-example image: ubuntu args: ["ubuntu-build-example", "SECRETS-example.md"] - image: gcr.io/example-builders/build-example args: ["echo", "hello-example", "build"] - name: dockerfile-pushexample image: gcr.io/example-builders/push-example args: ["push", "${IMAGE}"] volumeMounts: - name: docker-socket-example mountPath: /var/run/docker.sock
經過 BuildTemplate 來定義能夠重複使用的 steps,主要是對 steps 的複用。BuildTemplate 自己是 Kubernetes 中的一個 CRD。CRD 的好處就是能夠在用戶之間共享,只要是在同一個 Kubernetes 集羣內就能夠相互共享,這樣效率更高。
BuildTemplate 除了定義 steps 之外還能夠指定 parameters,用戶在使用 BuildTemplate 的時候能夠基於 parameters 對 steps 作個性化的設置。而 BuildTemplate 的編寫者也能夠經過 parameters 來共享變量。
spec: parameters: # This has no default, and is therefore required. - name: IMAGE description: Where to publish the resulting image. # These may be overridden, but provide sensible defaults. - name: DIRECTORY description: The directory containing the build context. default: /workspace - name: DOCKERFILE_NAME description: The name of the Dockerfile default: Dockerfile steps: - name: dockerfile-build image: gcr.io/cloud-builders/docker workingDir: "${DIRECTORY}" args: [ "build", "--no-cache", "--tag", "${IMAGE}", "--file", "${DOCKERFILE_NAME}", ".", ] volumeMounts: - name: docker-socket mountPath: /var/run/docker.sock - name: dockerfile-push image: gcr.io/cloud-builders/docker args: ["push", "${IMAGE}"] volumeMounts: - name: docker-socket mountPath: /var/run/docker.sock # As an implementation detail, this template mounts the host's daemon socket. volumes: - name: docker-socket hostPath: path: /var/run/docker.sock type: Socket
常見的 source 就是指定一個 git repo 或者 emptyDir 共享數據,下面咱們分別對這兩種場景進行說明。
下面這個例子的意思是從 https://github.com/knative/build.git clone 代碼,而且指定一個 step 是 cat README.md
spec: source: git: url: https://github.com/knative/build.git revision: master steps: - image: ubuntu args: ["cat", "README.md"]
下面這個例子是兩個 step,第一個 step 下載文件並保存到 /var/my-volume 中,第二個 step 是使用 /var/my-volume 的內容。
spec: steps: - image: ubuntu entrypoint: ["bash"] args: ["-c", "curl https://foo.com > /var/my-volume"] volumeMounts: - name: my-volume mountPath: /var/my-volume - image: ubuntu args: ["cat", "/etc/my-volume"] volumeMounts: - name: my-volume mountPath: /etc/my-volume volumes: - name: my-volume emptyDir: {}
下面這個例子是使用了 test-build-robot-git-ssh 這個 ServiceAccount 去關聯 clone 代碼須要的 git ssh 認證信息。經過 ServiceAccount 和 secret 保存認證信息也能夠作到在多個用戶之間共享相同的數據,並且能夠經過 RBAC 控制不一樣資源的可見範圍,比較靈活。
apiVersion: build.knative.dev/v1alpha1 kind: Build metadata: name: test-build-with-serviceaccount-git-ssh labels: expect: succeeded spec: serviceAccountName: test-build-robot-git-ssh source: git: url: git@github.com:knative/build.git revision: master steps: - name: config image: ubuntu command: ["/bin/bash"] args: ["-c", "cat README.md"]
apiVersion: v1 kind: ServiceAccount metadata: name: test-build-robot-git-ssh secrets: - name: test-git-ssh
apiVersion: v1 kind: Secret metadata: name: test-git-ssh annotations: build.knative.dev/git-0: github.com type: kubernetes.io/ssh-auth data: # Generated by: # cat id_rsa | base64 -w 0 ssh-privatekey: LS0tLS1CRUdJTiBSU0EgUFJJVk.....[example] # Generated by: # ssh-keyscan github.com | base64 -w 0 known_hosts: Z2l0aHViLmNvbSBzc2g.....[example]
下面這個是自定義 Build 超時時間的例子。
spec: timeout: 20m source: git: url: https://github.com/knative/build.git revision: master steps: - image: ubuntu args: ["cat", "README.md"]