mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
401 lines
14 KiB
YAML
401 lines
14 KiB
YAML
---
|
|
- hosts: apt
|
|
vars:
|
|
rootUser: root
|
|
|
|
dependencies:
|
|
- build-essential
|
|
- cowbuilder
|
|
- debhelper
|
|
- devscripts
|
|
- dh-golang
|
|
- distro-info
|
|
- dpkg-dev
|
|
- git
|
|
- pbuilder
|
|
- nginx
|
|
|
|
distributions:
|
|
- codename: bookworm
|
|
version: 12
|
|
- codename: bullseye
|
|
version: 11
|
|
|
|
roles:
|
|
- ../roles/reprepro
|
|
- ../roles/gpg
|
|
|
|
tasks:
|
|
- name: Install dependencies
|
|
become: true
|
|
ansible.builtin.apt:
|
|
name: "{{ dependencies }}"
|
|
state: present
|
|
|
|
- name: Check if NGINX needs to be configured
|
|
become: true
|
|
ansible.builtin.shell: "ls /etc/nginx/sites-enabled | grep 'apt.cgrates.org.vhost'"
|
|
ignore_errors: true
|
|
register: nginxConfig
|
|
|
|
- name: Configure NGINX server
|
|
ansible.builtin.include_tasks: nginx.yaml
|
|
when: nginxConfig.stdout_lines | length < 1
|
|
|
|
- name: Enable and start nginx
|
|
ansible.builtin.systemd:
|
|
name: nginx
|
|
state: started
|
|
masked: false
|
|
enabled: true
|
|
|
|
- name: Install Go
|
|
ansible.builtin.import_role:
|
|
name: ../roles/go
|
|
vars:
|
|
go_clean_build_cache: true
|
|
go_clean_modcache: true
|
|
|
|
- name: Create chroots
|
|
become: true
|
|
ansible.builtin.command: >-
|
|
cowbuilder --create --distribution {{ item.codename }} --architecture amd64
|
|
--basepath /var/cache/pbuilder/base-{{ item.codename }}+go.cow
|
|
--mirror http://deb.debian.org/debian --components main
|
|
args:
|
|
creates: "/var/cache/pbuilder/base-{{ item.codename }}+go.cow"
|
|
with_items: "{{ distributions }}"
|
|
|
|
- name: Check Go tarball
|
|
ansible.builtin.stat:
|
|
path: "/usr/local/src/{{ go_tarball }}"
|
|
register: downloaded_go_tarball
|
|
|
|
- name: Download Go tarball
|
|
become: true
|
|
ansible.builtin.get_url:
|
|
url: "{{ go_download_url }}"
|
|
dest: "/usr/local/src/{{ go_tarball }}"
|
|
checksum: "sha256:{{ go_checksum }}"
|
|
mode: "0644"
|
|
when: not downloaded_go_tarball.stat.exists
|
|
|
|
- name: Check Go version in chroots
|
|
become: true
|
|
ansible.builtin.command: >-
|
|
chroot /var/cache/pbuilder/base-{{ item.codename }}+go.cow
|
|
bash -c "GOROOT=/usr/local/go /usr/local/go/bin/go version"
|
|
register: chroot_go_version
|
|
ignore_errors: true
|
|
with_items: "{{ distributions }}"
|
|
changed_when: false
|
|
|
|
- name: Remove old Go from chroots when version differs
|
|
become: true
|
|
ansible.builtin.file:
|
|
path: "/var/cache/pbuilder/base-{{ item.item.codename }}+go.cow/usr/local/go"
|
|
state: absent
|
|
with_items: "{{ chroot_go_version.results }}"
|
|
when:
|
|
- item.rc == 0
|
|
- go_version not in item.stdout
|
|
|
|
- name: Install Go in chroots
|
|
become: true
|
|
ansible.builtin.unarchive:
|
|
src: "/usr/local/src/{{ go_tarball }}"
|
|
dest: "/var/cache/pbuilder/base-{{ item.codename }}+go.cow/usr/local"
|
|
copy: false
|
|
creates: "/var/cache/pbuilder/base-{{ item.codename }}+go.cow/usr/local/go"
|
|
with_items: "{{ distributions }}"
|
|
|
|
- name: Customize .bashrc in chroots
|
|
become: true
|
|
ansible.builtin.template:
|
|
src: bashrc.j2
|
|
dest: "/var/cache/pbuilder/base-{{ item.codename }}+go.cow/root/.bashrc"
|
|
mode: "0644"
|
|
owner: root
|
|
group: root
|
|
with_items: "{{ distributions }}"
|
|
|
|
- name: Customize .pbuilderrc
|
|
ansible.builtin.template:
|
|
src: pbuilderrc.j2
|
|
dest: "/home/{{ user }}/.pbuilderrc"
|
|
mode: "0644"
|
|
|
|
- name: Check update timestamp
|
|
ansible.builtin.stat:
|
|
path: "/var/cache/pbuilder/update-timestamp"
|
|
register: update_timestamp
|
|
|
|
- name: Update chroots
|
|
become: true
|
|
ansible.builtin.command: "cowbuilder --update --basepath /var/cache/pbuilder/base-{{ item.codename }}+go.cow"
|
|
with_items: "{{ distributions }}"
|
|
when: not update_timestamp.stat.exists or update_timestamp.stat.mtime <= (ansible_date_time.epoch | int - 86400)
|
|
register: update_chroots
|
|
|
|
- name: Update timestamp
|
|
become: true
|
|
ansible.builtin.file:
|
|
path: /var/cache/pbuilder/update-timestamp
|
|
state: touch
|
|
mode: "0644"
|
|
when: update_chroots.changed
|
|
|
|
###########################################################################################################################
|
|
###########################################################################################################################
|
|
- name: Set up cgrates
|
|
ansible.builtin.import_role:
|
|
name: ../../roles/cgrates
|
|
vars:
|
|
cgrates_bin_path: ""
|
|
cgrates_dbs: []
|
|
cgrates_dependencies: []
|
|
|
|
- name: Sync the go mod with vendor
|
|
ansible.builtin.command:
|
|
cmd: go mod vendor
|
|
chdir: "{{ cgrates_dir }}"
|
|
environment:
|
|
PATH: "{{ ansible_env.PATH }}:/usr/local/go/bin"
|
|
|
|
- name: Get current Git tag
|
|
ansible.builtin.command: git tag -l --points-at HEAD
|
|
args:
|
|
chdir: "{{ cgrates_dir }}"
|
|
register: git_tag_result
|
|
|
|
###########################################################################################################################
|
|
###########################################################################################################################
|
|
|
|
- block:
|
|
- name: Generate packages
|
|
ansible.builtin.command: 'env "DISTRIBUTION={{ item.codename }}" make -C packages deb'
|
|
args:
|
|
chdir: "{{ cgrates_dir }}"
|
|
with_items: "{{ distributions }}"
|
|
|
|
- name: Find generated package files
|
|
ansible.builtin.find:
|
|
paths: "/home/{{ user }}/go/src/github.com/cgrates"
|
|
patterns:
|
|
- cgrates_*
|
|
- cgrates-dbgsym_*
|
|
file_type: file
|
|
register: package_files
|
|
|
|
- name: Move package files to incoming directory
|
|
become: true
|
|
ansible.builtin.command: mv {{ item.path }} {{ reprepro_basedir }}/incoming/
|
|
args:
|
|
creates: "{{ reprepro_basedir }}/incoming/{{ item.path | basename }}"
|
|
removes: "{{ item.path }}"
|
|
with_items: "{{ package_files.files }}"
|
|
when: package_files.matched > 0
|
|
|
|
- name: Get current git commit hash
|
|
ansible.builtin.command: git log -n1 --format=format:%h HEAD
|
|
args:
|
|
chdir: "{{ cgrates_dir }}"
|
|
register: git_commit_hash
|
|
changed_when: false
|
|
|
|
- name: Check if packages already in reprepro
|
|
become: true
|
|
ansible.builtin.shell: |
|
|
reprepro -b {{ reprepro_basedir }} list {{ cgrates_branch }}-{{ item.codename }} 2>/dev/null | grep -q "{{ git_commit_hash.stdout }}"
|
|
register: reprepro_check
|
|
changed_when: false
|
|
failed_when: false
|
|
with_items: "{{ distributions }}"
|
|
|
|
- name: Set skip_reprepro fact
|
|
ansible.builtin.set_fact:
|
|
skip_reprepro: "{{ reprepro_check.results | selectattr('rc', 'equalto', 0) | list | length == distributions | length }}"
|
|
|
|
- name: Find Debian package changes files (.changes) for each distribution
|
|
ansible.builtin.find:
|
|
paths: "{{ reprepro_basedir }}/incoming"
|
|
patterns: "*~deb{{ item.version }}u1_amd64.changes"
|
|
file_type: file
|
|
register: changes_files
|
|
with_items: "{{ distributions }}"
|
|
when: not (skip_reprepro | default(false))
|
|
|
|
- name: Validate that each distribution has exactly one .changes file for proper reprepro inclusion
|
|
ansible.builtin.fail:
|
|
msg: "Debian packaging error: Expected exactly 1 .changes file for {{ item.item.codename }}, found {{ item.matched }}. Each distribution should have a single .changes file for proper repository inclusion."
|
|
when:
|
|
- not (skip_reprepro | default(false))
|
|
- item.matched != 1
|
|
with_items: "{{ changes_files.results | default([]) }}"
|
|
|
|
- name: Include the packages with reprepro
|
|
become: true
|
|
ansible.builtin.shell:
|
|
cmd: reprepro -Vb . --ignore=wrongdistribution include {{ cgrates_branch }}-{{ item.item.codename }} {{ item.files[0].path }}
|
|
chdir: "{{ reprepro_basedir }}"
|
|
with_items: "{{ changes_files.results | default([]) }}"
|
|
when:
|
|
- not (skip_reprepro | default(false))
|
|
- cgrates_branch == 'master' or git_tag_result.stdout_lines | length > 0
|
|
|
|
- name: Copy the file to PKG server
|
|
ansible.builtin.command: "scp {{ reprepro_basedir }}/incoming/{{ item.path | basename }} {{ pkgAddr }}:/tmp/"
|
|
with_items: "{{ package_files.files }}"
|
|
|
|
rescue:
|
|
- name: Find all files in incoming directory
|
|
ansible.builtin.find:
|
|
paths: "{{ reprepro_basedir }}/incoming"
|
|
file_type: file
|
|
register: all_incoming_files
|
|
|
|
- name: Display files for debugging
|
|
ansible.builtin.debug:
|
|
msg: "{{ all_incoming_files.files | map(attribute='path') | list }}"
|
|
|
|
- name: Find build log files
|
|
ansible.builtin.find:
|
|
paths: "{{ reprepro_basedir }}/incoming"
|
|
patterns: "*.build"
|
|
file_type: file
|
|
register: build_log_files
|
|
ignore_errors: true
|
|
|
|
- name: Ensure log directory exists
|
|
become: true
|
|
ansible.builtin.file:
|
|
path: "/tmp/ansible_build_logs"
|
|
state: directory
|
|
mode: "0755"
|
|
ignore_errors: true
|
|
|
|
- name: Copy build logs to a safe location
|
|
become: true
|
|
ansible.builtin.copy:
|
|
src: "{{ item.path }}"
|
|
dest: "/tmp/ansible_build_logs/{{ item.path | basename }}"
|
|
remote_src: true
|
|
with_items: "{{ build_log_files.files }}"
|
|
ignore_errors: true
|
|
when: build_log_files.matched > 0
|
|
|
|
- name: Remove chroot environments
|
|
become: true
|
|
ansible.builtin.file:
|
|
path: "/var/cache/pbuilder/base-{{ item.codename }}+go.cow"
|
|
state: absent
|
|
with_items: "{{ distributions }}"
|
|
|
|
- name: Remove update timestamp
|
|
become: true
|
|
ansible.builtin.file:
|
|
path: "/var/cache/pbuilder/update-timestamp"
|
|
state: absent
|
|
|
|
- name: Fail with error
|
|
ansible.builtin.fail:
|
|
msg: "Task failed - see original error above. Build logs saved to /tmp/ansible_build_logs/ if available."
|
|
|
|
always:
|
|
- name: Clean the incoming folder
|
|
become: true
|
|
ansible.builtin.file:
|
|
path: "{{ reprepro_basedir }}/incoming"
|
|
state: absent
|
|
|
|
- name: Remove leftover package files
|
|
ansible.builtin.file:
|
|
path: "{{ item }}"
|
|
state: absent
|
|
with_fileglob:
|
|
- "/home/{{ user }}/go/src/github.com/cgrates/cgrates_*"
|
|
- "/home/{{ user }}/go/src/github.com/cgrates/cgrates-dbgsym_*"
|
|
|
|
- hosts: pkg
|
|
vars:
|
|
nginx_user: "www-data"
|
|
cgrates_branch: "master"
|
|
distributions:
|
|
- codename: bookworm
|
|
version: 12
|
|
- codename: bullseye
|
|
version: 11
|
|
tasks:
|
|
- name: Add user to www-data group
|
|
become: true
|
|
ansible.builtin.user:
|
|
name: "{{ user }}"
|
|
groups: "{{ nginx_user }}"
|
|
append: true
|
|
|
|
- name: Create directory
|
|
become: true
|
|
ansible.builtin.file:
|
|
path: /var/packages/deb/{{ cgrates_branch }}/{{ item.codename }}
|
|
state: directory
|
|
mode: "0775"
|
|
owner: "{{ nginx_user }}"
|
|
group: "{{ nginx_user }}"
|
|
with_items: "{{ distributions }}"
|
|
|
|
- name: Remove symlink from current deb package
|
|
ansible.builtin.file:
|
|
path: /var/packages/deb/{{ cgrates_branch }}/{{ item.codename }}/cgrates_current_amd64.deb
|
|
state: absent
|
|
with_items: "{{ distributions }}"
|
|
when: cgrates_branch == 'master' or hostvars['apt']['git_tag_result'].stdout_lines | length > 0
|
|
|
|
- name: Move the new package to /var/packages/deb
|
|
become: true
|
|
ansible.builtin.shell: "mv /tmp/cgrates_*~deb{{ item.version }}u1*.deb /var/packages/deb/{{ cgrates_branch }}/{{ item.codename }}/"
|
|
with_items: "{{ distributions }}"
|
|
when: cgrates_branch == 'master' or hostvars['apt']['git_tag_result'].stdout_lines | length > 0
|
|
|
|
- name: Find all package files
|
|
become: true
|
|
ansible.builtin.find:
|
|
path: "/var/packages/deb/{{ cgrates_branch }}/"
|
|
patterns: "*.deb"
|
|
recurse: true
|
|
when: cgrates_branch == 'master' or hostvars['apt']['git_tag_result'].stdout_lines | length > 0
|
|
register: package_files
|
|
|
|
- name: Set ownership and permissions for moved files
|
|
become: true
|
|
ansible.builtin.file:
|
|
path: "{{ item.path }}"
|
|
owner: "{{ nginx_user }}"
|
|
group: "{{ nginx_user }}"
|
|
mode: "0644"
|
|
loop: "{{ package_files.files }}"
|
|
when: cgrates_branch == 'master' or hostvars['apt']['git_tag_result'].stdout_lines | length > 0
|
|
|
|
- name: Find package files per distribution
|
|
become: true
|
|
ansible.builtin.find:
|
|
path: "/var/packages/deb/{{ cgrates_branch }}/{{ item.codename }}/"
|
|
patterns: cgrates_*_amd64.deb
|
|
with_items: "{{ distributions }}"
|
|
register: distribution_package_files
|
|
when: cgrates_branch == 'master' or hostvars['apt']['git_tag_result'].stdout_lines | length > 0
|
|
|
|
- ansible.builtin.set_fact:
|
|
latest_file: "{{ item.files | sort(attribute='mtime', reverse=true) | first }}"
|
|
with_items: "{{ distribution_package_files.results }}"
|
|
register: latest_files
|
|
when: cgrates_branch == 'master' or hostvars['apt']['git_tag_result'].stdout_lines | length > 0
|
|
|
|
- name: Create the new symlink cgrates_current_amd64.deb
|
|
become: true
|
|
ansible.builtin.file:
|
|
src: "{{ item.ansible_facts.latest_file.path }}"
|
|
dest: "/var/packages/deb/{{ cgrates_branch }}/{{ item.item.item.codename }}/cgrates_current_amd64.deb"
|
|
state: link
|
|
with_items: "{{ latest_files.results }}"
|
|
when: cgrates_branch == "master" or hostvars['apt']['git_tag_result'].stdout_lines | length > 0
|