精华内容
下载资源
问答
  • 使用Azure DevOps持续集成GitHub项目.pdf
  • 企业devops持续集成I love rock climbing. I’ve been climbing since 2002, and over the years, climbing has turned into a family activity. One of the things that I love most about climbing is that it’s ...

    企业devops持续集成

    I love rock climbing. I’ve been climbing since 2002, and over the years, climbing has turned into a family activity. One of the things that I love most about climbing is that it’s all about solving hard problems. Climbing is about getting to the top of the wall without falling. The type of climbing that I do, known as bouldering, is about climbing without a rope, which adds to the challenge. When I work on a bouldering problem, depending on the level of difficulty, it can result in multiple falls off the wall. As frustrating as the falls can be, each time I get back on the wall, I learn a little bit more about the problem, and often am able to successfully top the problem.

    我喜欢攀岩。 我从2002年开始爬山,多年来,爬山已成为一项家庭活动。 我最喜欢爬坡的一件事就是解决难题。 攀登是要不跌倒地到达墙顶。 我从事的攀岩类型称为抱石攀岩,是指不用绳索攀登,这增加了挑战。 当我处理抱石问题时,根据难度的不同,它可能导致多次跌落。 就像跌倒一样令人沮丧,每次我回到墙上时,我都会学到更多关于该问题的知识,并且通常能够成功地解决该问题。

    DevOps的承诺 (The DevOps Promise)

    DevOps, especially DevOps at the Enterprise, is like rock climbing, as it too is all about solving hard problems. And like rock climbing, DevOps is my passion.

    DevOps,尤其是Enterprise的DevOps,就像攀岩一样,因为它同样也涉及解决难题。 和攀岩一样,DevOps是我的激情所在。

    Before we dive into things, let’s review the DevOps promise. DevOps tells us that we’re supposed to deliver software faster, and more safely. When you factor in DevOps at the enterprise, you need to take the following into account:

    在深入探讨之前,让我们回顾一下DevOps的承诺。 DevOps告诉我们,我们应该更快,更安全地交付软件。 在企业中考虑DevOps时,需要考虑以下因素:

    • Compliance (to keep regulators happy)

      合规 (让监管者满意)

    • Security (to keep client information safe)

      安全 (以确保客户信息安全)

    • Scale (how to ensure that the entire organization is following DevOps practices)

      扩展(如何确保整个组织遵循DevOps实践)
    • Tons of silos (team, department, company-wide, etc.)

      吨筒仓(团队,部门,公司范围内等)
    • Hundreds of projects, many of which need to be delivered concurrently

      数百个项目,其中许多项目需要同时交付
    • Fluid and dynamic workforce, comprised of mixture of full-time and contract workforce

      流动和动态的劳动力,由全职和合同劳动力组成

    系统开发生命周期 (System Development Life Cycle)

    Before we dig a bit deeper into things, let’s examine software delivery at a smaller organization. From top to bottom:

    在深入研究之前,让我们检查一下较小组织的软件交付。 从上到下:

    • Row 1 represents the system development life cycle (SDLC)

      第1行代表系统开发生命周期(SDLC)

    • Row 2 (blue square) represents the parts of the SDLC which can be automated

      第2行 (蓝色正方形)代表SDLC的各个部分,这些部分可以自动执行

    • Row 3 represents common tools at the enterprise level which support the automation in Row 2.

      第3行代表企业级的通用工具,支持第2行的自动化。

    • Row 4 features the DevOps practices which support all of the above

      第4行具有支持上述所有功能的DevOps实践

    Image for post

    In a relatively small organization, this can be a relatively simple task. Smaller orgs tend to hire a small team of DevOps engineers who will manually build CI/CD pipelines to manage DevOps.

    在相对较小的组织中,这可能是相对简单的任务。 较小的组织倾向于雇用一小组DevOps工程师,他们将手动建立CI / CD管道来管理DevOps。

    When you factor in a large organization, however, with tons of silos, distributed workforces, hundreds of concurrent projects, and all sorts of other complexities, you can end up with this DevOps mess:

    但是,当您考虑到一个庞大的组织,大量的孤岛,分散的劳动力,数百个并发项目以及各种其他复杂性时,您最终可能会遇到以下DevOps混乱:

    Image for post

    赞! (YIKES!)

    DevOps efforts, from manual pipeline creation to scaling practices, suddenly become exceedingly complex. This leads to:

    从手动管道创建到扩展实践的DevOps努力突然变得异常复杂。 这导致:

    • Duplication of work

      工作重复
    • Maintenance nightmares

      维修噩梦
    • Automation sprawl

      自动化蔓延

    We’re definitely NOT fulfilling the DevOps promise.

    我们绝对不能兑现DevOps的承诺。

    规模化DevOps是企业最大的挑战 (DevOps at Scale is the Enterprise’s Biggest Challenge)

    Consider some additional problems that we see with DevOps in large enterprises:

    考虑我们在大型企业中通过DevOps看到的一些其他问题:

    • Frustration with the lack of connectivity between the various DevOps tools in their toolchain

      由于其工具链中各种DevOps工具之间缺乏连通性而感到沮丧
    • Limited access to self-service infrastructure

      自助服务基础设施的访问权限有限
    • Finding the right DevOps skillset

      找到合适的DevOps技能组
    • Difficulty managing the complexity of multiple services and environments

      难以管理多种服务和环境的复杂性
    • Lack of urgency/budget

      缺乏紧迫感/预算
    • Limited support from executive leadership

      行政领导的支持有限
    • A mix of legacy (brownfield) and modern (greenfield) applications. This created complexity in terms of deployment strategies and endpoints, toolchain, etc.

      遗留(棕地)和现代(未开发)应用程序的混合。 这在部署策略和端点,工具链等方面造成了复杂性。
    • Struggles with siloed teams that could not collaborate as expected

      与无法按预期进行协作的孤立团队作斗争
    • Large portion of testing is manual, which slows things down

      测试的大部分是手动的,这会减慢速度

    Scaling is about cost. In DevOps we define it as the unit cost of delivering value to a customer.

    扩展与成本有关。 在DevOps中,我们将其定义为向客户交付价值的单位成本。

    赞! (YIKES!)

    Executing a successful DevOps transformation isn’t without its challenges. Organizations and software products vary in maturity and implementation, making transformation efforts difficult to design and deploy across teams and organizations. Most importantly, in order to truly deliver DevOps value, it must include more than just tooling and automation — so simply purchasing and installing a solution isn’t sufficient.

    成功地进行DevOps转换并非没有挑战。 组织和软件产品的成熟度和实施各不相同,因此很难在团队和组织之间设计和部署转换工作。 最重要的是,为了真正实现DevOps的价值,它不仅需要工具和自动化,还必须包括其他内容-因此,仅仅购买和安装解决方案是不够的。

    解决方案 (The Solution)

    So how do we solve this problem? We solve it with Ephemeral & Multi-Dimensional Pipelines!

    那么我们如何解决这个问题呢? 我们用临时和多维管道解决它!

    Say wut?

    说w

    As the term implies, an Ephemeral Pipeline is a short-lived pipeline. That may seem counter-intuitive, but consider this. The best way to honour DevOps is to make Git a first-class citizen. This means defining everything as code, including the definition of the Pipeline itself. If the pipeline is defined as code, we can create and destroy it as many times as we’d, and will still get the same pipeline and same behaviour in the pipeline each time we recreate it.

    顾名思义,临时管道是短命的管道。 这似乎违反直觉,但请考虑一下。 尊重DevOps的最好方法是使Git成为一流的公民。 这意味着将所有内容都定义为代码,包括管道本身的定义。 如果将管道定义为代码,则我们可以创建和销毁它的次数不限,并且每次重新创建它时 ,管道中仍将获得相同的管道和相同的行为。

    The pipelines are multi-dimensional, because we have pipelines for Development, QA, and Ops. The pipelines operate independently and orthogonally to each other.

    管道是多维的,因为我们有用于开发,质量保证和运营的管道。 管线独立且彼此正交地操作。

    This means that the QA team will write their test automation code, and will have their own DevOps pipeline independent of what the dev team does. All they need from the dev team is the release binary that needs to be tested.

    这意味着质量保证团队将编写他们的测试自动化代码,并将拥有自己的DevOps管道,而与开发团队的工作无关。 开发团队所需要的只是需要测试的发行二进制文件。

    Similarly, the Ops team will have some automation code to deploy the (tested) release binary into Prod.

    同样,Ops团队将拥有一些自动化代码,以将(经过测试的)发行版二进制文件部署到Prod中。

    Since Git is a first-class citizen, it means that it’s important to get your Git game on. Remember that in an Enterprise DevOps setting, you’re also having to deal with some high coordination costs across different dev teams just to get your code out the door! If you’ve ever worked in a large enterprise setting, you know what I mean. If you haven’t, then lucky ducky!

    由于Git是一流的公民,因此这意味着启动Git游戏非常重要。 请记住,在企业DevOps设置中,您还必须处理不同开发团队之间的高昂协调成本 ,只是为了使您的代码行不通! 如果您曾经在大型企业环境中工作过,那么您就会明白我的意思。 如果您还没有,那么幸运小鸭!

    Because of these high coordination costs, there needs to be a way to minimize noise from other teams working on the same application code simultaneously for a future release, while maintaining your sanity. That’s why Ephemeral Pipelines go hand-in-hand with Ephemeral Release Forking. In a nutshell, Ephemeral Release Forking allows you to work in an isolated fork (representing the release you’re working on) of your application code until the release package is deployed into Prod. And as part of that fork, you have an accompanying pipeline. Once your release has gone into prod, you can merge your fork into the Golden Repo and nuke your pipeline. Because your pipeline has been codified, you can recreate it for your next release. For more info, check out Part 1 and Part 2 of the Ephemeral Release Forking posts.

    由于这些高昂的协调成本,因此需要一种方法,在保持您的理智的同时,最大限度地减少其他团队在同一应用程序代码上同时为将来的发行而带来的噪声。 这就是为什么临时管道与临时发布分支并驾齐驱的原因。 简而言之, Ephemeral Release Forking允许您在应用程序代码的独立分支(代表您正在处理的发行版)中工作,直到将发行包部署到Prod中为止。 作为分支的一部分,您将拥有一个随附的管道。 将发行版发布到产品中后,您可以将fork合并到Golden Repo中,并核对管道。 因为您的管道已被编码,所以您可以在下一个版本中重新创建它。 有关更多信息,请查看临时发行分叉文章的第1部分第2部分

    Want to learn more about Ephemeral & Multi-Dimensional Pipelines, and scaling DevOps at the enterprise? Be sure to follow us for more DevOps and SRE goodies!

    想更多地了解临时和多维管道,以及在企业中扩展DevOps? 请务必关注我们以获取更多DevOps和SRE好东西!

    翻译自: https://medium.com/dzerolabs/how-to-fix-your-broken-enterprise-devops-145be3d52ae2

    企业devops持续集成

    展开全文
  • DevOps 持续集成 - Jenkins + Gitlab一、DevOps 概述1.1 持续集成1.2 持续交付1.3 持续部署二、部署 Jenkins2.1 安装 JDK2.2 安装 Jenkins2.3 Jenkins 配置优化① JVM内存优化② 插件源优化2.4 启动 Jenkins① 解锁 ...

    更新时间:2021年5月24日


    一、DevOps 概述

    DevOps(Development和Operations的组合词)是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。通过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠

    1.1 持续集成

    在开发工程中可以频繁的将代码部署并集成到服务器进行自动化测试

    1.2 持续交付

    在持续集成的环境基础之上,将代码部署到预生产环境

    1.3 持续部署

    在持续交付的基础上,把部署到生产环境的过程自动化

    持续部署和持续交付的区别在于最终部署到生产环境是自动化的

    二、部署 Jenkins

    Jenkins是一款基于Java编写的开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件

    2.1 安装 JDK

    yum -y install java-1.8.0-openjdk*
    

    2.2 安装 Jenkins

    国内下载源:清华源

    cd /opt
    
    #如果下载较慢可以尝试scp上传
    curl -o /opt/jenkins-2.277.4-1.1.noarch.rpm https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.277.4-1.1.noarch.rpm
    
    #使用版本为最新的LTS稳定版
    rpm -ivh jenkins-2.277.4-1.1.noarch.rpm
    

    2.3 Jenkins 配置优化

    ① JVM内存优化

    cd /etc/sysconfig
    cp -p jenkins{,.bak}
    
    sed -i "47c JENKINS_JAVA_OPTIONS=\"-server -Xms1024m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m -Djava.awt.headless=true\"" jenkins.bak
    
    cat jenkins.bak > jenkins
    

    ② 插件源优化

    cd /var/lib/jenkins/updates
    
    cp -p default.json{,.bak}
    
    sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json.bak
    
    cat default.json.bak > default.json
    

    2.4 启动 Jenkins

    systemctl start jenkins
    
    netstat -natp | grep java
    

    ① 解锁 Jenkins

    根据提示的路径查看密钥

    cat /var/lib/jenkins/secrets/initialAdminPassword
    

    ② 选择插件安装

    如果不知道该如何选择可以点击安装推荐的插件
    如出现插件安装失败多重试几次即可

    2.5 安装 Git

    yum -y install git
    

    2.6 配置 Git

    #配置git使用用户
    git config --global user.name "fox"
    #配置git使用邮箱
    git config --global user.email "***@qq.com"
    #配置git语法高亮
    git config --global color.ui true
    
    git config --list
    

    2.7 初始化 Git

    mkdir /work
    cd /work
    git init
    

    git status
    

    三、部署 Gitlab

    GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目

    3.1 安装 Gitlab

    官方下载源:https://packages.gitlab.com/gitlab/gitlab-ce

    yum install -y policycoreutils-python
    
    #YUM安装[不推荐]
    curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
    
    yum install gitlab-ce-13.12.0-ce.0.el7.x86_64
    
    #RPM安装
    rpm -ivh gitlab-ce-13.12.0-ce.0.el7.x86_64.rpm
    

    3.2 Gitlab 初始化

    gitlab-ctl reconfigure
    gitlab-ctl stop
    

    3.3 Gitlab 配置优化

    ① 修改仓库地址

    vim /var/opt/gitlab/gitlab-rails/etc/gitlab.yml
    

    ② 优化内存占用

    vim /etc/gitlab/gitlab.rb
    
    #设置站点地址
    external_url 'http://192.168.0.200'
    #进程超时时间
    unicorn['worker_timeout'] = 60
    #减少进程数
    unicorn['worker_processes'] = 10
    #进程内存限制
    unicorn['worker_memory_limit_min'] = "200 * 1 << 20"
    unicorn['worker_memory_limit_max'] = "300 * 1 << 20"
    #减少数据库缓存
    postgresql['shared_buffers'] = "256MB"
    #减少数据库并发量
    postgresql['max_parallel_workers_per_gather'] = 0
    #关闭监控monitor
    prometheus['monitor_kubernetes'] = false
    
    egrep -v "#|^$" /etc/gitlab/gitlab.rb
    
    #启动gitlab
    gitlab-ctl start
    

    四、Jenkins + Gitlab + Nginx 自动化部署

    4.1 生产环境

    主机IP地址软件包
    Jenkins192.168.0.100Jenkins Git
    Gitlab192.168.0.200Gitlab
    Web192.168.0.10Nginx Git

    4.2 Nginx 部署

    Shell 一键部署脚本

    #!/bin/bash
    yum -y install git pcre pcre-devel zlib zlib-devel gcc gcc-c++ make
    
    useradd -M -s /sbin/nologin nginx
    
    wget -P /opt http://nginx.org/download/nginx-1.12.0.tar.gz
    
    cd /opt
    tar zxvf nginx-1.12.0.tar.gz
    
    #配置伪装数据
    cd /opt/nginx-1.12.0/src/core
    cp -p nginx.h{,.bak}
    sed -i '13c #define NGINX_VERSION      "=)"' nginx.h.bak
    sed -i '14c #define NGINX_VER          "*Do you want have a bad time" NGINX_VERSION' nginx.h.bak
    cat nginx.h.bak > nginx.h
    
    cd /opt/nginx-1.12.0
    
    ./configure \
    --prefix=/usr/local/nginx \
    --user=nginx \
    --group=nginx 
    
    make -j && make install
    
    ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/nginx
    ln -s /usr/local/nginx/conf/nginx.conf /etc/nginx.conf
    
    echo '
    [Unit]
    Description=nginx
    After=network.target
    [Service]
    Type=forking
    PIDFile=/usr/local/nginx/logs/nginx.pid
    ExecStart=/usr/local/nginx/sbin/nginx
    ExecReload=/bin/kill -s HUP $MAINPID
    ExecStop=/bin/kill -s QUIT $MAINPID
    PrivateTmp=true
    [Install]
    WantedBy=multi-user.target' > /lib/systemd/system/nginx.service
    
    
    chmod 754 /lib/systemd/system/nginx.service
    
    systemctl start nginx.service
    systemctl enable nginx.service &> /dev/null
    
    
    systemctl restart nginx
    
    ss -tnlp | grep "nginx" &> /dev/null
    if [ $? -eq 0 ];then
       echo "Nginx部署完毕!"
    fi
    
    

    ① Nginx 配置优化[可选]

    cd /usr/local/nginx/conf/
    cp -p nginx.conf{,.bak}
    
    #获取CPU核心数量
    CPU=`cat /proc/cpuinfo | grep -c "physical id"`
    
    #开启性能优化
    sed -i '12a\\    use epoll;' nginx.conf.bak
    #开启伪装
    sed -i '20a\\    server_tokens on;' nginx.conf.bak
    #设置工作线程
    sed -i "3c worker_processes  $CPU;" nginx.conf.bak
    #开启网页压缩
    sed -i -e '35 s/#//g' -e '35a\\    gzip_min_length 1k;' -e '35a\\    gzip_buffers 4 16k;' -e '35a\\    gzip_http_version 1.1;' -e '35a\\    gzip_comp_level 6;' -e '35a\\    gzip_vary on;' -e '35a\\    gzip_types text/plain application/x-javascript text/css image/jpg image/jpeg image/png image/gif application/xml text/javascript application/x-httpd-php application/javascript application/json;' nginx.conf.bak
    #开启防盗链
    sed -i -e '50a\\tlocation ~* \\\.(jpg|gif|swf)$ {' -e '50a\\t    valid_referers none blocked *.benet.com;' -e '50a\\t    if ( $invalid_referer ) {' -e '50a\\t    rewrite ^/ http://www.benet.com/error.png;' -e '50a\\t    }' -e '50a\\t    root   html;' -e '50a\\t    expires 1d;' -e '50a\\t}' nginx.conf.bak
    
    cat nginx.conf.bak > nginx.conf
    

    4.3 Jenkins 插件安装

    • Build Authorization Token Root
    • Publish Over SSH
    • Gitlab Authentication
    • Gitlab Hook
    • Gitlab
    • Git Paramete



    4.4 Jenkins 密钥认证

    将公钥分发到Gitlab服务器

    #全部回车
    ssh-keygen -t rsa
    


    将公钥传给 Web 服务器

    ssh-copy-id 192.168.0.10
    

    查看公钥

    cat /root/.ssh/id_rsa.pub
    

    ① Gitlab新增SSH公钥

    打开 Gitlab http://192.168.0.200


    将 Jenkins 中的公钥插入其中 cat /root/.ssh/id_rsa.pub

    ② Jenkins 拉去代码认证

    cat /root/.ssh/id_rsa
    

    打开 Jenkins http://192.168.0.100:8080

    添加凭证




    ③ Jenkins 集成 Gitlab

    打开 Gitlab http://192.168.0.200


    密钥一定要保存好

    打开 Jenkins http://192.168.0.100:8080
    添加新的凭证

    修改全局配置


    ④ 添加 SSH 服务器

    打开 Jenkins http://192.168.0.100:8080


    Jenkins查看Key cat /root/.ssh/id_rsa


    4.4 构建任务

    打开 Jenkins http://192.168.0.100:8080

    创建一个新项目


    打开 Gitlab http://192.168.0.200

    创建一个新项目



    打开 Jenkins 项目选择源码管理,并勾选 git
    /
    配置构建触发器

    Target branch Regex 目标分支正则表达式

    生成WebHooks安全令牌

    WebHooks是一种微服务API
    通过自定义回调函数的方式来改变Web应用的一种行为


    Source file 源文件地址 ,这里表示仓库中当前分支的所有代码
    Remove prefix 指定要删除的目录
    Remote directory 指将当前分支的代码所要部署的目录
    Exec command 指代码部署后执行的指令,一般为重启服务


    打开 Jenkins 项目 http://192.168.0.200/root/demo

    选择设置 WebHooks

    将刚才在 Jenkins 的key复制到这里

    4.5 开始测试

    传数据至gitlab

    cd /work
    git clone git@192.168.0.200:root/demo.git
    cd demo
    echo "Hello World" > index.html
    git add index.html
    git commit -m "add index.html"
    git push
    

    ① 通过 WebHooks 构建


    返回 HTTP 200 成功

    ② 通过 Jenkins 构建


    打开 Jenkins 项目进行构建

    查看 Web 服务器文件

    五、报错排查

    ① webhook Hook executed successfully but returned HTTP 422

    HTTP 422 请求格式正确,但是由于含有语义错误,无法响应

    解决方法:检查WebHooks地址是否正确

    ② Hook executed successfully but returned HTTP 404

    请求页面没用找到
    解决方法:前往gitlab配置勾选 Enable authentication for '/project' end-point

    ③ Error 403 No valid crumb was included in the request

    关闭跨站请求伪造保护,高版本jenkins取消了这个机制的关闭,这里直接对配置文件进行修改

    解决方法:

    vim /etc/sysconfig/jenkins
    
    47行 修改为
    JENKINS_JAVA_OPTIONS="-server -Xms1024m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m -Djava.awt.headless=true -Dhudson.security.csrf.G    lobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
    
    systemctl restart jenkins
    

    ④ Failed to connect to repository : Error performing git command: git ls-remote -h

    缺少软件包Git
    解决方法:需要安装Git,并进行初始化,步骤参考章节2.5

    ⑤ Urlis blocked: Requests to the local network are not allowed

    Gitlab默认禁止内网通信
    解决方法:打开管理员设置 -> 网络

    展开全文
  • 一些常用的小功能,用了各种各样的脚本编写,实现持续集成自动化部署的脚本,因业务所限,仅供参考!一些常用的小功能,用了各种各样的脚本编写,实现持续集成自动化部署的脚本,因业务所限,仅供参考!
  • Azure DevOps CI/CD(一):初步 ...CI(持续集成Continuous Integration)简单理解就是程序员提交代码后立即进行构建,测试。可以通过构建测试的结果看到代码是否可以跟原代码集成合并。 CD(持续

    Azure DevOps CI/CD(一):初步

    CI/CD

    看到这篇文章的你应该已经对CI/CD已经有一个比较大概的印象,所以在这里我也就大概的说一下概念性的东西就OK了。随着现在软件工程,互联网的发展,软件的规模,架构,面对的业务场景等都越来越复杂,用户对软件服务的要求也越来越高。因此软件也必须得用更快的速度去编码,构建,测试。

    CI(持续集成Continuous Integration)简单理解就是程序员提交代码后立即进行构建,测试。可以通过构建测试的结果看到代码是否可以跟原代码集成合并。

    CD(持续部署Continuous Delivery)也叫持续交付,持续部署在持续集成的基础上把构建,测试通过的代码打包部署到内部测试环境或者正式的环境中。

    有了CI/CD我们就可以更专注于业务代码的编写,实现提交代码自动构建,测试,部署,然后就能在线上环境看到自己的更改了。

    Azure DevOps

    Azure DevOps对开源项目免费开放,可谓是个人开发者的福音

    一些基础的介绍就到这了,这篇文章主要是给大家介绍微软的Azure DevOps工具,虽然在国内的互联网大环境黑微软就是政治正确,但是这并不能否认Azure DevOps本身是一款出色的CI/CD工具。

    当时我主要是想要找一款CI/CD的工具,用过AppveyorTravisCi但是都因为各自的编译环境问题需要配合一起来使用,Jenkins又需要安装配置较麻烦。最后找到了Azure DevOps直接在网页就能完成操作,当时听说开源项目免费就马上在自己的项目用起来。然后就离不开了,当然微软自家的东西跟dotnet core框架和Azure云服务的集成度肯定会更高,也更好。看VS IDE就知道微软全家桶有多香。

    Azure DevOps也不单止对自己的框架和服务适用,对javanode.jspythonwebpackdockerk8sAzure云服务等都有很好的支持。在Azure DevOps中每一个步骤执行的动作都是由插件来执行,也就是说我们也可以开发自己的插件来执行自己希望的CI/CD过程,并且发布出来给更多人使用。

    开始使用Azure DevOps

    本文章暂时只讲解持续集成,持续部署的在第二篇文章进行讲解

    下面我们就来开始使用Azure DevOps来帮我们完成CI的工作。

    首先登陆Azure DevOps官网可以使用github账号登陆。

    在这里插入图片描述

    然后就来到了主页,我这里因为之前已经有些项目是已经集成了Azure DevOps所以界面上面就有很多的项目,如果是刚开始使用的这个界面就是一片空白,只有左边的组织,刚注册都是默认有一个组织。

    废话不多说,如何把我们github或者在其他源码管理器的代码跟Azure DevOps集成来完成CI/CD呢?

    新建项目

    点击主页的右上角蓝色图标New project

    在这里插入图片描述

    点开后可以看到屏幕右边有一个Create new project的弹窗,输入一个项目名称,随意就好不一定要跟github上面的项目名称一样的。

    Visibility中选择Public开源项目,然后点击Create,完成后就会看到下面的界面:

    在这里插入图片描述

    左边栏是Azure DevOps的重要组成部分,有BoardsReposPipelinesTest PlansArtifacts。其中的Pipelines(管道)将是我们接下来用得最多,最最重要的部分。

    添加管道

    在这过程中可能有很多不理解的地方,没关系跟着做就好了。在后面我会解释这些概念性的问题。

    鼠标移动到左边栏的Pipelines中,在二级菜单中选择Pipelines,如下图:

    在这里插入图片描述

    然后在新的页面中点击Create Pipeline

    在这里插入图片描述

    接着就会来到下面这个界面:

    在这里插入图片描述

    这里对应选择就行了,我是用的github项目,所以我在这里就选择github

    在这里插入图片描述

    这里就会列出你github上面所有的项目,这里选择随便选择一个然后继续下一步。

    在这里插入图片描述

    上面需要在github中授权一下,然后就会返回到Azure DevOps中继续下一步配置了。Azure DevOps会自动分析项目结构,然后找到最适合的项目构建,测试配置。由于我这里的项目是一个asp.net core用例项目和C#类库项目,所以分析结果就像下图:

    在这里插入图片描述

    由于我项目主要还是类库项目,asp.net core只是用来测试一些库。所以我这里是选择的.NET Desktop配置。

    选择后就会跳到预览界面,预览刚刚选择的配置的配置文件,如下图:

    代码项目和Azure DevOps集成后会在根目录生成一个azure-pipelines.yml文件,这个文件就是现在要预览的代码。

    在这里插入图片描述
    可以看到右边那个列表,那个列表就是插件,Azure DevOps中有非常多的插件,大到对代码的构建,测试,部署用插件,小到复制,移动文件,解压文件用插件。SSH连接也是用插件。

    在这里插入图片描述

    让我们一起来看看上图的代码做了些什么工作。

    • trigger:在master分支上设置触发器,当master分支提交时出发这个脚本

    • pool:设置一个windows的镜像

    • variables:设置方便下面操作的变量

    • steps:步骤

    • task:task是在steps里面,一个steps可以有多个task,每个task按顺序执行。

    上图的task首先安装一个nuget工具为还原做准备,然后使用nuget还原*.sln解决方案(项目),然后用vs build构建项目,最后使用vs test来搜索测试项目并运行测试。

    上面的task其实可以理解为最小单元了,在上面自动生成的yml文件中每个的task其实我们也是可以在右边的插件栏去搜索关键字VS来找到,并完成配置,并添加到yml配置文件中,所有这些操作都是可以在可视化的界面下去进行的,所以非常的友好。yml预览只是给我们更精确的控制脚本而已,更多时候都是通过图形化的搜索插件,配置并自动添加插件到yml文件来完成。

    检查没问题过后就可以按右上角的Save and run按钮,弹出下面的窗口:

    在这里插入图片描述

    Azure DevOps有两种方式添加azure-pipelines.yml文件到我们的项目中,一种是直接提交到master分支,另一种是创建一个新的分支以手动PR或者自动PR的方式来添加。这里看个人喜好,如果不想污染master就创建新分支,在新分支测试没问题后再PR到master

    我个人是选择了创建新分支,然后Save and run

    然后在左边栏Pipelines里可以看到刚新建的管道了,并且管道已经在自动运行,点击进去就能看到实时的运行日志

    在这里插入图片描述

    在这里插入图片描述

    当全部任务都绿色打勾就是执行成功了,构建成功后你会收到一封构建成功的邮件,里面有详细的构建信息。如果中间任何一个任务出现错误整个构建将会中止并且会通过注册的邮件通知你。

    在这里插入图片描述

    总结

    到这里CI的过程就结束了,这篇文章只能够说作为一个Hello World式的讲解,我们也还没对自动生成的CI脚本进行任何的修改,也没有对构建后进行打包,更没有进行CD。这些更深入的我将会在接下来的几篇文章里都一一讲解。


    个人公众号,欢迎关注。天天更新是不可能的,这辈子都不可能天天更新。只有心情好的时候更新一下这样子才维持的了生活。
    在这里插入图片描述

    展开全文
  • 关于实施DevOps持续集成的整理

    千次阅读 2018-03-22 15:13:13
    第一部分:实施DevOps的八个常见步骤https://www.tuicool.com/articles/QbueymE Gartner的研究主管...这个不确切的目标状态导致许多IT部门犹豫不决、不敢实施DevOps策略。”虽然没有一系列具体的所需阶段,但Spaffo...

    第一部分:实施DevOps的八个常见步骤

    https://www.tuicool.com/articles/QbueymE 

    Gartner的研究主管George Spafford说:“由于缺少标准的定义和方法,处于不断发展中,需要接受和管理风险,DevOps对传统IT思维提出了挑战。这个不确切的目标状态导致许多IT部门犹豫不决、不敢实施DevOps策略。”

    虽然没有一系列具体的所需阶段,但Spafford建议基础设施及运营(I&O)领导人可以遵循这八个基本步骤来搞好DevOps项目。

    1. 确定业务理由

    DevOps项目要关注业务需求,而不是“纯粹为了DevOps搞DevOps”,避免方法和工具变得比客户需求还重要。企业要避免这个常见的错误:还没有明确搞DevOps项目的业务理由,就贸然上马。

    Spafford解释到:“比如说,先从业务价值入手,问问DevOps能带来什么,而不是专注于发布速度、更快地完成工作。理由可能是‘通过提升发布速度,我们能够更快地创新,从而支持销售和营销部门使用移动应用进行订购。’最成功的企业希望通过DevOps获得业务的好处。”

    2. 为所在企业定义DevOps

    Gartner对DevOps下的定义是:这是一种使用敏捷方法、协作和自动化交付解决方案的业务驱动方法。能以所在企业易懂的措辞来定义目标状态显得很重要。为项目挑一个标签,提供员工认同和支持的一个“标语”,这有助于员工参与进来。这个定义应简短、明确重点,并支持业务理由。

    3. 选择“先行者”应用软件

    别指望一个步骤就部署好DevOps。DevOps要迭代式部署,每次同时满足这三个要素:

    • 友好的环境:这意味着大家愿意使用先行者应用软件,真心尝试项目。
    • 可接受的价值:先行者应用软件要提供足够的价值以赢得信誉和批准,以便继续下去。
    • 可接受的风险:由于DevOps方面的不确定性,许多人认为它风险很高,害怕开始入手。企业应指出风险可接受的机会,因为IT、运营、开发、信息安全,法规遵从和审计等部门的每个人都要学习。

    Spafford说:“DevOps主要用于敏捷开发以及不确定性相当大的场景(比如机器学习和物联网),但由于DevOps理念可以广泛应用,所以会有引入这套概念的其他机会。然而,最初运用于创新的系统通常比较好,因为现有功能可能无法支持像大数据、机器学习和物联网这些项目。”

    4. 确定初始团队

    人员是成功的DevOps项目的主要因素。挑选初始团队的成员时,要注重行为而不是注重技能。教技术技能比教正确行为来得容易――错误的行为会使DevOps工作偏离正常进程。物色优秀的团队成员,要聪明、有干劲,了解风险,致力于终生学习,还能适应新的工作方式。

    5. 确立目标和度量指标

    因为人员是DevOps项目中最重要的因素,了解和实施合适的激励措施至关重要。Spafford说:“在许多传统企业,目标由各部门确立,IT度量指标落实到位,以解决问题,奖励解决问题的人员。”

    “在DevOps项目中,目标要由团队确立,并与下达给团队的业务目标保持一致。DevOps团队成员要认识到他们都有同一个目标,度量指标和激励措施要鼓励团队合作以实现业务目标,而不是度量指标强化风险规避和解决个别问题。”

    6. 专注于限制因素

    I&O领导人应找出限制生产能力的最大瓶颈。开发新的和变更的系统,并转移到生产环境中,这个生命周期会带来最大的限制因素,因而限制生产能力。如果专注于这个最大的限制因素,DevOps团队就能系统地识别什么在阻碍所需的工作节奏,并克服这个瓶颈。

    7. 开发工具链

    实施DevOps的总体目标包括一套集成的工具链,支持合理地评估和选择工具,以便每个工具都与应用程序生命周期中的相邻工具松散耦合。连接所有的自动化接触点和信息流可借助工具链来加快版本的发布,同时减少错误、缺陷、返工和停运。这将让在每个阶段使用的工具得以保持一致,便于了解在阶段内和阶段之间哪个地方需要实现自动化、集成和工具转换。

    8. 准备好后扩展

    太多的公司犯这样的错误:开始DevOps之前就需要扩展,以便获得批准。这导致了恶性循环。因为他们不知道如何扩展DevOps,所以无法开始。而由于他们无法开始,就无法摸索并搞清楚如何扩展。

    Spafford建议:“切莫还没有准备好就试图扩展,结果让靠谱的DevOps项目偏离正道。”

    “相反,把团队召集起来,开始朝着似乎最有意义的方向前进,克服遇到的限制因素。人员、技术和流程方面一定要循序渐进。带来技术债务是不可避免的,而管理这种债务是新模式的一部分。”

    第二部分:持续集成工作中的标准规范

    https://www.tuicool.com/articles/QRfMrmB

    01

    概述

    持续集成是软件工程领域中的一种最佳实践,即鼓励研发人员频繁的向主干分支提交代码,频率为至少每天一次。每次提交都触发完整的编译构建和自动化测试流程,缩短反馈周期,出现问题第一时间进行修复,从而保证软件代码质量,减少大规模代码合并的冲突和问题,让软件 随时处于可发布状态 。

    02

    成熟度评估

    首先针对企业当前的持续集成(集成服务、集成频率、集成方式、反馈周期)做一次成熟度评估,了解所处的持续集成阶段,并有针对性的制定持续集成目标和改造计划。

    03

    持续集成前提条件

    在开始持续集成之前,需要先做好以下事情,以让持续集成能够更加有效。

    1. 频繁提交

    研发人员至少每天一次的将代码提交到主干上。

    2. 全面的自动化测试套件

    单元测试用于单独测试应用程序中某些小单元的行为(比如一个方法、一个函数, 或一小组方法或函数之间的交互)。

    单元测试应该运行得非常快,即使对于一个大型应用来说,整个单元测试套件也应该在十分钟之内完成。 

    3.  保持较短的构建和测试过程

    理想情况下,提交前的预编译和测试过程,以及持续集成服务器上的编译和测试过程应该都能在几分钟内结束。我们认为,十分钟是一个极限了,最好是在五分钟以内,九十秒内完成是最理想的。

    测试需要划分阶段,第一个阶段用于编译软件,运行所有类级别的单元测试,并创建用于部署的二进制文件。这个阶段叫做“提交阶段”。

    第二个阶段应该利用第一个阶段所生成的二进制文件进行验收测试、集成测试。假如你有性能测试的话,也要一并运行。

    4. 管理开发工作区

    开发环境的管理目标:

    1. 当开发人员刚开始新任务时,应该总是从一个已知正确的状态开始。

    2. 开发人员应该能够运行构建、执行自动化测试,可以在开发机上部署其开发的应用程序。只有在特殊的情况下,才应使用共享环境开发。

    3. 在本地开发环境上运行应用程序时,应确保所使用的自动化过程与持续集成环境、测试环境、生产环境中一致。

    达到这一目标,需要做以下事项:

    1. 第一个先决条件就是细心的配置管理,将源代码、测试数据、数据库脚本、构建脚本和部署脚本放在版本控制库中。当编码开始时,应该以它们“最新的正确版本”作为起点。“最新的正确版本”是指那个在持续集成服务器上最近一次通过所有自动化测试的那个版本。

    2. 其次是确保第三方依赖的配置管理(开发中所用的库文件和组件)的版本与正在开发的源代码的版本是相互匹配的。对于大部分项目来说,其所依赖的第三方库文件的版本不会经常发生改变,所以最简单的方法就是将这些库文件随你的代码一起提交到版本控制库中。

    3. 最后就是确保自动化测试(包括冒烟测试)都能够在开发机上运行。让开发人员于每次提交前在自己的开发机上将应用程序运行起来,并在其上跑一遍冒烟测试,可以大大改善应用程序的质量。

    04

    持续集成时间理论

    持续集成工作流一般是研发先进行提交前操作,然后提交变更代码到版本管理库。促发持续集成服务器拉取代码后进行构建和测试,将构建和测试结果反馈回开发,最后促发自动部署(持续发布的内容)。本章以工作流为顺序介绍持续集成中的最佳实践。

    1. 提交前工作

    首先查看当前构建服务器上是否有构建在运行。如果有的话,你要等它运行完。如果它失败了,你要与团队中的其他人一起将其修复。

    一旦当前构建完成且测试全部通过,开发人员需要从源码管理系统里签出或者克隆最新的代码到本地开发机器。随后,开发人员继续基于主干分支创建出一个新的功能分支。该分支将专门用于引入仅在新功能范畴内的更改。

    建议开发人员经常保持他们的代码和主干代码分支的内容同步。该步骤将会把主干分支的变更带到功能分支,所以除了自己的功能代码之外,开发人员总是使用主干分支代码的最新副本。一般来说,每个开发者至少每天将主干分支同步一次到他们的功能分支。

    开发人员开发新功能不仅仅有功能的变动,还应该包括新代码的单元测试。

    开发人员必须在在自己的开发机上执行构建脚本,运行测试,以确保在你机器上的所有代码都工作正常。如果这些测试或者代码本身编译失败的话,必须修复这些集成问题。

    2. 提交变更

    当开发人员准备提交时,应该从版本控制库中签出代码,更新一下本地的项目副本,然后做一下本地构建,并运行提交测试。只有当全部成功以后,开发人员才能将代码提交到版本控制库中。

    提交过程是一件轻量级的事儿,保证可以每隔二十分钟左右提交一次。但同时为保证新增的代码的确是按期望的方式运行的,提交前需确保在本地运行一次提交测试,做一下健全性检查(sanity check)。

    提交前运行本地测试有以下两个好处:

    1. 如果在你根据版本控制进行更新之前,其他人已经向版本控制库中提交了新代 码,那么你的变更与那些新代码合并后,可能会导致测试失败。如果你自己先在本地更新代码并运行提交测试的话,假如有问题,就会在本地提前发现,提前修复,从而不会令持续集成服务器上的构建失败,不至于影响其他人及时提交。

    2. 在提交时经常犯的错误是,忘记提交那些刚刚新增加的东西到存储库中。如果遵守这个流程的话,当本地构建成功,而持续集成系统中的提交阶段失败了的话,那 么你就知道要么是由于别人与你同时提交了代码,要么就是你遗漏了一部分类或配置文件没有提交到版本控制系统中。 

    遵循这样的实践可以确保状态一直是正常的。

    代码提交入库前可以通过添加代码检查来提高代码质量。将静态分析工具和人工审核配合实施,自动化的审查工具扩展了以人为之的复查,由于代码变的越来越长,越来越复杂,所以自动化的审查就变得很有必要。自动化代码审查的优点在于,当进行人工复查时,这个过程会变得更有效,因为代码的底层细节已经通过了扫描检查。人工复查可以关注哪些自动化工具不能处理的方面,注入代码时候满足需求,是否从长远来看易于维护等。

    3. 代码拉取

    持续服务器会负责从源码管理拉取最新的代码。这可以借助poll或者push机制实现。

    使用poll机制的话,持续集成服务器会配置一个源码管理服务器的位置,以及它的安全证书。它会根据一个时间间隔定期地轮询指定位置,以检测是否有发生任何新的签入以及代码变更。一旦检测到有变更,它会从源码管理服务器下载代码最新的副本到本地磁盘。

    使用push机制的话,源码管理系统会配置一个“钩子”指到持续集成服务器。当开发人员提交了一个变更到仓库时,之前配置的钩子将会被调起,而它会让持续集成服务器知道,这里发生了一次变更。

    4. 构建

    源代码一般是自包含构建的,即持续集成流程所需的构建脚本是放在源码仓库里的。正如在之前的步骤里详细介绍的那样,一旦最新的代码被拉取下来,一个捆绑好的脚本将会被用来触发该次构建。

    构建的类型分成三个层次:为个人的、为团队的、为用户(客户)的。开发者(或结对的开发者)执行私有构建,集成构建将整个团队的工作成果集成起来,发布构建为用户准备好软件。

    1. 私有构建

      如果在你根据版本控制进行更新之前,其他人已经向版本控制库中提交了新代 码,那么你的变更与那些新代码合并后,可能会导致测试失败。如果你自己先在本地更新代码并运行提交测试的话,假如有问题,就会在本地提前发现,提前修复,从而不会令持续集成服务器上的构建失败,不至于影响其他人及时提交。

    2. 集成构建

      在提交时经常犯的错误是,忘记提交那些刚刚新增加的东西到存储库中。如果遵守这个流程的话,当本地构建成功,而持续集成系统中的提交阶段失败了的话,那 么你就知道要么是由于别人与你同时提交了代码,要么就是你遗漏了一部分类或配置文件没有提交到版本控制系统中。 

    3. 发布构建

      发布构建准备好发布给用户的软件。持续集成的一个目标就是创建可以部署的软件。发布构建可能在一次迭代结束时进行,或在某个里程碑处进行,它可能包括更全面的性能测试和负载测试,并且必须包括所有的验收测试。

    并非所有的构建都是以同样的方式触发的。要根据构建的目标和频率来选择最合适的方式来触发某种构建。触发构建机制有以下4类思路:

    • 用户驱动: 由某人手工发起集成构建

    • 定期执行: 定期执行的过程由时间驱动,不论是否发生了变更。定期执行的活动适合下班后执行的过程比较合适。

    • 轮询变更: 一个进程以固定的时间间隔唤醒,从版本控制库中签出变更。如果检测到变更,它就执行集成构建。所有持续集成服务器都支持某种类型的“轮询变更”机制。

    • 事件驱动: 事件驱动与轮询变更类似,但不同的是,构建不是由持续集成工具来触发的,而是由版本控制库触发的,给予事先定义好的变更事件,如果版本控制库检测到变更,它将执行构建脚本。

    5. 构建

    在CI流程的这个阶段里,单元测试和集成测试将会被执行。一般来说,这些测试也会被打包到代码里。 

    针对基于Java ™实现的系统而言,这些测试会通过一个像JUnit这样的测试框架来执行,从而可以轻松模拟它们的一些测试依赖。某些编程技术可能有它们自己的测试运行框架,Spring的Spring Junit Runner,Java EE的Arquillian等。

    在CI服务器上运行测试主要有下面这些好处:

    1. 你曾经有没有遇到过这样的场景,这些测试在一台机器上是通过的,但是在其他机器上却失败了?通过在一台中央服务器上执行这些测试,我们可以消除一些测试环境方面的问题

    2. 针对每一次变更都会立即触发执行测试,而且如果有任何新的代码变更打破了预期的行为的话,你能够马上知道

    3. 大多数团队都是并行地在开发着许多功能,甚至可能一些团队成员也是分布在全球各地。每当开发人员提交代码到仓库时,任何故障都可以被识别出来并且立即修复。

    6. 反馈和通知

    在CI流程的最后,只可能存在两种结果的其中一种,要么构建和测试失败了,要么通过了。 

    每一次签入都会被验证并且确保它不会破坏现有的代码。代码在它被合并到主干分支后不久会被构建和测试。这将可以降低主干代码崩溃的频次。

    一般来说,CI服务器会配置成在遇到故障时发送邮件(发给团队里的每一个人或者仅仅单独抄送负责上一次签入的相关人员)。通过这种方式,可以快速知晓故障并且尽快采取更正措施。

    大多数CI服务器还会突出展示最近一些构建的状态而且最近几次构建的状态还会用红-绿-琥珀色指示灯来标明。举个例子,Jenkins,使用的是如下指示灯来显示构建的情况。

    05

    Java项目的持续集成实践

    1. 环境准备

    easyops平台搭建

    系统版本:centos 6.5~6.9

    推荐配置:

    2. 项目目录规范

    以maven标准目录结构为依据

    1. 源代码管理

      源代码统一放在src/main/java下。

      遵循Java实践,将文件放在以包名为目录名的目录中,每个文件保存一个类。

      生成的任何配置或圆数据都不应该放在src目录下,而应该放在target中。

    2. 测试管理

      将所有要测试的源代码都放在src/test/java目录中,单元测试应该放在与包名相对应的目录中。

    3. 构建输出管理

      在用maven做构建的时候,会把生成的代码、元数据文件都放在项目根目录中一个叫target的文件夹中。这样清除前一次构建结果只需要删除整个目录就可以了。

      可以把测试报告存储在/target/reports目录下。

    4. 库文件管理

      库文件的管理有几种不同的方法。

      · 完全交给工具来管理。

      · 把库文件(包括构建、测试和运行时必须的所有库文件)都提交到版本控制库,最常· · 见的是放在lib文件夹下。

      · 建立组织级的第三方依赖库,将所有项目需要的所有依赖库文件都放在其中。

    注意事项:

    上述目录,包管理系统前台默认根据模板自动创建,无需人工创建。

    若软件包有特殊类型文件则请建立文件夹存放,不得与已有文件类型混放。

    任何文件不得直接存放在软件包顶层文件夹。

    3. 版本控制服务器搭建

    git搭建

    4. 持续集成服务器搭建

    使用easyops平台一键部署java环境、maven环境和Jenkins到持续集成服务器。

    Jenkins v2.73.3 ,用于 Linux 平台,和 linux_jdk_1.8 搭配使用,默认启动端口 8500 ,默认密码admin:admin。

    使用easyops平台一键部署sonarqube(服务端)到持续集成服务器

    使用easyops平台一键部署sonarqube scanner(客户端)到持续集成服务器和各开发机。

    5. 流水线配置

    配置持续集成流水线。


    展开全文
  • 使用Azure DevOps持续集成GitHub项目

    千次阅读 2019-01-09 07:00:00
    点击蓝字关注我微软的Azure DevOps是一款软件开发管理工具,整合了需求、代码、编译、测试、发布等所有功能于一身。今天我们就来看看如何用Azure DevOps对自...
  • 1.获取数据源 Select a scurce 2.NuGet restore,如有自定义的包可以添加NuGet.config 3.BuildSolution。 (MSBuild Arguments :/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true...
  • GitLab+Jenkins实现Devops持续集成

    千次阅读 2019-05-16 15:32:50
    创建一个项目devops并设置该项目的Integrations 点击Add webhook 可以通过Test模拟Push测试 点击Push events之后查看Jenkins的任务,可以看到Jenkins任务已经被触发
  • 技术架构图-Devops 持续集成

    千次阅读 2019-01-27 13:26:45

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,879
精华内容 7,951
关键字:

devops持续集成