引言

持续集成和交付是现代软件开发的关键实践之一。它们旨在通过频繁地集成和交付代码来加速软件开发周期,并确保软件质量。Jenkins作为一个功能强大的自动化服务器,可以帮助团队实现这一目标。而使用Ansible来部署Jenkins,可以进一步简化和标准化部署过程,提高效率和可维护性。

Jenkins的使用场景

Jenkins在软件开发中有多个常见的使用场景。下面是其中一些典型的场景:

  1. 构建和编译:Jenkins可以自动化执行构建和编译任务,如编译源代码、打包应用程序等。它支持各种构建工具和构建系统,如Maven、Gradle和Ant。
  2. 自动化测试:Jenkins可以集成各种测试框架和工具,如JUnit、Selenium和Cucumber,以自动化执行单元测试、集成测试和端到端测试。它还提供了丰富的报告和可视化功能,帮助团队分析测试结果。
  3. 静态代码分析:Jenkins可以与静态代码分析工具集成,如SonarQube和FindBugs,以检测代码中的潜在问题和质量问题。它可以定期运行静态代码分析,并生成相应的报告和度量指标。
  4. 部署和交付:Jenkins可以自动化部署应用程序到不同的环境,如开发、测试和生产环境。它支持各种部署方式,如传统的服务器部署、容器化部署和云平台部署。
5. 持续集成和交付流水线:Jenkins提供了强大的流水线功能,可以定义和管理复杂的持续集成和交付流程。它支持多阶段的构建和部署任务,并允许通过可视化界面或代码方式定义流水线。

这些只是Jenkins的一小部分使用场景。它的灵活性和可扩展性使得它适用于各种软件开发环境和需求。

Ansible部署Jenkins的实践

1.1 准备一台阿里云ECS

可以通过我前面发布的文章,一键购买

1.2 准备Ansible Inventory 文件

创建一个文件 deploy-jenkins-host.ini

[deploy]
aliyun_ecs ansible_ssh_host=118.31.76.44 ansible_ssh_port=22 ansible_user=ecs-user ansible_ssh_pass=Ecs-user123 ansible_sudo_pass=Ecs-user123

1.3 准备 开机启动服务脚本

创建一个文件 jenkins-supervisord.ini.j2

[program:jenkins]
environment=JAVA_HOME="{{ jenkins_java_home }}"           ;
directory=/home/{{ jenkins_install_user }}               ;
command={{ jenkins_java_home }}/bin/java -jar -Djenkins.install.runSetupWizard=false jenkins.war ;
stopsignal=KILL                                           ;
stderr_logfile=/var/log/supervisor/jenkins.err            ;
stdout_logfile=/var/log/supervisor/jenkins.out            ;
stdout_logfile_maxbytes=10MB                              ;
stdout_logfile_backups=10                                 ;
user={{ jenkins_install_user }}                           ;
umask=022                                                 ;
autostart=true                                            ;
autorestart=true                                          ;
startsecs=10                                              ;
startretries=3                                            ;
stopasgroup=true                                          ;
killasgroup=true                                          ;
redirect_stderr=false                                     ;

1.4 准备 Ansible Playbook 文件

创建一个文件 deploy-jenkins.yaml

- name: 安装 Jenkins
  hosts: deploy
  become: true
  vars:
    jenkins_version: 2.401.3
    jenkins_home_name: "/home/"
    jenkins_war_name: "jenkins.war"
    jenkins_download_url: "http://i-ansible.oss-cn-hangzhou-internal.aliyuncs.com/jenkins/{{ jenkins_version }}/{{ jenkins_war_name }}"
    jenkins_install_user: ecs-user
    jenkins_java_home: "/home/{{ jenkins_install_user }}/jdk-11.0.2"
  tasks:
    - name: 下载 Linux 通用包
      ansible.builtin.get_url:
        url: "{{ jenkins_download_url }}"
        validate_certs: false
        dest: "/home/{{ jenkins_install_user }}/{{ jenkins_war_name }}"
        mode: "0644"
        force: true
        owner: "{{ jenkins_install_user }}"
        group: "{{ jenkins_install_user }}"
      tags: download

    - name: 安装字体依赖包 1
      ansible.builtin.apt:
        name: "{{ item }}"
        state: present
      with_items:
        - fontconfig
      when: ansible_os_family == 'Debian'

    - name: 安装字体依赖包 2
      ansible.builtin.yum:
        name: "{{ item }}"
        state: present
      with_items:
        - fontconfig
      when: ansible_os_family == 'RedHat'

    - name: 复制启动文件
      ansible.builtin.template:
        src: "{{ item }}.j2"
        dest: "/etc/supervisord.d/conf.d/{{ item }}"
        mode: "0755"
        owner: root
        group: root
      with_items:
        - jenkins-supervisord.ini

    - name: 更新启动文件
      ansible.builtin.command:
        chdir: /tmp
        cmd: /usr/bin/supervisorctl -c /etc/supervisord.d/supervisor.conf update
      changed_when: false

    - name: 重启0
      ansible.builtin.command:
        chdir: /tmp
        cmd: "/usr/bin/supervisorctl -u admin -p 123456 stop jenkins"
      changed_when: false

    - name: 重启1
      ansible.builtin.command:
        chdir: /tmp
        cmd: "/usr/bin/supervisorctl -u admin -p 123456 start jenkins"
      changed_when: false

    - name: 检查端口是否运行
      ansible.builtin.wait_for:
        port: 8080
        state: started
        delay: 5
        timeout: 120
    # 密码在这里 cat /home/ecs-user/.jenkins/secrets/initialAdminPassword

1.5 访问测试

在jenkins tools中安装ansible_ansible

结论

Jenkins是一个功能强大且广泛使用的持续集成和交付工具。通过使用Ansible来部署Jenkins,你可以简化和标准化部署过程,并提高效率和可维护性。在不同的使用场景下,Jenkins可以帮助团队自动化构建、测试和部署软件,从而加速软件开发周期并提高质量。

如果你对Jenkins和Ansible有更多的兴趣和好奇,我鼓励你进一步探索它们的功能和扩展性。持续学习和实践将使你成为一个更出色的软件开发者。

祝你在使用Jenkins和Ansible的过程中取得成功!