使用 Bitbucket Pipelines 编写任务脚本的提示
Sten Pittet
特约作家
借助 Bitbucket Pipelines,您可以快速对存储库采用持续集成或持续交付工作流。在此过程中,一个重要部分是将手动流程转换为由机器自动运行的脚本,而不需要人工干预。但有些时候,自动执行任务可能颇为棘手,因为您可能会在安装依赖项或报告问题时遇到一些身份验证方面的问题。本指南将为您提供一些编写脚本的提示!
时间
30 分钟
观众
持续部署和/或 Bitbucket Pipelines 的新手
第 1 步:不记录敏感信息!
在深入探索自动化世界之前,您需要查看日志,确保不会输出敏感数据,例如 API 密钥、凭据或任何可能危及系统安全的信息。一旦您开始使用 Bitbucket Pipelines 运行脚本,日志就会被存储起来,且任何有权访问您的存储库的人员均可读取它们。
第 2 步:使用 SSH 密钥连接远程服务器
身份验证通常是自动化中最麻烦的环节之一。SSH 密钥具有双重优势:远程服务器连接管理简单,同时非常安全。借助 Bitbucket Pipelines,您可以轻松生成新的密钥对,在每次运行管道时用于连接远程服务器。
您只需要将公钥复制到远程服务器上,就可从正在运行的管道连接该远程服务器。例如,一旦服务器上设置了 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。保存之后,您可以在脚本中调用它们,而日志输出也会屏蔽它们。
第 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 来轻松实现,因为您的管道配置将与代码一同签入,从而允许您在正确的上下文中创建拉取请求。
最后,将脚本应用于生产环境之前,记得先在测试环境中运行它们 — 这些额外工作可让您免遭不慎清除生产数据的麻烦。
分享此文章
下一主题
推荐阅读
将这些资源加入书签,以了解 DevOps 团队的类型,或获取 Atlassian 关于 DevOps 的持续更新。