Close

使用 Bitbucket Pipelines 编写任务脚本的提示

Sten Pittet 头像
Sten Pittet

特约作家

借助 Bitbucket Pipelines,您可以快速对存储库采用持续集成或持续交付工作流。在此过程中,一个重要部分是将手动流程转换为由机器自动运行的脚本,而不需要人工干预。但有些时候,自动执行任务可能颇为棘手,因为您可能会在安装依赖项或报告问题时遇到一些身份验证方面的问题。本指南将为您提供一些编写脚本的提示!

时间

30 分钟

观众

持续部署和/或 Bitbucket Pipelines 的新手

第 1 步:不记录敏感信息!

在深入探索自动化世界之前,您需要查看日志,确保不会输出敏感数据,例如 API 密钥、凭据或任何可能危及系统安全的信息。一旦您开始使用 Bitbucket Pipelines 运行脚本,日志就会被存储起来,且任何有权访问您的存储库的人员均可读取它们。

第 2 步:使用 SSH 密钥连接远程服务器

身份验证通常是自动化中最麻烦的环节之一。SSH 密钥具有双重优势:远程服务器连接管理简单,同时非常安全。借助 Bitbucket Pipelines,您可以轻松生成新的密钥对,在每次运行管道时用于连接远程服务器。

直接从 Bitbucket Pipelines 生成 SSH 密钥

您只需要将公钥复制到远程服务器上,就可从正在运行的管道连接该远程服务器。例如,一旦服务器上设置了 SSH 密钥(您可以使用 URL 或 IP 地址),以下脚本就可列出 /var/www 目录下的文件,而无需提供密码。

bitbucket-pipelines.yml

image: node:4.6.0
   pipelines:
      default:
        - step:
           script:
              - ssh <user>@<server> ls -l /var/www

别忘了在“已知主机”部分注册所有需要连接的服务器,否则当您尝试连接远程服务器时,您的管道会因为等待批准而卡顿。

第 3 步:对 API 密钥和凭证使用受保护的环境变量

如果您需要将远程 API 用作脚本的一部分,那么 API 提供程序有可能允许您通过 API 密钥使用其受保护的资源。您可以使用受保护的环境变量,将凭据安全地添加到 Bitbucket Pipelines。保存之后,您可以在脚本中调用它们,而日志输出也会屏蔽它们。

Bitbucket Pipelines 会在日志中一直屏蔽受保护的变量

第 4 步:在非交互模式下运行命令

如果您需要在脚本中安装依赖项,请确保它不会提示用户进行验证或输入。查看您所用命令的文档,看看是否有允许您以非交互方式运行它们的标记。

例如,以下命令中的 -y 标记将在 Debian 服务器上安装 PostgreSQL。

apt-get install -y postgresql

而且,-q 标记允许您以非交互方式运行 Google Cloud SDK 命令。

gcloud -q app deploy app.yaml

第 5 步:自行构建现成可用的 Docker 镜像

安装运行管道所需的依赖项可能会比较耗时。您可以自行创建 Docker 镜像,在其中包含构建和测试应用所需的基本工具和软件包,从而节省大量运行时间。

例如,在以下 Pipelines 配置中,我们在开头安装了 AWS CLI,以便稍后使用它将应用部署到 AWS Elastic Beanstalk。

bitbucket-pipelines.yml

image: node:7.5.0
   pipelines:
      default:
       - step:
          script: # Modify the commands below to build your repository.
           - apt-get update && apt-get install -y python-dev
           - curl -O https://bootstrap.pypa.io/get-pip.py
           - python get-pip.py
           - pip install awsebcli --upgrade
           - npm install
           - npm test
           - eb init helloworld-beanstalk-bbp -r eu-west-1 -p node
           - eb deploy hw-eb-tutorial

此处的重点在于 AWS CLI 不会在每次提交时改变,换言之,我们浪费了一些时间来安装默认可以捆绑的依赖项。

以下 Dockerfile 可用于创建已做好 Elastic Beanstalk 部署准备的自定义 Docker 镜像。

Dockerfile

FROM node:7.5.0 
RUN apt-get update \   && apt-get install -y python-dev \   && cd /tmp \   && curl -O https://bootstrap.pypa.io/get-pip.py \   && python get-pip.py \   && pip install awsebcli --upgrade \   && apt-get clean \   && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

如果我可以将它推送到 spittet/my-custom-image 引用下面,就能简化 Bitbucket Pipelines 配置,使其仅包含构建、测试和部署应用所需的命令。

bitbucket-pipelines.yml

image: spittet/my-custom-image
   pipelines:
     default:
       - step:
            script: # Modify the commands below to build your repository.
              - npm install
              - npm test
              - eb init helloworld-beanstalk-bbp -r eu-west-1 -p node
              - eb deploy hw-eb-tutorial

最后一句:脚本也是代码

这些提示应该能帮助您将手动任务转变为自动化流程,并由 Bitbucket Pipelines 一类的服务可靠地重复运行。最终,它们会成为您的版本发布的守护者,同时成为能触发跨服务器和平台部署整个生产环境的强大工具。

正因为此,您需要将自动化脚本视作代码,并对其完成与代码相同的审核和质检流程。值得庆幸的是,这可以利用 Bitbucket 来轻松实现,因为您的管道配置将与代码一同签入,从而允许您在正确的上下文中创建拉取请求。

最后,将脚本应用于生产环境之前,记得先在测试环境中运行它们 — 这些额外工作可让您免遭不慎清除生产数据的麻烦。

Sten Pittet
Sten Pittet

我从事软件行业已有 10 年了,担任过从开发到产品管理的各种职务。过去五年,我在 Atlassian一直从事开发人员工具方面的工作,现在在写关于构建软件的文章。在工作之外,我喜欢与我的孩子一起共度美好时光。


分享此文章

推荐阅读

将这些资源加入书签,以了解 DevOps 团队的类型,或获取 Atlassian 关于 DevOps 的持续更新。

Devops 示意图

DevOps 社区

Devops 示意图

DevOps 学习路径

地图插图

免费试用

注册以获取我们的 DevOps 新闻资讯

Thank you for signing up