如何从 GitLab CI 管道的工作发送电子邮件?
How to send an email from GitLab CI pipeline's job?
我正在尝试设置一个 GitLab CI 配置,该配置在管道的作业完成后将 link 工件发送到上传站点。管道基于 pom.xml 构建,然后使用 sonarqube 进行测试,然后使用 curl 将工件上传到特定的工件位置。工件目录的文件夹结构和 link 取决于 CI_PIPELINE_ID。在所有这些都成功之后,我需要将这个用于下载工件的 link 通过邮件发送给一个人的列表。我的 .gitlab-config.yml 如下所示:
image: maven:3.3.9-jdk-8
variables:
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
MAVEN_CLI_OPTS: "-U --batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"
REPO_NAME: "<artifactory url>"
cache:
paths:
- .m2/repository
- ./target/
stages:
- build
compile_commit:
stage: build
only:
- cr_integrate
before_script:
- git submodule sync --recursive
- git submodule update --init --recursive --remote
script:
- mvn -f pom.xml -s settings.xml $MAVEN_CLI_OPTS clean install $MAVEN_OPTS
- curl -i -u<username>:<token> -T "target/<artifact-1>.zip" "${REPO_NAME}/${CI_PIPELINE_ID}/<artifact-1>.zip"
- curl -i -u<username>:<token> -T "target/<artifact-1>.zip" "${REPO_NAME}/${CI_PIPELINE_ID}/<artifact-2>.zip"
- - curl -i -u<username>:<token> -T "target/<artifact-1>.zip" "${REPO_NAME}/${CI_PIPELINE_ID}/<artifact-3>.zip"
tags:
- <tagname>
如何使用 link 向某些人发送邮件?
我为此构建了一个解决方案,在此分享。
为此使用了以下工具:
- GitLab 发布 api
- Python-GitLab api
- Docker
- 微软团队
- 分享点
流程可以简述如下:
- 触发新管道
- 成功构建、代码扫描和发布后,发布作业为运行
- 发布作业使用 python 编写的脚本
python-gitlab api 使用 gitlab release api 创建一个版本。它
插入外部工件 links 用于下载工件
发布资产并将 link 添加到发布说明和其他文档中。
- GitLab 向适当的通知渠道发送发布邮件,
由 Microsoft Teams 和 Sharepoint 创建的组电子邮件 ID,以便
整个团队都会收到发布邮件。
python脚本如下:
import os
import gitlab
from datetime import datetime
if __name__ == '__main__':
access_token = os.environ['RELEASE_TOKEN']
gitlab_url = os.environ['GITLAB_URL']
project_id = int(os.environ['CI_PROJECT_ID'])
tag_name = os.environ['CI_PIPELINE_ID']
ref = os.environ['CI_COMMIT_REF_NAME']
# artifactory_links
artifactory_link = os.environ['ARTIFACTORY_PATH']
group_name = os.environ['GROUP_NAME']
project_name = os.environ['CI_PROJECT_NAME']
directory = f'{datetime.now():%Y%m%d}'
artifact_name = os.environ['ARTIFACT_NAME']
package_type = os.environ['PACKAGE_TYPE']
# artifacts_links
artifacts_links = f'{artifactory_link}/{group_name}/{project_name}/{directory}/{artifact_name}-{tag_name}.{package_type}'
# release note
release_note = os.environ['RELEASE_NOTE']
# authenticate with gitlab
gl = gitlab.Gitlab(gitlab_url, private_token=access_token)
gl.auth()
# obtain the project object by id
project = gl.projects.get(project_id)
# creating the project tags
project.tags.create({'tag_name': tag_name, 'ref': ref})
# creating the project releases
release = project.releases.create(
{
'name': f'Release for Pipeline ID {ref}',
'tag_name': tag_name,
'description': release_note,
'assets': {
'links': [{'name': artifact_name, 'url': artifacts_links}],
}
}
)
脚本需要以下环境变量:
- RELEASE_TOKEN – GitLab 访问令牌
- GITLAB_URL – GitLab 基础 URL.
- ARTIFACTORY_PATH – Artifactory 基地 URL.
- GROUP_NAME – 如果项目在一个组下。
- ARTIFACT_NAME – 工件名称
- PACKAGE_TYPE – 工件包类型
- RELEASE_NOTE – Link 发布说明和任何其他文档。
这些变量可以作为 GitLab CI 变量提供。如果有多个工件,python 脚本可以相应地修改。
由于在管道事件期间需要调用python脚本,并且在项目中添加脚本会修改项目代码库,因此docker化脚本是最好的解决方案。这样,它可以直接从 docker 集线器中拉出。 docker文件内容如下:
FROM python:3.7-alpine
COPY release_api.py /bin
RUN pip install python-gitlab
ENTRYPOINT ["/bin/release_api.py"]
CMD ["/bin/bash"]
为了向团队的每个成员发送发布邮件,无论他们个人的 GitLab 通知和订阅偏好如何,需要使用 Microsoft Teams 设置团队。在 Teams 应用程序中创建团队时,会创建相应的共享点站点以及团队电子邮件 ID。此设置需要一些时间。
创建团队后,在文件部分下,有一个选项可以在共享点中打开它(下面的屏幕截图)。
sharepoint 站点在左侧边栏中有一个 link,名为 Conversations。 Sharepoint 站点完全准备就绪后,单击此 link 将打开 Teams 电子邮件的收件箱。
在群组设置下,可以找到 编辑群组 选项,在那里可以找到群组电子邮件 ID。此组电子邮件 ID 将用于向团队中的每个人发送发布邮件。
在GitLab的用户设置下,需要添加群组邮箱。添加并验证邮件后,可以在 Notifications 下设置通知渠道。完成此操作后,该组(或项目)的所有通知都将发送到组邮件,团队中的每个人都会收到。最后 activity 是设置通知首选项,以便在有新版本可用时发送通知。
我正在尝试设置一个 GitLab CI 配置,该配置在管道的作业完成后将 link 工件发送到上传站点。管道基于 pom.xml 构建,然后使用 sonarqube 进行测试,然后使用 curl 将工件上传到特定的工件位置。工件目录的文件夹结构和 link 取决于 CI_PIPELINE_ID。在所有这些都成功之后,我需要将这个用于下载工件的 link 通过邮件发送给一个人的列表。我的 .gitlab-config.yml 如下所示:
image: maven:3.3.9-jdk-8
variables:
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
MAVEN_CLI_OPTS: "-U --batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"
REPO_NAME: "<artifactory url>"
cache:
paths:
- .m2/repository
- ./target/
stages:
- build
compile_commit:
stage: build
only:
- cr_integrate
before_script:
- git submodule sync --recursive
- git submodule update --init --recursive --remote
script:
- mvn -f pom.xml -s settings.xml $MAVEN_CLI_OPTS clean install $MAVEN_OPTS
- curl -i -u<username>:<token> -T "target/<artifact-1>.zip" "${REPO_NAME}/${CI_PIPELINE_ID}/<artifact-1>.zip"
- curl -i -u<username>:<token> -T "target/<artifact-1>.zip" "${REPO_NAME}/${CI_PIPELINE_ID}/<artifact-2>.zip"
- - curl -i -u<username>:<token> -T "target/<artifact-1>.zip" "${REPO_NAME}/${CI_PIPELINE_ID}/<artifact-3>.zip"
tags:
- <tagname>
如何使用 link 向某些人发送邮件?
我为此构建了一个解决方案,在此分享。
为此使用了以下工具:
- GitLab 发布 api
- Python-GitLab api
- Docker
- 微软团队
- 分享点
流程可以简述如下:
- 触发新管道
- 成功构建、代码扫描和发布后,发布作业为运行
- 发布作业使用 python 编写的脚本 python-gitlab api 使用 gitlab release api 创建一个版本。它 插入外部工件 links 用于下载工件 发布资产并将 link 添加到发布说明和其他文档中。
- GitLab 向适当的通知渠道发送发布邮件, 由 Microsoft Teams 和 Sharepoint 创建的组电子邮件 ID,以便 整个团队都会收到发布邮件。
python脚本如下:
import os
import gitlab
from datetime import datetime
if __name__ == '__main__':
access_token = os.environ['RELEASE_TOKEN']
gitlab_url = os.environ['GITLAB_URL']
project_id = int(os.environ['CI_PROJECT_ID'])
tag_name = os.environ['CI_PIPELINE_ID']
ref = os.environ['CI_COMMIT_REF_NAME']
# artifactory_links
artifactory_link = os.environ['ARTIFACTORY_PATH']
group_name = os.environ['GROUP_NAME']
project_name = os.environ['CI_PROJECT_NAME']
directory = f'{datetime.now():%Y%m%d}'
artifact_name = os.environ['ARTIFACT_NAME']
package_type = os.environ['PACKAGE_TYPE']
# artifacts_links
artifacts_links = f'{artifactory_link}/{group_name}/{project_name}/{directory}/{artifact_name}-{tag_name}.{package_type}'
# release note
release_note = os.environ['RELEASE_NOTE']
# authenticate with gitlab
gl = gitlab.Gitlab(gitlab_url, private_token=access_token)
gl.auth()
# obtain the project object by id
project = gl.projects.get(project_id)
# creating the project tags
project.tags.create({'tag_name': tag_name, 'ref': ref})
# creating the project releases
release = project.releases.create(
{
'name': f'Release for Pipeline ID {ref}',
'tag_name': tag_name,
'description': release_note,
'assets': {
'links': [{'name': artifact_name, 'url': artifacts_links}],
}
}
)
脚本需要以下环境变量:
- RELEASE_TOKEN – GitLab 访问令牌
- GITLAB_URL – GitLab 基础 URL.
- ARTIFACTORY_PATH – Artifactory 基地 URL.
- GROUP_NAME – 如果项目在一个组下。
- ARTIFACT_NAME – 工件名称
- PACKAGE_TYPE – 工件包类型
- RELEASE_NOTE – Link 发布说明和任何其他文档。
这些变量可以作为 GitLab CI 变量提供。如果有多个工件,python 脚本可以相应地修改。
由于在管道事件期间需要调用python脚本,并且在项目中添加脚本会修改项目代码库,因此docker化脚本是最好的解决方案。这样,它可以直接从 docker 集线器中拉出。 docker文件内容如下:
FROM python:3.7-alpine
COPY release_api.py /bin
RUN pip install python-gitlab
ENTRYPOINT ["/bin/release_api.py"]
CMD ["/bin/bash"]
为了向团队的每个成员发送发布邮件,无论他们个人的 GitLab 通知和订阅偏好如何,需要使用 Microsoft Teams 设置团队。在 Teams 应用程序中创建团队时,会创建相应的共享点站点以及团队电子邮件 ID。此设置需要一些时间。 创建团队后,在文件部分下,有一个选项可以在共享点中打开它(下面的屏幕截图)。
sharepoint 站点在左侧边栏中有一个 link,名为 Conversations。 Sharepoint 站点完全准备就绪后,单击此 link 将打开 Teams 电子邮件的收件箱。 在群组设置下,可以找到 编辑群组 选项,在那里可以找到群组电子邮件 ID。此组电子邮件 ID 将用于向团队中的每个人发送发布邮件。
在GitLab的用户设置下,需要添加群组邮箱。添加并验证邮件后,可以在 Notifications 下设置通知渠道。完成此操作后,该组(或项目)的所有通知都将发送到组邮件,团队中的每个人都会收到。最后 activity 是设置通知首选项,以便在有新版本可用时发送通知。