WhatAKitty Daily

A Programmer's Daily Record

Docker JIRA 7.3.8 破解部署

WhatAKitty   阅读次数loading...

背景

最近在做devOps自动化集成部署的事情,在比较了多款issue tracker后,还是决定使用JIRA。因为相对于其他软件来说,它的功能更强大、更完善。不过很不幸的是,JIRA的使用需要商业授权而且费用相当高昂,对于我们这种小公司来说,只能使用破解版本了。

基础环境

  • Doker CE

如何安装docker,在这里就不做描述了

改写Dockerfile

网上有相对符合我需求的现成Dockerfile两种:

第一种版本有点旧(7.2.7的版本,破解补丁已经有7.3的版本了),曾经尝试在这种版本上做直接调整,发现层出不穷的问题,果断放弃。
第二种版本是最新的(7.4.x的版本,但是破解补丁没有这么新),而且只是jira-core的版本,不是jira-software的版本,不符合我的要求,因此需要对这个版本做修改。

下载源码

1
2
3
git clone https://github.com/cptactionhank/docker-atlassian-jira.git

cd docker-atlassian-jira

编辑Dockerfile文件:

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
FROM openjdk:8

# Configuration variables.
ENV JIRA_HOME /var/atlassian/jira
ENV JIRA_INSTALL /opt/atlassian/jira
ENV JIRA_VERSION 7.3.8
# 定义临时文件夹,用于存放上传的文件
ENV TEMP_PATH     /temp/jira

# 准备JIRA的安装工作
# 1. 创建/temp/jira临时目录
# 2. 将需要的文件上传到临时文件,有破解文件和JIRA的安装包等等
# 3. 将sources.list.163文件上传,用于替换成163源
# To Ready JIRA
RUN mkdir /temp && mkdir /temp/jira
COPY mysql-connector-java-5.1.39-bin.jar /temp/jira/mysql-connector-java-5.1.39-bin.jar
COPY atlassian-extras-3.2.jar /temp/jira/atlassian-extras-3.2.jar
COPY postgresql-9.4.1212.jar /temp/jira/postgresql-9.4.1212.jar
COPY atlassian-jira-software-7.3.8.tar.gz /temp/jira/atlassian-jira-software-7.3.8.tar.gz
COPY sources.list.163 /temp/jira/sources.list.163

# 安装JIRA的运行命令,主要做了以下工作:
# 1. 将debain的原始源替换成国内的163源
# 2. 将下载获取JIRA更换为上传JIRA的源码包,因为下载JIRA的速度实在有点感人
# Install Atlassian JIRA and helper tools and setup initial home
# directory structure.
RUN set -x \
&& mv /etc/apt/sources.list /etc/apt/sources.list.back \
&& cp "${TEMP_PATH}/sources.list.163" /etc/apt/sources.list \
# && echo "deb http://mirrors.163.com/debian jessie-backports main" > /etc/apt/sources.list.d/jessie-backports.list \
&& apt-get update --quiet \
&& apt-get install --quiet --yes --no-install-recommends xmlstarlet \
&& apt-get install --quiet --yes --no-install-recommends -t jessie-backports libtcnative-1 \
&& apt-get clean \
&& mkdir -p "${JIRA_HOME}" \
&& mkdir -p "${JIRA_HOME}/caches/indexes" \
&& chmod -R 700 "${JIRA_HOME}" \
&& chown -R daemon:daemon "${JIRA_HOME}" \
&& mkdir -p "${JIRA_INSTALL}/conf/Catalina" \
&& cp "${TEMP_PATH}/atlassian-jira-software-${JIRA_VERSION}.tar.gz" "./atlassian-jira-software-${JIRA_VERSION}.tar.gz" \
&& tar -zxvf "./atlassian-jira-software-${JIRA_VERSION}.tar.gz" --directory "${JIRA_INSTALL}" --strip-components=1 --no-same-owner \
&& curl -Ls "https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.38.tar.gz" | tar -xz --directory "${JIRA_INSTALL}/lib" --strip-components=1 --no-same-owner "mysql-connector-java-5.1.38/mysql-connector-java-5.1.38-bin.jar" \
&& rm -f "${JIRA_INSTALL}/lib/postgresql-9.1-903.jdbc4-atlassian-hosted.jar" \
&& curl -Ls "https://jdbc.postgresql.org/download/postgresql-9.4.1212.jar" -o "${JIRA_INSTALL}/lib/postgresql-9.4.1212.jar" \
&& chmod -R 700 "${JIRA_INSTALL}/conf" \
&& chmod -R 700 "${JIRA_INSTALL}/logs" \
&& chmod -R 700 "${JIRA_INSTALL}/temp" \
&& chmod -R 700 "${JIRA_INSTALL}/work" \
&& chown -R daemon:daemon "${JIRA_INSTALL}/conf" \
&& chown -R daemon:daemon "${JIRA_INSTALL}/logs" \
&& chown -R daemon:daemon "${JIRA_INSTALL}/temp" \
&& chown -R daemon:daemon "${JIRA_INSTALL}/work" \
&& sed --in-place "s/java version/openjdk version/g" "${JIRA_INSTALL}/bin/check-java.sh" \
&& echo -e "\njira.home=$JIRA_HOME" >> "${JIRA_INSTALL}/atlassian-jira/WEB-INF/classes/jira-application.properties" \
&& touch -d "@0" "${JIRA_INSTALL}/conf/server.xml"

# 使用补丁包替换掉原来的JAR包
# Hack
RUN set -x \
&& rm -rf "${JIRA_INSTALL}/atlassian-jira/WEB-INF/lib/atlassian-extras-3.2.jar" \
&& cp "${TEMP_PATH}/atlassian-extras-3.2.jar" "${JIRA_INSTALL}/atlassian-jira/WEB-INF/lib/atlassian-extras-3.2.jar"

# Use the default unprivileged account. This could be considered bad practice
# on systems where multiple processes end up being executed by 'daemon' but
# here we only ever run one process anyway.
USER daemon:daemon

# Expose default HTTP connector port.
EXPOSE 8080

# Set volume mount points for installation and home directory. Changes to the
# home directory needs to be persisted as well as parts of the installation
# directory due to eg. logs.
VOLUME ["/var/atlassian/jira", "/opt/atlassian/jira/logs"]

# Set the default working directory as the installation directory.
WORKDIR /var/atlassian/jira

COPY "docker-entrypoint.sh" "/"
ENTRYPOINT ["/docker-entrypoint.sh"]

# Run Atlassian JIRA as a foreground process by default.
CMD ["/opt/atlassian/jira/bin/catalina.sh", "run"]

构建image

现在已经有了线程的Dockerfile,那么久可以直接上手构建镜像了:

1
docker build -t local-jira:7.3.8 .

注意不要遗漏最后一个“.”,这个是用来指定目标Dockerfile文件的所在文件夹。

运行

构建完成镜像,我们现在可以根据镜像直接运行jira:

1
docker run --publish 8080:8080 --name jira -d local-jira:7.3.8

可以看到,容器已经完美运行:
upload successful

upload successful

提醒:在第一个界面的右上角,可以直接更改为中文(默认英文)

生产环境数据库

不要着急,如果是正式部署在生产环境上的,如果使用内置数据库,总感觉有点不保险,JIRA也建议如果部署在生产环境上的话,直接使用外部数据库,因此我们只需要在docker容器上启动一个数据库即可:

1
2
3
4
5
6
7
8
docker run --name jira-mysql \
-e MYSQL_ROOT_PASSWORD=ROOT_PASSWORD \
-e MYSQL_DATABASE=JIRA_DATABASENAME \
-e MYSQL_USER= JIRA_USER\
-e MYSQL_PASSWORD=JIRA_PASSWORD \
-d mysql:latest \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_bin

结束语

有了数据库后,直接在jira配置的时候,使用外部数据库连接就行了。