Jenkins

2019-07-23-Jenkins

Jenkins

Jenkin是什么?

Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建, 部署, 自动化, 满足任何项目的需要, Jenkins是一个独立的基于Java的程序, 可以立即运行, 包含Windows,Mac OS X和其他类Unix操作系统.

Jenkins的特点:

持续集成和持续交付作为一个可扩展的自动化服务器, Jenkins可以用作简单的CI服务器, 或者变成任何项目的连续交付中心.
Jenkins可以通过其网页界面轻松设置和配置, 其中包括即时错误检查和内置帮助.
通过更新中心中的1000多个插件, Jenkins集成了持续集成和持续交付工具链中几乎所有的工具.
Jenkins 可以通过其插件架构进行扩展, 从而为 Jenkins 可以做的事提供几乎无限的可能性.
Jenkins可以轻松地在多台机器上分配工作,帮助更快速地跨多个平台推动构建,测试和部署.

Jenkins部署:

选用Ubuntu进行部署

  • 建议所有操作在root下部署
  • 关于Ubuntu设置永久DNS的方法:
    1
    2
    $ vim /etc/network/interfaces	     # dns-nameserver 192.168.137.2
    $ vim /etc/systemd/resolved.conf # [Resolve] DNS=DNS

Ubuntu的相关配置:

192.168.37.10: jenkins/SVN; 192.168.37.12: 测试机; 192.168.37.14: 生产环境

下载git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \
libz-dev libssl-dev

$ wget -O v2.22.0.tar.gz https://github.com/git/git/archive/v2.22.0.tar.gz

$ tar -xzvf git-v2.22.0.tar.gz
$ cd git-1.7.2.2
$ make prefix=/usr/local/git all

$ sudo make prefix=/usr/local/git install
$ vim /etc/profie
PATH=$PATH:/usr/local/bin
$ source /etc/profile
$ export PATH

搭建SVN(svn://IP/repos) 192.168.37.10

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ apt-get install subversion
$ mkdir /home/svn
$ svnadmin create /home/svn/repos
$ cd /home/svn/repos

$ vim svnserve.conf
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
$ vim passwd
[users]
test = 123456
$ vim authz
[repos:/]
test = rw
* =

$ svnserve -d -r /home/svn

安装Java 192.168.37.10

1
2
3
4
5
6
7
8
9
10
11
12
$ mkdir /usr/local/java/jdk1.8
$ tar -xzvf jdk-8u221-linux-x64.tar.gz
$ mv jdk1.8.0_221/ /usr/local/java/jdk1.8
$ vim ~/.bashrc
JAVA_HOME=/usr/local/jdk1.8
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
JAVA_JRE=$JAVA_HOME/jre
MAVEN_HOME=/usr/local/maven3.6.1
PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
$ source ~/.bashrc
$ java -verison

安装apache-tomcat(java -jar jenkins.war) 192.168.37.10

1
2
3
4
5
6
7
8
9
10
11
12
$ wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.43/bin/apache-tomcat-8.5.43.tar.gz
$ tar -xzvf apache-tomcat-8.5.43.tar.gz
$ mv apache-tomcat-8.5.43 /usr/local/apache-tomcat-8
$ chmod 755 -R /usr/local/apache-tomcat-8.5.43
$ unzip -d jenkins jenkins.war
$ mv jenkins /usr/local/apache-tomcat-8/webapps

浏览器访问Jenkin: IP:8080/jenkins

$ cd /usr/local/apache-tomcat-8.5.43/bin/startup.sh
$ tail -f ../logs/catalina.out
$ cat /root/.jenkins/secrets/initialAdminPassword

搭建私有镜像仓库与构建LNMP基础镜像

  • 创建nginx php镜像
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry

    vim /etc/daemon.json
    {
    "registry-mirrors": ["http://f1361db2.m.daocloud.io"],
    "insecure-registries": ["192.168.37.10:5000"]
    }

    FROM centsos:6
    MAINTAINER anyu967
    RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel && \
    yumclaean all
    ADD nginx-1.12.tar.gz /tmp
    RUN cd /tmp/nginx-1.12 && ./configure --prefix=/usr/local/nginx && make -j 2 && \
    make install && rm -rf /tmp/nginx-1.12.1
    COPY nginx.cong /usr/local/nginx/conf
    EXPOSED 80
    CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off:"]

    FROM centsos:6
    MAINTAINER anyu967
    RUN yum install -y gcc gcc-c++ gd-devel libxml2-devel \
    libcurl-devel libjpeg-devel libpng-devel openssl-devel && \
    yum claean all
    ADD php-5.6.31.tar.gz /tmp
    RUN cd /tmp/php-5.6.31 && \
    ./configure --prefix=/usr/local/php \
    --with-config-file-path=/usr/local/php/etc \
    --with-mysql --with-mysqli \
    --with--openssl --with-zlib --with-curl --with-gd \
    --with--jpeg-dir --with-png-dir --with-iconv \
    --enable-fpm --enable-zip --enable-mbstring && \
    make -j 4 && make install && \
    cp /usr/local/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.cong && \
    sed -i "s/127.0.0.1/0.0.0.0/" /usr/local/php/etc/php-fpm.conf && \
    cp ./sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm && \
    chmod +x /etc/init.d/php-fpm && \
    rm -rf /tmp/php-5.6.31
    COPY php.ini /usr/local/php/etc
    EXPOSED 9000
    CMD /etc/init.d/php-fpm start && tail -F /var/log/messages

    docker build -t 192.168.37.10:5000/lnmp-php:base .
    docker push 192.168.37.10:5000/lnmp-php:base

    location ~ \.php$ {
    root html;
    fastcgi_pass php-cgi:9000;
    fastcgi_param SCRIPT_FILENAME scripts$fastcgi_script_name;
    include fastcgi_params;
    }

创建文件(测试环境的配置)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|-- /home/anyue/lnmp
|-- Dockerfile
| |-- nginx
| |-- php
|-- config
| |-- prod.html
| |-- prod.tar.gz
| |-- test.html
| |-- test.tar.gz
|-- deploy.sh
|-- docker-compose.yml
|-- mysql_data
|-- push_images.sh
|-- revision.svn
|-- wwwroot
  • deploy.sh

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    REVISION=$1
    WORK_ENV=test
    echo $REVISION >./revision.svn
    cd Dockerfile
    docker build --build-arg work_env=$WORK_ENV -t lnmp-nginx:laste -f nginx ../ # tag
    docker build --build-arg work_env=$WORK_ENV -t lnmp-php:laste -f php ../
    docker-compose down
    docker-compose up -d
  • Docker-compose.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    version: "3"
    service:
    nginx:
    image: lnmp_nginx:latest
    ports:
    - 80:80
    links:
    - php: php-cgi
    depends_on:
    - php
    - mysql
    php:
    image: lnmp-php:latest
    links:
    - mysql: mysql-db
    mysql:
    image: mysql:5.6
    ports:
    - 3306:3306
    volumes:
    - ./mysql_data:/var/lib/mysql
    command: --character-set-server=utf8
    environment:
    MYSQL_ROOT_PASSWORD: 123456
    MYSQL_DATABASE: wordpress
    MYSQL_USER: user
    MYSQL_PASSWORD: user123
  • nginx && php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    FROM 192.168.37.10:5000/lnmp-nginx:base
    MAINTAINER anyue
    ARG work_env
    ADD wwwroot /usr/local/nginx/html
    ADD config/${work_env}.tar.gz /usr/local/nginx/html
    EXPOSE 80

    FROM 192.168.37.10:5000/lnmp-php:base
    MAINTAINER anyue
    ARG work_env
    ADD wwwroot /usr/local/nginx/html
    ADD config/${work_env}.tar.gz /usr/local/nginx/html
    EXPOSE 9000
  • push_image.sh

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    IMAGE_REPOS=192.168.37.10:5000
    REVISION=$(cat revision.svn)
    WORK_ENV=prod
    cd Dockerfile
    docker build --build-arg work_env=$WORK_ENV -t $IMAGE_REPOS/lnmp-nginx:$REVISION -f nginx ../
    docker build --build-arg work_env=$WORK_ENV -t $IMAGE_REPOS/lnmp-php:$REVISION -f php ../
    docker push $IMAGE_REPOS/lnmp-nginx:$REVISION
    docker push $IMAGE_REPOS/lnmp-php:$REVISION

创建文件(生产环境的配置)

1
2
3
4
|-- deploy.sh
|-- docker-compose.yml
|-- revision.svn
|-- roll-back.sh
  • deploy.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
    REVISION=revison.svn
    IMAGE_REPOS=http://192.168.37.10:5000/v2
    LATEST_REVISION=$(curl $IMAGE_REPOS/lnmp-nginx/tags/list |grep -Po '(?<=")\d+(?=")' |awk 'BEGIN{max=0} {for(i=0;i<=NF;i++) if($i>max) max=$i}END{print max}')
    sed -i -r '/:5000/s/[0-9]+$/'$LATEST_REVISION'/' docker-compose.yml
    if ! grep "^$LATEST_REVISION " $REVISION &>/dev/null; then
    sed -i -r '$s/([0-9]+).*/\1 Previous/' $REVISION
    echo "$LATEST_REVISION Current" >>$REVISION
    fi
    docker-compose down
    docker-compose up -d
  • docker-compose.yml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    version: '3'
    services:
    nginx:
    image: 192.168.37.10:5000/lnmp-nginx:12
    ports:
    - 80:80
    links:
    - php: php-cgi
    depends_on:
    - php
    php:
    image: 192.168.37.10:5000/lnmp-php:12
    links:
    - mysql: mysql-db
    mysql:
    image: mysql:5.6
    ports:
    - 3306:3306
    volumes:
    - ./mysql_data:/var/lib/mysql
    command: --character-set-server=utf8
    environment:
    MYSQL_ROOT_PASSWORD: 123456
    MYSQL_DATABASE: wordpress
    MYSQL_USER: user
    MYSQL_PASSWORD: user123
  • roll-back.sh
    1
    2
    3
    4
    5
    #!/bin/bash
    PRE_REVISION=$(awk 'Previous/{revision=$1} END{print revision}' revision.svn)
    sed -i -r '/:5000/s/[0-9]+$/'$PRE_REVISION'/' docker-compose.yml
    docker-compose down
    docker-compose up -d

Jenkins配置

Manage Jenkin desc
Configure System Configure global setting and paths
Configure Global Security Secure Jenkins; define who is allowed access/use the system
Global Tool Configuration Configure tools, their location and automatic installers
Manager Users Create/delete/modify users that can log in to this Jenkins

解决乱码

1
vim /opt/tomcat8/bin/catalina.sh   # 解决乱码: export LANG=zh_CN.UTF-8

Jenkins使用

原理

Configure System(配置SSH)

Global Tool Configuration(配置相关工具路径)


Jenkins
https://anyu967.github.io/posts/9a7f448e.html
作者
anyu967
发布于
2019年7月23日
许可协议