管道 - Bitbucket -> Digital Ocean 容器注册表 -> 部署

问题描述 投票:0回答:1

我需要使 Bitbucket 存储库上的管道将在 git Push 上触发。该管道应创建 docker 映像,将该映像推送到 Digital Ocean 容器注册表中,然后在生产服务器(Digital Ocean)上为 Kubernetes 创建 Docker 容器。

我有一个管道,但管道将 docker 映像推送到 DO 容器注册表并将其拉回的步骤已损坏。当图像注册并可用时,需要等待 sleep(60)。但它总是拉以前的旧图像。所以我需要再次运行 Pileline,然后它从 DO 容器注册表中提取正确的图像。 这是 Bitbucket 管道的 yaml 文件

image: atlassian/default-image:3

options:
size: 1x

definitions:
services:
docker:
memory: 2048

pipelines:
#  custom:
#    dev-k8s:
#      - step:
#          name: Manual Build for Develop
#         services:
#           - docker
#          script
#            - docker build --build-arg VERSION=$VERSION_LABEL -t $IMAGE_TAG | tee -a logs.txt 2>&1
#          after-script:
#            - if [[ BITBUCKET_EXIT_CODE -eq 0 ]]; then exit 0; else echo "Step failed"; fi
#            - echo "Step failed"
#            - pipe: atlassian/slack-notify:2.1.0
#              variables:
#                WEBHOOK_URL: $SLACK_NOTIFICATION_URL_BACKEND
#                MESSAGE: '$(cat logs.txt)'
branches:
beta-k8s:
- step:
    name: Build for Beta & Push Image To Beta DigitalOcean
    services:
        - docker
    script:
        - set -o pipefail # important! makes sure the build fails when ANY of piped commands fail
        - export VERSION_LABEL=`[[ $BITBUCKET_TAG ]] && echo "$BITBUCKET_TAG-${BITBUCKET_COMMIT::7}" || echo "$BITBUCKET_REPO_FULL_NAME-${BITBUCKET_COMMIT::7}"`
        - export VERSION_REF=`[[ $BITBUCKET_TAG ]] && echo "$BITBUCKET_TAG" || echo "$BITBUCKET_BRANCH"`
        - export BUILD_NUMBER=`[[ $BITBUCKET_BUILD_NUMBER ]] && echo "$BITBUCKET_BUILD_NUMBER"`
        - cd deployment/kubernetes && docker build --build-arg VERSION=$VERSION_LABEL -t xxxxx-backend:beta-build-$BUILD_NUMBER -t xxxxx-backend:beta -f ./Dockerfile ../.. | tee -a logs.txt 2>&1
        - export REMOTE_IMAGE_TAG="registry.digitalocean.com/xxxxx/k8s-xxxxx-backend:beta" && echo REMOTE_IMAGE_TAG
        - export REMOTE_IMAGE_TAG_W_BUILD="registry.digitalocean.com/xxxxx/k8s-xxxxx-backend:beta-build-$BUILD_NUMBER" && echo REMOTE_IMAGE_TAG_W_BUILD
        - docker login -u $DIGITALOCEAN_CONTAINER_REGISTRY_TOKEN -p $DIGITALOCEAN_CONTAINER_REGISTRY_TOKEN registry.digitalocean.com | tee -a logs.txt 2>&1
        - docker tag xxxxx-backend:beta $REMOTE_IMAGE_TAG | tee -a logs.txt 2>&1
        - docker tag xxxxx-backend:beta $REMOTE_IMAGE_TAG_W_BUILD | tee -a logs.txt 2>&1
        - docker push $REMOTE_IMAGE_TAG | tee -a logs.txt 2>&1
        - docker push $REMOTE_IMAGE_TAG_W_BUILD | tee -a logs.txt 2>&1
        - echo "Waiting for a minute..."; sleep 60
- step:
    name: Refresh Beta Kubernetes
    trigger: automatic  # This is the problem. Should run on hook I think
    script:
        - pipe: atlassian/kubectl-run:3.6.0
variables:
KUBE_CONFIG: $KUBE_CONFIG
KUBECTL_COMMAND: 'rollout restart deployment backend-beta backend-queue-default-beta backend-queue-notifications-beta'

有人知道如何解决这个问题吗?我在 DO 容器寄存器上搜索了一些钩子,但没有成功。

docker bitbucket pipeline digital-ocean container-registry
1个回答
0
投票

要解决 Kubernetes 集群拉取旧映像的问题,您可能需要使用更强大的方法,而不仅仅是

sleep(60)
。该方法并不可靠,因为它假设图像在 60 秒后始终可用,但情况可能并非如此。

+-----------------------------------------------+
|         Bitbucket Repository                  |
| +------------------+   +--------------------+ |
| | Trigger Pipeline |-->| Build Docker Image | |
| +------------------+   +--------------------+ |
|          |                                    |
|          v                                    |
| +------------------+   +--------------------+ |
| | Push to DO Reg.  |-->| Kubernetes Deploy  | |
| +------------------+   +--------------------+ |
+-----------------------------------------------+

相反,您可以使用图像摘要来确保 Kubernetes 提取已推送的确切图像。

将镜像推送到Digital Ocean Container Registry后,从推送输出中获取镜像摘要。
然后,使用镜像摘要更新 Kubernetes 部署,这将保证拉取准确的镜像。

您的

bitbucket-pipelines.yml
文件中的脚本部分将是:

script:
    - set -o pipefail
    # (previous steps remain unchanged)
    - docker push $REMOTE_IMAGE_TAG | tee -a logs.txt 2>&1
    - export IMAGE_DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' $REMOTE_IMAGE_TAG)
    - echo "Image digest is $IMAGE_DIGEST"
    # Use the image digest to update the Kubernetes deployment
    - pipe: atlassian/kubectl-run:3.6.0
      variables:
        KUBE_CONFIG: $KUBE_CONFIG
        KUBECTL_COMMAND: "set image deployment/backend-beta backend-beta=$IMAGE_DIGEST --record"

推送图片后无需等待,直接通过摘要引用图片,推送后立即可用。
请务必将

backend-beta 命令
中的 
kubectl set image
替换为 Kubernetes 中部署的实际名称。

您更新的管道流程将是:

+-------------------------------------------------------------+
|                    Bitbucket Repository                     |
| +------------------+   +---------------------+   +--------+ |
| | Trigger Pipeline |-->| Build & Push Image  |-->| Deploy | |
| +------------------+   +---------------------+   +--------+ |
|          |                              |                   |
|          |                              |                   |
|          |                              v                   |
|          |            +---------------------------+         |
|          +----------->| Update K8s Deployment with|         |
|                       | Image Digest              |         |
|                       +---------------------------+         |
+-------------------------------------------------------------+
© www.soinside.com 2019 - 2024. All rights reserved.