如何运用Wercker开发与部署应用程序

Wercker 是什么?

Wercker 是一款软件自动化工具,旨在为开发者和企业改善持续集成(CI, Continuous-Integration)和持续交付(CD, Continuous-Delivery)流程。这个工具支持创建自动化工作流(Workflow)或管道(Pipelines),它指定了一系列任务或命令,当将更改推到源存储库时,这些任务或命令将在代码上运行。

本指南将使用三个示例的 Go 应用程序来演示关于 Wercker 的安装与配置的基础知识,并展示如何使用这些应用程序来创建不同类型的工作流。

准备工作

  1. 完成入门指南以创建一个 Linode(虚拟专用服务器)。本指南中的命令是在 Ubuntu 16.04 中编写的,不过其他发行版应该也能使用。
  2. 按照服务器安全指南创建一个标准帐户,强化 SSH 访问并删除不必要的网络服务。本指南将尽可能地使用sudo命令。
  3. 更新你的软件包: sudo apt update && sudo apt upgrade
  4. 本指南要求在您的 Linode 上安装 Docker。详情请参阅我们的另一指南:如何安装 Docker 并拉起容器部署映像
  5. 创建一个 GitHub 或类似的帐户。修改命令以匹配您选择的 git 变体。
  6. 创建一个 Docker 帐户。其他服务可能需要修改命令以及示例。

设置演示程序以及版本控制

1. 在你的本地计算机以及 Linode 上安装gitsudo apt install git

2. 登录 GitHub 并 fork 以下仓库:

· jClocksGMT,一个基本的 jQuery 数字与模拟时钟集合。

· golang/example,由golang项目组制作的一组最轻量的Go应用实例。

· golang 入门,关于 Wercker 的Go应用示例。

3. 在您的本地计算机上克隆您的 fork。(<GITHUB_USER>需要根据实际情况替换): · git clone https://github.com/<GITHUB_USER>/jClocksGMT.git

· git clone https://github.com/<GITHUB_USER>/example.git

· git clone https://github.com/<GITHUB_USER>/getting-started-golang.git

4. 在您的系统上安装 Go,并确保它在您系统的$PATH中: · sudo apt install golang-go go version

设置 Wercker 帐户

1. 在 Web 浏览器中,导航到 Wercker 主页并注册一个免费帐户。

2. 最简单的注册方法就是使用您的 GitHub 帐户。

配置 wercker.yml 和练习示例

Wercker 的优点之一是它的简单性。通过一个wercker.yml配置文件管理需要进行多个步骤的自动化管道。您可以将步骤(Step)视为对操作流程的调用,而将管道视为一个或多个步骤的集合。

jClocksGMT 示例

此示例演示了如何使用 Wercker 更新远程服务器上的源码(当 GitHub 仓库有更新时)。这是静态网站的常见用例:每当您从本地计算机上推送到 GitHub 时,托管该网站的服务器上的代码也会自动更新。

jClocksGMT目录的根目录中创建一个wercker.yml文件,并粘贴下面的内容。替换192.0.2.0为您的 Linode 公共 IP 地址,并更新最后一行以使用正确的用户名和文件路径。wercker.yml文件中所有的缩进必须使用空格,而不能是 Tab。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

box: debian # Build definition build: # The steps that will be executed on build steps: # Installs openssh client and server. - install-packages: packages: openssh-client openssh-server # Adds Linode server to the list of known hosts. - add-to-known_hosts: hostname: 192.0.2.0 local: true # Adds the Wercker SSH key. - add-ssh-key: keyname: linode # Custom code to be executed on remote Linode - script: name: Update code on remote Linode code: | ssh username@<Linode IP or hostname> git -C /path/to/jClocksGMT pull

每当(通过推送到仓库)触发 Wercker 运行时,Wercker 将加载 Docker 映像并从该映像运行指定的步骤。这就是为什么在 Linode 上运行的所有命令都以ssh开头。在这种情况下,该wercker.yml文件包含以下步骤:

  • box:定义所使用的 Docker 映像。在本文情景中,是指定了一个全局 Debian 映像。
  • install-packages:这一步是apt-get install命令的一个快捷方式。列出的所有软件包都将安装到您的容器中。
  • add-to-known_hosts:将 Linode 的 IP 或域名添加到已知主机文件。
  • add-ssh-key:将 Wercker 生成的公共 SSH 密钥添加到容器中。
  • script:脚本是自定义步骤,它几乎可以执行所有命令,在本例中这段代码表示的是在远程 Linode 上执行的动作。

有了这个build管道,Wercker 每次运行时都会执行以下操作:

  1. 在容器中加载 Debian 映像。
  2. 安装必要的包,openssh-clientopenssh-server
  3. 设置 Wercker 容器和 Linode 之间的 SSH 连接。
  4. Debian 容器从远程 Linode 上运行git pull命令。

Hello.go 示例

该示例演示了一个更复杂的管道——包含builddeploy的管道。这次,Wercker 将构建一个简单的 Go 应用程序并将其部署到 DockerHub,然后在将映像从 DockerHub 部署到远程 Linode。

1. 去到example这一 fork 的根目录,并将hello.go文件复制到那里: cp ./hello/hello.go .

2. 在同目录下创建wercker.yml文件:

box: google/golang

build:

    steps:
    # Sets the go workspace and places your package
    # in the right place in the workspace tree
    - setup-go-workspace

    # Build the project
    - script:
        name: Build application
        code: |
            go get github.com/<user>/example
            go build -o myapp

    - script:
        name: Copy binary
        code: |
          cp myapp "$WERCKER_OUTPUT_DIR"

### Docker Deployment
deploy:

    # This deploys to DockerHub
    steps:
    - internal/docker-scratch-push:
        username: $DOCKER_USERNAME
        password: $DOCKER_PASSWORD
        repository: <docker-username>/myapp
        cmd: ./myapp

### Linode Deployment from Docker
linode:

    steps:
    # Installs openssh client and other dependencies.
    - install-packages:
        packages: openssh-client openssh-server
    # Adds Linode server to the list of known hosts.
    - add-to-known_hosts:
        hostname: 192.0.2.0
        local: true
    # Adds SSH key created by Wercker
    - add-ssh-key:
        keyname: linode
    # Custom code to pull image
    - script:
        name: pull latest image
        code: |
            ssh username@192.0.2.0 docker pull <docker-username>/myapp:latest
            ssh username@192.0.2.0 docker tag <docker-username>/myapp:latest <docker-username>/myapp:current
            ssh username@192.0.2.0 docker rmi <docker-username>/myapp:latest

此配置中带有三个管道:

1. build管道:在本例中是用于构建应用程序的强制管道。由于此示例使用 Go 语言,因此最方便的box是官方的google/golang(附带了必要的工具配置)。该管道执行的步骤是:

· setup-go-workspace:准备好您的 Go 环境。

· Build application:运行名为myapp的示例应用程序的实际构建进程。应用保存在相应的工作区中。

· Copy binary:请记住,您正在处理临时管道。此步骤将应用的二进制文件保存为预定义的环境变量$WERCKER_OUTPUT_DIR,以便在下一个管道中使用它。

2. deploy管道:从$WERCKER_OUTPUT_DIR中获取二进制文件,然后将其推送到 Docker 帐户。

· internal/docker-scratch-push:让所有的奇迹发生。使用环境变量$DOCKER_USERNAME$DOCKER_PASSWORD,这样可以保存您的二进制文件到一个轻量级的scratch映像中。repository参数指定了要使用的 Docker 仓库。

3. linode管道:头三个步骤,install-packagesadd-to-known_hostsadd-ssh-key在以前的例子解释过:他们负责您的管道容器和你的 Linode 之间的 SSH 通信。 自定义的-scriptpull latest image从上面示例中的第 48 行开始:

· 从 Docker Hub 中提取最新的映像构建。默认情况下,此映像被标记为latest(除非另有说明)。

· 克隆您的最新映像并标记其为current

· 删除标记为latest的已拉起的映像,为下次更新做准备。

这是让 “当前” 应用程序一直运行的一种简单方法。请记住,这只是一个您可以自定义流程的示例。

Golang入门 —— 使用 Wercker CLI 的示例

最后一个示例介绍了 Wercker CLI。此工具要求本地计算机上安装有 Docker。您可以在您的 Linode 中采用与 “拉起容器部署映像” 指南相同的向导。

  1. 安装 Docker Machine: curl -L https://github.com/docker/machine/releases/download/v0.12.2/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && chmod +x /tmp/docker-machine && sudo cp /tmp/docker-machine /usr/local/bin/docker-machine
  2. 安装 Wercker CLI: sudo curl -L https://s3.amazonaws.com/downloads.wercker.com/cli/stable/linux_amd64/wercker -o /usr/local/bin/wercker sudo chmod 777 /usr/local/bin/wercker
  3. 检查 CLI 是否已正确安装: wercker version
  4. 如果上述命令失败,您可能还需要添加/usr/local/bin到您的$PATH变量: echo 'PATH=/usr/local/bin:$PATH' >> ~/.bash_profile
  5. 导航到 fork 的根目录: cd /path/of/your/getting-started-golang 此时一个wercker.yml文件应该已经存在:
box:
id: golang
ports:
    - "5000"

dev:
steps:
- internal/watch:
    code: |
      go build ./...
      ./source
    reload: true

# Build definition
build:
    # The steps that will be executed on build
    steps:

    # golint step
        - wercker/golint

    # Build the project
        - script:
            name: go build
            code: |
              go build ./...

# Test the project
- script:
    name: go test
    code: |
      go test ./...

yml文件中只定义了两个管道:devbuild。请注意,在此示例中,暴露的端口为5000

· dev:这种特殊类型的管道只能在本地使用,并且仅用于应用程序测试。

· internal/watch:观察代码的更改。如果发生任何事件,它会再次触发应用程序的构建(reload: true)。这对调试进程来说很有用。

· build:这通常是构建应用程序的第一步。但现在您可以使用它来检查代码中的build步骤(wercker/golint)是否存在错误。

怎样添加应用程序 Wercker?

顾名思义,Wercker 应用程序对应于您的每个项目。由于使用 Wercker 的版本控制方案,您可以将每个应用程序视为特定的工作仓库。

1. 注册三个 fork 仓库。单击右上角的 “+” 按钮:

2. 选择第一个示例仓库 <GITHUB_USER> / jClocksGMT

3. 配置仓库的访问权限。如果项目不使用子模块,“recommended(推荐的)” 选项通常是最佳选择。

4. 选择您的应用程序是私有的(“private”,默认选项)还是公有的(“public”)。将示例标记为公有,然后单击 完成(Finish) 按钮。

此时出现一个问候消息,表明您已准备好开始构建应用程序。它提供了启动向导来帮助您创建应用程序wercker.yml文件,但这不是必需的,因为您已经在上一节中已经这样做了。

5. 对其他两个示例项目重复相同的过程。

配置应用程序

jClocks 示例

与配置文件类似,您需要设置几个环境变量。

1. 对于第一个示例,您需要一个 SSH 密钥对来与您的 Linode 进行通信。单击 “环境(Environment) 选项卡:

2. 单击 “生成 SSH 密钥(Generate new SSH key)”。接下来弹出的窗口将会询问密钥名称(使用与wercker.yml文件中相同的名称,文件: linode)。选择 4096位 加密:

这步操作将生成密钥对:linode_PUBLIClinode_PRIVATE。后缀会自动添加,配置文件中就不需要自己加上了。

3. 将linode_PUBLIC密钥复制到您的 Linode 中。如果终端应用程序支持复制和粘贴,则可以使用 CTL-C CTL-V 将文本从 Wercker 仪表板复制到 Linode 的~/.ssh/authorized_keys中。如果不支持,您可以将密钥复制到本地计算机,再将其复制到远程服务器: cat ~/.ssh/jclock.pub | ssh root@<Linode IP or hostname> "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

4. 您的第一个示例已准备好部署:应用程序在 Wercker 上配置,您的本地仓库包含了wercker.yml文件,它解释了要执行的步骤。想要触发自动化操作,请提交一些更改。要查看相关进度,请单击 Wercker 中的 “运行(Runs)” 选项卡。在 jClocksGMT 这一 fork 的根目录运行以下命令: git add . && git commit -m "initial commit" && git push origin master

5. 会有动效显示出每个步骤的进度,并允许您调试任何问题。下面是一个构建失败的情况:

提示 “远程 Linode 上的代码更新出现失败。”,单击构建管道以获取详细信息:

6. 这表明该过程出现失败的步骤为 “更新远程 Linode 上的代码”。其原因是仓库起初并没有克隆在远程 Linode 上。连接到您的 Linode 并在适当的位置克隆存储库,然后返回到 Wercker 仪表板并单击 “重试(Retry)” 按钮:

这次就应该运行成功了,并且您的远程 Linode 仓将被更新。此基本示例可用于许多情景。如果您正在托管静态网站,则可以将 Wercker 配置为 ”每当提交更改时,相应地更新远程服务器“。

hello.go 示例

单击 Wercker 仪表板中的 “工作流程(Workflows)” 选项卡。编辑器将展示一个由 Wercker 自动创建的单独管道build。此示例需要您必须手动创建的其他管道。

1. 单击 ”添加新管道(Add new pipeline)“:

2. 填写如下字段:

· 名称:您可以使用任意名称来描述您的管道,对于此示例我们将使用deploy-dockerdeploy-linode

· YML 管道名称:这是在wercker.yml文件中声明的名称。分别填写deploylinode

· 钩类型(Hook type):使用默认行为,链接(Chain)这条管道到另一个管道。如果要在每次提交推送时并行运行不同的管道,则可以选择 Git push

3. 配置管道后,您可以链接它们。单击 ”+“ 到build管道右侧:

您可以选择定义特定分支(或多个分支)以触发管道。默认情况下,Wercker 将监视所有分支,如果有任何提交出现,就会开始执行步骤,这就是我们的示例。在下拉列表中选择 ”deploy-docker“,然后再单击 “添加(Add)”。

4. 重复此过程以在该管道之后链接deploy-linode管道。最终结果如下:

5. 接下来,您需要定义环境变量,但这次您将在每个管道内分别执行,而不是进行全局操作。在 “工作流(Workflows)” 选项卡上,单击屏幕底部的 ”deploy-docker 管道。此处您可以创建变量。这个例子的wercker.yml中有两个变量必须在这里定义:即DOCKER_USERNAMEDOCKER_PASSWORD。创建它们并将密码标记为 ”受保护的(protected)“。

6. 选择 deploy-linode 管道并创建 SSH 密钥对,与上一示例类似。请记住将公钥复制到远程服务器。

7. 通过提交到本地 fork 以测试您的工作流: git add . && git commit -m "initial commit" && git push origin master 您最终得到类似如下结果:

8. 通过远程登录并运行docker images以测试远程服务器上的应用程序:

此时仅有一个标签为current的映像。

9. 通过docker run命令运行应用: docker run <docker-username>/myapp:current

10. 如果要进一步测试自动化步骤,则在/example文件夹内编辑hello.go。在消息中添加一些文字。提交更改并等待 Wercker 自动化运行。

11. 再次运行您的应用程序,此时您应该能看到修改后的消息:

Wercker CLI 示例

最后一个示例演示了 Wercker CLI 相关内容。

1. 导航到getting-started-golang这一 fork 的根目录。

2. 通过运行下列命令启动 Wercker: wercker build

此处的输出应类似于您在 Wercker 仪表板上所看到的日志。不同之处在于,您可以在本地检查每个步骤,并在流程中更早地检测到错误情况。Wercker CLI 重复 SaaS 的行为:它下载指定的图像,构建,测试并显示错误。由于 CLI 是一种旨在促进本地测试更加便利的开发工具,因此您将无法远程部署最终结果。

3. 使用 Go 构建应用程序: go build 该应用程序(即getting-started-golang)构建在根目录中。

4. 运行程序: ./getting-started-golang

5. 导航到localhost:5000/cities.json。您应该会看到显示的城市列表:

6. 使用 CTRL + C 关闭程序。运行wercker devwercker dev --expose-ports

此命令会启动dev管道中的自动构建功能。它在 Docker 容器中构建应用程序并从那里提供服务。如果您对应用程序进行任何更改,容器将重建以反映这一更改。

7. 在文本编辑器中打开main.go文件,并在城市列表中添加一个条目。刷新浏览器,此时您应该能看到更新的列表。

下一步计划

开发者在使用 Wercker 时具有无限的可能性:

  • 您可以指定 ”局部框(local boxes)“,这意味着您可以根据管道的目标而使用专门的图像。DockerHub 中有许多图像可以用于此目的。
  • 您不仅限于 ”链接(Chain)“ 工作流,您可以并行启动管道(尽可能多地)并在必要时才进行链接。如果您需要构建需要很长编译时间的复杂应用程序,这将会非常有用。您可以在与其他任务并行的早期启动编译管道。您还可以将应用程序划分为多个管道,以减少每个进程的时间并隔离问题。
  • Wercker 是无关于语言、流程、平台的。换句话说 —— 只有你想不到,没有 Wercker 工具做不到。

更多信息

有关此主题的其他信息,您可能需要参考以下资源。此处提供这些资源是希望它们能够有所帮助,但请您注意,我们无法保证外部托管材料的准确性或及时性。

本文的版权归 StoneDemo 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张戈的专栏

利用Centos或RedHat的iso镜像搭建本地yum仓库

这两天工作是用几台 PC 机给开发组搭建本地测试环境:CentOS-6.4-x86_64 + ant + svn。 为了操作简单及系统稳定,全部系统采用最小化安...

3955
来自专栏云计算

怎样用NextCloud管理块存储卷

Nextcloud是一个云存储平台,你可以在任意设备上访问该平台、存储和查看你的文件。本文将介绍如何在一台Linode服务器上挂载Block Storage(块...

1.8K3
来自专栏散尽浮华

Mesos+Zookeeper+Marathon的Docker管理平台部署记录(2)--负载均衡marathon-lb

之前介绍了Mesos+Zookeeper+Marathon的Docker管理平台部署记录(1)的操作,多余的废话不说了,下面接着说下在该集群环境下的负载均衡ma...

4369
来自专栏finleyMa

docker学习系列14 使用haproxy实现mysql集群的负载均衡

在上节中我们创建了 mysql 集群。 实际工作中,我们不希望让某一数据库节点处理所有的请求,这样的话单个负载高,性能差。

6892
来自专栏个人分享

Linux知识体系之路径属性与目录

  最近在看鸟哥的Linux私房菜,我觉得这本书还是很不错的。这里进行相关的总结。

1011
来自专栏写写代码吃吃瓜

Ubuntu环境下Tornado环境部署

1737
来自专栏jmeter高手高高手

Jmeter(三十二)_搭建本地接口自动化环境

我们在学习接口自动化的时候,最理想的状态是在公司有项目可以操作。大部分时候我们并没有可以练习的项目,因此练习接口无从谈起,只能找一些开放的api来练一练,但是这...

1694
来自专栏黑白安全

无需ROOT在手机安装kali工具集

https://github.com/LionSec/katoolin这个链接就是我们要安装的工具

1503
来自专栏bdcn

Anaconda配置和使用 原

原来一直使用原生python和pip的方式,换了新电脑,准备折腾下Anaconda。

1.1K1
来自专栏james大数据架构

idea启动多个tomcat失败

Intellij idea中,为在本地调试两个系统之间的调用,配置两个本地tomcat server,设置不同的端口号,如8081和8082,Deploy中加入...

2255

扫码关注云+社区

领取腾讯云代金券