【问题标题】:How to send an email from GitLab CI pipeline's job?如何从 GitLab CI 管道的工作发送电子邮件?
【发布时间】:2020-04-29 08:54:58
【问题描述】:

我正在尝试设置 GitLab CI 配置,该配置在管道作业完成后发送一封电子邮件,其中包含指向上传站点的工件链接。该管道基于 pom.xml 构建,然后使用 sonarqube 进行测试,然后使用 curl 将工件上传到特定的工件位置。工件目录的文件夹结构和链接取决于 CI_PIPELINE_ID。在所有这些都成功之后,我需要通过邮件将此用于下载工件的链接发送到人员列表。我的 .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>

在此之后如何通过链接向某些人发送邮件?

【问题讨论】:

    标签: continuous-integration gitlab gitlab-ci pipeline


    【解决方案1】:

    我为此构建了一个解决方案,在这里分享。

    为此使用了以下工具:

    1. GitLab 发布 api
    2. Python-GitLab api
    3. 码头工人
    4. 微软团队
    5. 共享点

    流程可以概括如下:

    • 新的管道被触发
    • 成功构建、代码扫描和发布后,将运行发布作业
    • 发布作业使用在 python-gitlab api 使用 gitlab release api 创建一个版本。它 在下面插入用于下载工件的外部工件链接 发布资产并添加指向发布说明和其他文档的链接。
    • 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}],
                }
            }
        )
    

    脚本需要以下环境变量:

    1. RELEASE_TOKEN – GitLab 访问令牌
    2. GITLAB_URL – GitLab 基本 URL。
    3. ARTIFACTORY_PATH – Artifactory 基础 URL。
    4. GROUP_NAME – 如果项目属于某个组。
    5. ARTIFACT_NAME – 工件名称
    6. PACKAGE_TYPE – 工件包类型
    7. RELEASE_NOTE - 链接到发行说明和任何其他文档。

    这些变量可以作为 GitLab CI 变量提供。如果工件不止一个,可以相应修改python脚本。

    由于需要在管道事件期间调用 python 脚本,并且在项目中添加脚本会修改项目代码库,因此对脚本进行 dockerizing 是最好的解决方案。这样,它可以直接从 docker hub 中拉取。 dockerfile 内容如下:

    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 中打开它(下面的屏幕截图)。

    sharepoint 网站在左侧边栏中有一个名为Conversations 的链接。 Sharepoint 站点完全准备好后,单击此链接将打开 Teams 电子邮件的收件箱。 在组的设置下,可以找到选项编辑组,并在那里可以找到组电子邮件 ID。此群组电子邮件 ID 将用于向团队中的每个人发送发布邮件。

    在 GitLab 的用户设置下,需要添加群组邮箱。添加并验证邮件后,可以在通知下设置通知渠道。完成此操作后,该组(或项目)的所有通知都将发送到组邮件,并且团队中的每个人都会收到它们。剩下的最后一项活动是设置通知首选项,以便在有新版本可用时发送通知。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 2021-10-04
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 2020-04-24
      相关资源
      最近更新 更多