Docker部署Jenkins实现自动化部署

657 阅读2分钟

一、下载配置Jenkins

1.拉取镜像

docker pull jenkins/jenkins

2.启动

docker run -d -p 8888:8080 -p 50000:50000 \
-v /home/jenkins:/var/jenkins_home \
-v /etc/localtime:/etc/localtime \
--name jenkins docker.io/jenkins/jenkins

3.如无意外会启动失败, 原因是Jenkins镜像内部使用的用户是jenkons,执行如下命令

* groupadd -g 1000 jenkinsUsers
* useradd -u 1000 -g 1000 -d /users/jenkins/jenkinsAdmin -m jenkinsAdmin
* passwd jenkinsAdmin
* chown -R 1000:1000 /home/jenkins

4.重启容器

5.登录jenkins,安装默认插件

6.  jenkins全局配置:

jdk 使用默认,路径为/usr/local/openjdk-8

maven:自动安装,按需指定配置文件,配置私有仓库

git,自动安装

7. 安装Publish Over SSH,用于推送文件到指定服务器

image.png

name-随意起

Hostname-服务器Ip

Username-服务器用户名

Remote Directory-存储文件根路径

Password-登录密码

Port-sshd连接接口

二、新建任务

1.新建任务

image.png

2.配置

image.png

1)源码管理-git或gitlab,云效和码云同样可以,一般选用sshkey关联。

2)构建触发器

image.png

    定时构建- 周期进行项目构建(它不关心源码是否发生变化)

    轮询SCM- 定时检查源码变更,变更后构建

3)构建环境-勾选 Add timestamps to the Console Output,日志输入时间

4)构建-使用maven构建,构建脚本

clean package -Dmaven.test.skip=true -Dautoconfig.skip

可配置指定maven配置文件,配置私有仓库等。

5)构建后操作-构建jar包后配置远程主机

image.png

Source files-待传文件,相对路径,相对工作空间

Remove prefix-文件前缀

Remote directory-远程主机接收文件的路径,基于根目录

Exec command-发送到远程主机的脚本

附上本人项目的脚本,可参考阿里巴巴云效的执行脚本


#!/bin/bash

PROG_NAME=$0

ACTION=$1

ONLINE_OFFLINE_WAIT_TIME=10  # 实例上下线的等待时间

APP_START_TIMEOUT=60     # 等待应用启动的时间

APP_PORT=8083          # 应用端口

JAVA_HOME=/home/jdk1.8.0_241/bin/java

HEALTH_CHECK_URL=http://127.0.0.1:${APP_PORT}/health  # 应用健康检查URL

OFF_LINE_URL=http://127.0.0.1:${APP_PORT}/health  # 应用健康检查URL

ON_LINE_URL=http://127.0.0.1:${APP_PORT}/health  # 应用健康检查URL

APP_HOME=/home/ali-demo  # 从package.tgz中解压出来的jar包放到这个目录下

JAR_NAME=ali-demo-1.0.0.jar # jar包的名字

TAR_NAME=ali-demo-1.0.0.tar # tar压缩包的名字

BAK_NAME=ali-demo-1.0.0.jar # tar压缩包的名字

APP_LOG=${APP_HOME}/logs/app.log # 应用的日志文件

PID_FILE=${APP_HOME}/pid   # 应用的pid会保存到这个文件中

# 创建出相关目录

mkdir -p ${APP_HOME}/logs

usage() {

    echo "Usage: $PROG_NAME {start|stop|online|offline|restart|deploy}"

    exit 2

}

online() {

    # 挂回SLB

    /usr/bin/curl ${ON_LINE_URL}

    echo "wait app online in ${ONLINE_OFFLINE_WAIT_TIME} seconds..."

    sleep ${ONLINE_OFFLINE_WAIT_TIME}

}

offline() {

    # 摘除SLB

    /usr/bin/curl ${OFF_LINE_URL}

    echo "wait app offline in ${ONLINE_OFFLINE_WAIT_TIME} seconds..."

    sleep ${ONLINE_OFFLINE_WAIT_TIME}

}

health_check() {

    exptime=0

    echo "checking ${HEALTH_CHECK_URL}"

    while true

    do

        status_code=`/usr/bin/curl -L -o /dev/null --connect-timeout 5 -s -w %{http_code}  ${HEALTH_CHECK_URL}`

        if [ x$status_code != x200 ];then

            sleep 1

            ((exptime++))

            echo -n -e "\rWait app to pass health check: $exptime..."

        else

            break

        fi

        if [ $exptime -gt ${APP_START_TIMEOUT} ]; then

            echo

            echo 'app start failed'

            exit 1

        fi

    done

    echo "check ${HEALTH_CHECK_URL} success"

}

start_application() {

    echo "start jar"

    source /etc/profile;

    if [ -f "$PID_FILE" ] && kill -0 "$(cat ${PID_FILE})"; then

        echo "Application is running, exit"

        exit 0

    fi

    ${JAVA_HOME} -jar ${APP_HOME}/${JAR_NAME} > ${APP_LOG} 2>&1 &

    echo $! > ${PID_FILE}

}

back_application(){

    echo "backing jar"

     echo "${APP_HOME}/${JAR_NAME}"

    if [ [ -f "${APP_HOME}/${JAR_NAME}" ]; then

        # rm  ${APP_HOME}/${BAK_NAME}

        echo "backing......"

        cp  ${APP_HOME}/${JAR_NAME} ${APP_HOME}/$(date "+%Y-%m-%d %H:%M:%S")-${BAK_NAME}

    fi

\


\


}

stop_application() {

    echo "stop jar"

    if [ -f "$PID_FILE" ]; then

        kill -9 `cat $PID_FILE`

        rm $PID_FILE

    else

        echo "pid file $PID_FILE does not exist, do noting"

    fi

}

start() {

    start_application

    health_check

    online

}

back(){

    back_application

}

stop() {

    offline

    stop_application

}

case "$ACTION" in

    start)

        start

    ;;

    stop)

        stop

    ;;

    online)

        online

    ;;

    offline)

        offline

    ;;

    restart)

        stop

        start

    ;;

    deploy)

        stop

        back

        start

    ;;

    *)

        usage

    ;;

esac

附加:

个人开源项目【持续更新】:github.com/DMCHRL/micr…

  • 基于Spring Cloud Alibaba、Nacos、Spring Boot、 OAuth2 的 RBAC 微服务后端轮子