基于Jenkins+OOS+OSS的镜像自动更新

本文展示如何基于Jenkins+OOS+OSS构建自动镜像更新流程。

简介

下面以WordPress博客系统为例,来构建基于Jenkins + OOS+OSS的镜像更新。

  • WordPress github地址

  • OOS 系统运维管理 OOS(CloudOps Orchestration Service),阿里云的自动化运维服务,用于管理软件版本和分批发布。

  • OSS 对象存储, 用于存储构建的软件包。

  • Jenkins 自动化构建,并触发更新OSS和OOS的软件包。

  • ROS 资源编排服务,阿里云提供的云资源的自动化部署服务,可以帮您一键部署系统所依赖的云资源(ECS,RDS,SLB等)。 

WordPress服务器准备

此处展示通过ROS创建了一套包含ECS和RDS的WordPress环境。

  1. 登录ROS(资源编排)控制台

  2. 单击模板 > 模板示例

  3. 单击基于ECS和RDS创建WordPress环境

  4. 单击创建资源栈

  5. 输入密码和实例类型等相关参数,然后单击创建,等待片刻后,若环境创建成功,资源栈的输出结果样式如下。oos

  6. 其中输出的WordPressUrl值是单机版WordPress地址,通过浏览器访问可以看到网站已经部署好。oos

创建并配置Jenkins资源

此处展示通过ROS快速创建一台安装有Jenkins的ECS实例,并完成配置,本示例所用操作系统为Aliyun Linux。

  1. 登录ROS(资源编排)控制台

  2. 单击模板 > 模板示例

  3. 单击Jenkins 单机版(已有VPC)

  4. 单击创建资源栈

  5. 输入参数,然后单击创建,等待片刻后,若环境创建成功,资源栈的输出结果样式如下。oos

  6. 打开本机浏览器,访问资源输出的JenkinsUrl,形如http://39.**.**.168:8080。

  7. 复制资源输出的InitialAdminPassword,将其填入管理员密码,单击继续。oos

  8. 选择安装推荐的插件。

  9. 设置用户名和密码后登录。oos

确认Git安装情况

  1. 连接到Jenkins实例,确认Git安装情况。

    git --version 
  2. 如果未安装执行以下命令安装:

    yum install git -y

安装并配置Aliyun Cli

  1. 参考授予实例RAM角色,为上文创建的Jenkins实例授予RAM角色。

  2. 确定实例RAM角色授予成功后,连接到Jenkins实例,为jenkins实例安装配置ALiyun Cli,相关命令如下。

    mkdir -p  $HOME/aliyun
    cd $HOME/aliyun
    wget https://aliyuncli.alicdn.com/aliyun-cli-linux-3.0.51-amd64.tgz
    tar xzvf aliyun-cli-linux-3.0.51-amd64.tgz
    sudo cp $HOME/aliyun/aliyun /usr/local/bin

更新镜像

  1. 单击新建Item

  2. 输入一个任务名称,并选择Freestyle project,单击确定

  3. 单击源码管理,选择Git,并配置Repository URL,本示例填写如下URL https://github.com/WordPress/WordPress.gitoos

  4. 单击构建,单击增加构建步骤,添加执行Shell步骤,配置命令,填入如下脚本,脚本功能(将wordpress master的数据打包并拷贝到oss://wordpress-test-oos路径下,然后在OOS内创建名为wordpress的软件包,接着通过OOS执行更新镜像)。

    # 制作包
    version=`date +%s`
    
    # 打包命令
    tar -cvf wordpress_$version.tar `find .|grep -v wp-config-sample.php|grep -v targets|grep -v .git|grep -v ^\.$`
    
    #授权aliyun权限
    # 注意请将ramRoleName设为已授予jenkins所在实例的RAM角色,本示例使用的是InstanceRole。
    ramRoleName="InstanceRole"
    aliyun configure set --profile ecsRamRoleProfile --mode EcsRamRole --region cn-zhangjiakou --ram-role-name $ramRoleName
    
    # 拷贝到OSS上
    aliyun oss cp wordpress_$version.tar oss://wordpress-test-oos/wordpress_$version.tar
    
    # 软件包内容
    templateName=wordpress
    # templateContent指定Location地址,并配置安装时候执行的脚本
    # {
    #         "FormatVersion": "OOS-2020-01-01-Package",
    #         "Description": "",
    #         "Packages": [{
    #                 "Name": "wordpress_$version.tar",
    #                 "Location": "oss://wordpress-test-oos/wordpress_$version.tar",
    #                 "InstallScript": "test -e wordpress || mkdir wordpress && cd wordpress && mv ../wordpress_1594290375.tar . && tar xvf wordpress_1594290375.tar > /dev/null && rm wordpress_1594290375.tar &&  test -d  /var/www/html/ &&  cp -rf * /var/www/html/  || mkdir -p  /var/www/html && cp -rf * /var/www/html/"
    #                 "UninstallScript": "echo uninstall",
    #                 "Targets": [{
    #                         "PlatForm": "centos",
    #                         "Architect": "x86_64"
    #                 }]
    #         }]
    # }
    
    
    templateContent="{\"FormatVersion\":\"OOS-2020-01-01-Package\",\"Description\":\"\",\"Packages\":[{\"Name\":\"wordpress_$version.tar\",\"Location\":\"oss://wordpress-test-oos/wordpress_$version.tar\",\"InstallScript\":\"test -e wordpress || mkdir wordpress && cd wordpress && mv ../wordpress_$version.tar . && tar xvf wordpress_$version.tar > /dev/null && rm wordpress_$version.tar && test -d /var/www/html/ &&  cp -rf * /var/www/html/  || mkdir -p /var/www/html && cp -rf * /var/www/html \",\"UninstallScript\":\"echo uninstall\",\"Targets\":[{\"PlatForm\":\"centos\",\"Architect\":\"x86_64\"}]}]}"
    
    # 更新/创建 OOS上的软件包
    aliyun oos CreateTemplate --TemplateName=$templateName --Content "$templateContent" || aliyun oos UpdateTemplate --TemplateName=$templateName --Content "$templateContent"
    # 清理打包临时文件
    rm wordpress_$version.tar
    
    # OOS执行更新镜像
    # 设置更新镜像模版执行所需的参数,参数介绍可参考https://oos.console.aliyun.com/cn-zhangjiakou/execution/create/ACS-ECS-UpdateImage
    regionId="cn-zhangjiakou"  # 资源执行的地域
    ramRoleName="InstanceRole"  # 将授予给临时实例的Ram Role
    securityGroupId="sg-8vb9b*****wvnuqy6" # 请准备安全组参数用于创建临时实例
    vSwitchId="vsw-8vb5p1******zv01c" # 请准备交换机参数用于创建临时实例
    instanceType="ecs.g5.large" # 临时实例的实例规格
    
    sourceImageId="centos_7_8_x64_20G_alibase_20200622.vhd" #要更新的源镜像
    
    commandType="RunShellScript"  # 脚本类型
    
    ##commandContent脚本的内容如下
    #version=v1.0.3
    #utilPath=/usr/local/share/aliyun-oosutil
    #binaryPath=/usr/local/share/aliyun-oosutil/$version
    #test -e $binaryPath || mkdir -p $binaryPath
    #test -e $binaryPath/oosutil_linux || wget "https://oos-public-cn-zhangjiakou.oss-cn-zhangjiakou-internal.aliyuncs.com/oosutil/$version/linux/oosutil_linux" -O $binaryPath/oosutil_linux -q
    #chmod +x $binaryPath/oosutil_linux
    #$binaryPath/oosutil_linux configure_package install wordpress
    # 用于安装我的软件wordpress的脚本
    commandContent='version=v1.0.3\nutilPath=/usr/local/share/aliyun-oosutil\nbinaryPath=/usr/local/share/aliyun-oosutil/$version\ntest -e $binaryPath || mkdir -p $binaryPath\ntest -e $binaryPath/oosutil_linux || wget \"https://oos-public-cn-zhangjiakou.oss-cn-zhangjiakou-internal.aliyuncs.com/oosutil/$version/linux/oosutil_linux\" -O $binaryPath/oosutil_linux -q\nchmod +x $binaryPath/oosutil_linux\n$binaryPath/oosutil_linux configure_package install wordpress\n'
    parameters="{
      \"securityGroupId\": \"$securityGroupId\",
      \"commandType\": \"$commandType\",
      \"sourceImageId\": \"$sourceImageId\",
      \"regionId\": \"$regionId\",
      \"vSwitchId\": \"$vSwitchId\",
      \"instanceType\": \"$instanceType\",
      \"commandContent\": \"$commandContent\",
      \"ramRoleName\": \"$ramRoleName\"
    }"
    
    aliyun oos StartExecution --TemplateName ACS-ECS-UpdateImage --Parameters "${parameters}"
  5. 单击保存

  6. 配置好后单击立即构建触发部署流程,然后单击Build History可查看部署情况。oos

  7. 在Console Output里我们可以看到本次部署的日志,整个过程包括从Git拉取代码,执行tar打包,将包拷贝到OSS上,以及在OOS上创建(更新)一个名为wordpress的软件包,软件包在OOS控制台我的软件(注意切换地域)可查看到,最后执行OOS的公共模板ACS-ECS-UpdateImage,生成安装了最新应用代码的镜像。oos

  8. 单击详情可查看软件的详情,包名、存储位置、安装脚本、卸载脚本,以及历史版本。oos

  9. 单击执行管理可以查看到jenkins触发的镜像更新,若此时使用生成的镜像创建实例,则可发现实例内/var/www/html/文件夹的数据已在更新镜像时完成更新。oos