DevOps

DevOps 概述

DevOpsDevelopment和Operations的组合词)是一种重视 “ 软件开发人员(Dev)” 和 “ IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例;

通过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠

  • DevOps 平台

代码托管 --- Gitlab、SVN

项目管理 --- Jira、Teambition、禅道

运维平台 --- 腾讯蓝鲸、自主研发平台

持续交付 --- Jenkins、Gitlab

CI / CD 概述

CI

  • Continuous Integration

指多名开发在开发不同代码的过程中,可以频繁的将代码合并到一起并且互不影响

属于开发人员的自动化流程。成功的 CI 意味着应用代码的新更改会定期构建、测试并合并到共享存储库中

CD

  • 持续交付(Continuous Delivery)

  • 持续部署(Continuous Deployment)

指持续交付或持续部署,这些相关概念有时会交叉使用。两者都事关管道后续阶段的自动化,但它们有时也会单独使用,用于说明自动化程度

持续交付通常是指开发人员对应用的更改会自动进行错误测试并上传到存储库(如 GitHub 或容器注册表)

然后由运维团队将其部署到实时生产环境中

旨在解决开发和运维团队之间可见性及沟通较差的问题

因此,持续交付的目的就是确保尽可能减少部署新代码时所需的工作量

基本流程

代码提交后先部署到 test 环境,测试代码是否跑的正常,有无 bug -- 环境比较单一

测试完成后部署到 staging 环境,看程序是否正常 -- 与生产环境环境基本一直,数据都是从生产导出来的

验收后部署到 prod 环境

Git 仓库

分布式版本库

git是用于 Linux 内核开发的版本控制工具

与 CVS、Subversion 一类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可以运作版本控制,使得源代码的发布和交流极其方便

  • GitHub

    基于 git 的一个公有代码仓库

  • Gitlab

    基于 git 的一个私有代码仓库

GitLab 部署

wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.1.12-ce.0.el7.x86_64.rpm
# 在清华镜像站下载 gitlab-ce 的安装包
rpm -ivh gitlab-ce-12.1.12-ce.0.el7.x86_64.rpm
# 安装 gitlab-ce 的 rpm 包

[root@vida src]# vim /etc/gitlab/gitlab.rb 
# Please configure a URL for your GitLab instance by setting `external_url`
# 修改配置文件更改访问 URL 
[root@vida src]# gitlab-ctl reconfigure
# 重启更新配置
[root@vida src]# gitlab-ctl status
# 查看服务状态
# 邮箱配置
gitlab_rails['smtp_enable'] = true  #启用smtp服务
gitlab_rails['smtp_address'] = "mail.gmail.com" #smtp发送服务器
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "erikcloudops@gmail.com"
gitlab_rails['smtp_password'] = "123456lllu"
gitlab_rails['smtp_domain'] = "gmail.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
gitlab_rails['gitlab_email_from'] = 'erikcloudops@gmail.com' # 与 smtp_user_name 一定要一样
gitlab_rails['gitlab_email_reply_to'] = 'erikcloudops@gmail.com'
  • 关闭 sign up

    管理员权限登陆

    setting -- Sign-up restrictions -- 关闭 sign up enable

仓库配置

Git global setup

  • 配置全局的用户名和邮箱

git config --global user.name "vida"
git config --global user.email "vida@weexglobal.com"

Create a new repository

  • 创建一个新的仓库

git clone http://47.108.239.186/root/wallet.git
cd wallet
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master

Push an existing folder

  • 推送现有的文件

cd existing_folder
git init
git remote add origin http://47.108.239.186/root/wallet.git
git add .
git commit -m "Initial commit"
git push -u origin master

Push an existing Git repository

  • 推送现有的 Git 仓库

cd existing_repo
git remote rename origin old-origin
git remote add origin http://47.108.239.186/root/wallet.git
git push -u origin --all
git push -u origin --tags
  • 回滚版本

git reset --hard HEAD^
# 递归回滚,代码拉取到本地后回滚版本  HEAD^ HEAD^^ 回滚几个版本就加几个 ^ 号

Jenkins

Jenkins 概述

开源的 CI / CD 软件

用于各种自动化任务,包括构建,测试和部署软件

使用 JAVA 语言编写,起源于 Hudson

插件化,目前拥有 1500+ 插件实现各种功能

Jenkins 部署

Linux 安装

需要安装JDK环境

yum -y install java-1.8.0-openjdk
# 安装 openjdk ,1.8.0 以上
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/jenkins-2.343-1.1.noarch.rpm
# 下载 jenkins 安装包
rpm -ivh jenkins-2.343-1.1.noarch.rpm
# 安装
systemctl start jenkins 
# 启动
systemctl status jenkins
# 查看状态

Docker 安装

配置好 docker 环境

docker run \
  -u root \
  --rm \                                   # jenkinsci/blueocean 关闭时自动删除Docker容器
  -d \                                  # jenkinsci/blueocean 在后台运行容器(即“分离”模式)并输出容器ID
  -p 8080:8080 \ 
  -p 50000:50000 \ 
  -v jenkins-data:/var/jenkins_home \ 
  -v /var/run/docker.sock:/var/run/docker.sock \ 
  jenkinsci/blueocean 

解锁 Jenkins

/var/jenkins_home/secrets/initialAdminPassword
# 进入文件读取密码

Jenkins 拉取代码

Jenkins 从 Gitlab 拉取代码

  • Gitlab 添加服务器公钥

[root@vida ~]# ssh-keygen
# 生成一个秘钥
[root@vida ~]# cd /root/.ssh
[root@vida .ssh]# ls
authorized_keys  id_rsa  id_rsa.pub
# id_rsa 是私钥   id_rsa.pub 是公钥
  • 打开 Gitlab -- 设置 -- SSH keys -- 添加公钥

[root@vida ~]# yum -y install git
# 安装 git 测试
[root@vida opt]# git clone git@47.108.239.186:vida-test/my-vida.git
# git clone 不需要输入密码
​
# 只能作为只读使用,不能提交代码

测试拉取代码

  • 新建一个自由风格的项目

  • 源码管理选择 Git

  • 添加:Repository URL 和 Credentials

    Private Key 为 Jenkins 服务器的私钥

  • 创建好 Job 后,选择立即创建

    Started by user unknown or anonymous
    Running as SYSTEM
    ​
    Building in workspace /var/lib/jenkins/workspace/vida-devops
    # /var/lib/jenkins/workspace/vida-devops   Jenkins 服务器中查看拉取到的代码是否和 Gitlab 上一致
    ​
    The recommended git tool is: NONE
    using credential 7e07473f-ef7b-4c9d-beea-333aa94ee826
    Cloning the remote Git repository
    Cloning repository git@192.168.119.132:root/test.git
     > git init /var/lib/jenkins/workspace/vida-devops # timeout=10
    Fetching upstream changes from git@192.168.119.132:root/test.git
     > git --version # timeout=10
     > git --version # 'git version 1.8.3.1'
    using GIT_SSH to set credentials 
     > git fetch --tags --progress git@192.168.119.132:root/test.git +refs/heads/*:refs/remotes/origin/* # timeout=10
     > git config remote.origin.url git@192.168.119.132:root/test.git # timeout=10
     > git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10
    Avoid second fetch
     > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
    Checking out Revision 75359dbf8b454499aab4efb00ae0c6b6efa94ce4 (refs/remotes/origin/master)
     > git config core.sparsecheckout # timeout=10
     > git checkout -f 75359dbf8b454499aab4efb00ae0c6b6efa94ce4 # timeout=10
    Commit message: "v1"
    First time build. Skipping changelog.
    Finished: SUCCESS

Jenkins 流水线

Jenkins 流水线 (或简单的带有大写"P"的"Pipeline") 是一套插件,支持实现和集成 continuous delivery pipelines 到 Jenkins

对 Jenkins 流水线的定义被写在一个文本文件中 (成为 Jenkinsfile),该文件可以被提交到项目的源代码的控制仓库

Jenkinsfile

  • 自动地为所有分支创建流水线构建过程并拉取请求

  • 在流水线上代码复查 / 迭代 ( 以及剩余的源代码 )

  • 对流水线进行审计跟踪

  • 该流水线的真正的源代码,可以被项目的多个成员查看和编辑

声明式和脚本化的流水线语法

声明式和脚本化的流水线从根本上是不同的

声明式流水线的是 Jenkins 流水线更近的特性

  • 相比脚本化的流水线语法,它提供更丰富的语法特性,

  • 是为了使编写和读取流水线代码更容易而设计的

  • Code: 流水线是在代码中实现的,通常会检查到源代码控制, 使团队有编辑, 审查和迭代他们的交付流水线的能力

  • Durable: 流水线可以从 Jenkins 的主分支的计划内和计划外的重启中存活下来

  • Pausable: 流水线可以有选择的停止或等待人工输入或批准,然后才能继续运行流水线

  • Versatile: 流水线支持复杂的现实世界的 CD 需求, 包括 fork / join , 循环, 并行执行工作的能力

  • Extensible: 流水线插件支持扩展到它的 DSL 的惯例和与其他插件集成的多个选项

声明式流水线基础

Jenkinsfile (Declarative Pipeline)

pipeline {
    agent any 
    stages {
        stage('Build') { 
            steps {
                // 
            }
        }
        stage('Test') { 
            steps {
                // 
            }
        }
        stage('Deploy') { 
            steps {
                // 
            }
        }
    }
}
在任何可用的代理上,执行流水线或它的任何阶段。
定义 "Build" 阶段。
执行与 "Build" 阶段相关的步骤。
定义"Test" 阶段。
执行与"Test" 阶段相关的步骤。
定义 "Deploy" 阶段。
执行与 "Deploy" 阶段相关的步骤

脚本化流水线基础

Jenkinsfile (Scripted Pipeline)

在脚本化流水线语法中, 一个或多个 node 块在整个流水线中执行核心工作

node {  
    stage('Build') { 
        // 
    }
    stage('Test') { 
        // 
    }
    stage('Deploy') { 
        // 
    }
}
在任何可用的代理上,执行流水线或它的任何阶段。
定义 "Build" 阶段。 stage 块 在脚本化流水线语法中是可选的。 然而, 在脚本化流水线中实现 stage 块 ,可以清楚的显示Jenkins UI中的每个 stage 的任务子集。
执行与 "Build" 阶段相关的步骤。
定义 "Test" 阶段。
执行与 "Test" 阶段相关的步骤。
定义 "Deploy" 阶段。
执行与 "Deploy" 阶段相关的步骤

流水线示例

Jenkinsfile (Declarative Pipeline)

# Toggle Scripted Pipeline (Advanced)
pipeline 是声明式流水线的一种特定语法,他定义了包含执行整个流水线的所有内容和指令的 "block" 。
agent是声明式流水线的一种特定语法,它指示 Jenkins 为整个流水线分配一个执行器 (在节点上)和工作区。
stage 是一个描述 stage of this Pipeline的语法块。在 Pipeline syntax 页面阅读更多有关声明式流水线语法的`stage`块的信息。如 above所述, 在脚本化流水线语法中,stage 块是可选的。
steps 是声明式流水线的一种特定语法,它描述了在这个 stage 中要运行的步骤。
sh 是一个执行给定的shell命令的流水线 step (由 Pipeline: Nodes and Processes plugin提供) 。
junit 是另一个聚合测试报告的流水线 step (由 JUnit plugin提供)。
node 是脚本化流水线的一种特定语法,它指示 Jenkins 在任何可用的代理/节点上执行流水线 (和包含在其中的任何阶段)这实际上等效于 声明式流水线特定语法的`agent`。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐